Skip to content

Commit 6f5655c

Browse files
author
Edison Su
committed
generalize storage orchestration: DataObjectManager will handle all the object life cycle management
1 parent f8e5740 commit 6f5655c

25 files changed

Lines changed: 927 additions & 232 deletions

File tree

engine/storage/image/src/org/apache/cloudstack/storage/image/ImageServiceImpl.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public AsyncCallFuture<CommandResult> createTemplateAsync(
7777
ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(template.getId(), template.getType(), store.getId(), store.getRole());
7878
TemplateInfo templateOnStore = null;
7979
if (obj == null) {
80-
templateOnStore = objectInDataStoreMgr.create(template, store);
80+
templateOnStore = (TemplateInfo)objectInDataStoreMgr.create(template, store);
8181
obj = objectInDataStoreMgr.findObject(template.getId(), template.getType(), store.getId(), store.getRole());
8282
} else {
8383
CommandResult result = new CommandResult();
@@ -87,7 +87,7 @@ public AsyncCallFuture<CommandResult> createTemplateAsync(
8787
}
8888

8989
try {
90-
objectInDataStoreMgr.update(templateOnStore, Event.CreateOnlyRequested);
90+
objectInDataStoreMgr.update(obj, Event.CreateOnlyRequested);
9191
} catch (NoTransitionException e) {
9292
s_logger.debug("failed to transit", e);
9393
CommandResult result = new CommandResult();
@@ -125,24 +125,24 @@ protected Void createTemplateCallback(AsyncCallbackDispatcher<ImageServiceImpl,
125125
future.complete(result);
126126
return null;
127127
}
128-
129-
ObjectInDataStoreVO obj = context.obj;
128+
ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(templateOnStore.getId(), templateOnStore.getType(), templateOnStore.getDataStore().getId(), templateOnStore.getDataStore().getRole());
130129
obj.setInstallPath(callbackResult.getPath());
131130

132131
if (callbackResult.getSize() != null) {
133132
obj.setSize(callbackResult.getSize());
134133
}
135134

136135
try {
137-
objectInDataStoreMgr.update(templateOnStore, Event.OperationSuccessed);
136+
objectInDataStoreMgr.update(obj, Event.OperationSuccessed);
138137
} catch (NoTransitionException e) {
139138
s_logger.debug("Failed to transit state", e);
140139
result.setResult(e.toString());
141140
future.complete(result);
142141
return null;
143142
}
144-
143+
145144
template.setImageStoreId(templateOnStore.getDataStore().getId());
145+
template.setSize(callbackResult.getSize());
146146
try {
147147
template.stateTransit(TemplateEvent.OperationSucceeded);
148148
} catch (NoTransitionException e) {

engine/storage/image/src/org/apache/cloudstack/storage/image/driver/DefaultImageDataStoreDriverImpl.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,15 @@
3434
import org.apache.cloudstack.storage.command.CreateObjectCommand;
3535
import org.apache.cloudstack.storage.endpoint.EndPointSelector;
3636
import org.apache.cloudstack.storage.image.ImageDataStoreDriver;
37+
import org.apache.cloudstack.storage.image.db.ImageDataDao;
38+
import org.apache.cloudstack.storage.image.db.ImageDataVO;
3739

3840
//http-read-only based image store
3941
public class DefaultImageDataStoreDriverImpl implements ImageDataStoreDriver {
4042
@Inject
4143
EndPointSelector selector;
44+
@Inject
45+
ImageDataDao imageDataDao;
4246
public DefaultImageDataStoreDriverImpl() {
4347
}
4448

@@ -81,10 +85,13 @@ public void createAsync(DataObject data,
8185
CreateObjectCommand createCmd = new CreateObjectCommand(data.getUri());
8286
CreateObjectAnswer answer = (CreateObjectAnswer)ep.sendMessage(createCmd);
8387
if (answer.getResult()) {
88+
//update imagestorevo
89+
8490
result = new CreateCmdResult(answer.getPath(), answer.getSize());
8591
} else {
8692
result.setResult(answer.getDetails());
8793
}
94+
8895
}
8996

9097
callback.complete(result);

engine/storage/image/src/org/apache/cloudstack/storage/image/store/HttpDataStoreImpl.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
3939

4040
import com.cloud.utils.component.ComponentContext;
41+
import com.cloud.utils.storage.encoding.EncodingType;
4142

4243

4344
public class HttpDataStoreImpl implements ImageDataStore {
@@ -100,11 +101,9 @@ public long getId() {
100101

101102
@Override
102103
public String getUri() {
103-
return this.imageDataStoreVO.getProtocol() + "://" + "?role=" + this.getRole();
104+
return this.imageDataStoreVO.getProtocol() + "://" + "?" + EncodingType.ROLE + "=" + this.getRole();
104105
}
105106

106-
107-
108107
@Override
109108
public Scope getScope() {
110109
// TODO Auto-generated method stub

engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
*/
1919
package org.apache.cloudstack.storage.image.store;
2020

21-
import java.io.File;
22-
2321
import javax.inject.Inject;
2422

2523
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
@@ -37,9 +35,11 @@
3735

3836
import com.cloud.utils.component.ComponentContext;
3937
import com.cloud.utils.fsm.NoTransitionException;
38+
import com.cloud.utils.storage.encoding.EncodingType;
4039

4140
public class TemplateObject implements TemplateInfo {
42-
private static final Logger s_logger = Logger.getLogger(TemplateObject.class);
41+
private static final Logger s_logger = Logger
42+
.getLogger(TemplateObject.class);
4343
private ImageDataVO imageVO;
4444
private DataStore dataStore;
4545
@Inject
@@ -51,22 +51,26 @@ public class TemplateObject implements TemplateInfo {
5151

5252
protected TemplateObject() {
5353
}
54-
54+
5555
protected void configure(ImageDataVO template, DataStore dataStore) {
5656
this.imageVO = template;
5757
this.dataStore = dataStore;
5858
}
59-
59+
6060
public static TemplateObject getTemplate(ImageDataVO vo, DataStore store) {
6161
TemplateObject to = ComponentContext.inject(TemplateObject.class);
6262
to.configure(vo, store);
6363
return to;
6464
}
65-
65+
6666
public void setImageStoreId(long id) {
6767
this.imageVO.setImageDataStoreId(id);
6868
}
6969

70+
public void setSize(Long size) {
71+
this.imageVO.setSize(size);
72+
}
73+
7074
public ImageDataVO getImage() {
7175
return this.imageVO;
7276
}
@@ -89,24 +93,40 @@ public String getUuid() {
8993

9094
@Override
9195
public String getUri() {
96+
ImageDataVO image = imageDao.findById(this.imageVO.getId());
9297
if (this.dataStore == null) {
93-
return this.imageVO.getUrl();
98+
return image.getUrl();
9499
} else {
95-
ObjectInDataStoreVO obj = ojbectInStoreMgr.findObject(this.imageVO.getId(), DataObjectType.TEMPLATE, this.dataStore.getId(), this.dataStore.getRole());
96-
if (obj.getState() != ObjectInDataStoreStateMachine.State.Ready) {
97-
return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.TEMPLATE + "&size=" + this.imageVO.getSize() + "&path=" + this.imageVO.getUrl();
100+
ObjectInDataStoreVO obj = ojbectInStoreMgr.findObject(
101+
this.imageVO.getId(), DataObjectType.TEMPLATE,
102+
this.dataStore.getId(), this.dataStore.getRole());
103+
StringBuilder builder = new StringBuilder();
104+
if (obj.getState() == ObjectInDataStoreStateMachine.State.Ready
105+
|| obj.getState() == ObjectInDataStoreStateMachine.State.Copying) {
106+
107+
builder.append(this.dataStore.getUri());
108+
builder.append("&" + EncodingType.OBJTYPE + "=" + DataObjectType.TEMPLATE);
109+
builder.append("&" + EncodingType.PATH + "=" + obj.getInstallPath());
110+
builder.append("&" + EncodingType.SIZE + "=" + image.getSize());
111+
return builder.toString();
98112
} else {
99-
return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.TEMPLATE + "&path=" + obj.getInstallPath();
113+
builder.append(this.dataStore.getUri());
114+
builder.append("&" + EncodingType.OBJTYPE + "=" + DataObjectType.TEMPLATE);
115+
builder.append("&" + EncodingType.SIZE + "=" + image.getSize());
116+
builder.append("&" + EncodingType.PATH + "=" + image.getUrl());
117+
return builder.toString();
100118
}
101119
}
102120
}
103121

104122
@Override
105123
public Long getSize() {
106124
if (this.dataStore == null) {
107-
return null;
125+
return this.imageVO.getSize();
108126
}
109-
ObjectInDataStoreVO obj = ojbectInStoreMgr.findObject(this.imageVO.getId(), DataObjectType.TEMPLATE, this.dataStore.getId(), this.dataStore.getRole());
127+
ObjectInDataStoreVO obj = ojbectInStoreMgr.findObject(
128+
this.imageVO.getId(), DataObjectType.TEMPLATE,
129+
this.dataStore.getId(), this.dataStore.getRole());
110130
return obj.getSize();
111131
}
112132

@@ -119,8 +139,11 @@ public DataObjectType getType() {
119139
public DiskFormat getFormat() {
120140
return DiskFormat.getFormat(this.imageVO.getFormat());
121141
}
122-
142+
123143
public boolean stateTransit(TemplateEvent e) throws NoTransitionException {
124-
return imageMgr.getStateMachine().transitTo(this.imageVO, e, null, imageDao);
144+
boolean result= imageMgr.getStateMachine().transitTo(this.imageVO, e, null,
145+
imageDao);
146+
this.imageVO = imageDao.findById(this.imageVO.getId());
147+
return result;
125148
}
126149
}

engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public boolean canHandle(DataObject srcData, DataObject destData) {
9393
|| srcStore.getRole() == DataStoreRole.ImageCache) {
9494
return true;
9595
}
96-
return false;
96+
return true;
9797
}
9898

9999
@Override
@@ -124,13 +124,14 @@ public Void copyAsync(DataObject srcData, DataObject destData,
124124

125125
protected Void copyAsyncCallback(AsyncCallbackDispatcher<DefaultImageMotionStrategy, Answer> callback, CreateTemplateContext<CopyCommandResult> context) {
126126
AsyncCompletionCallback<CopyCommandResult> parentCall = context.getParentCallback();
127-
CopyCmdAnswer answer = (CopyCmdAnswer)callback.getResult();
127+
Answer answer = (Answer)callback.getResult();
128128
if (!answer.getResult()) {
129129
CopyCommandResult result = new CopyCommandResult("");
130130
result.setResult(answer.getDetails());
131131
parentCall.complete(result);
132132
} else {
133-
CopyCommandResult result = new CopyCommandResult(answer.getPath());
133+
CopyCmdAnswer ans = (CopyCmdAnswer)answer;
134+
CopyCommandResult result = new CopyCommandResult(ans.getPath());
134135
parentCall.complete(result);
135136
}
136137
return null;

engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import org.apache.cloudstack.acl.APIChecker;
2020
import org.apache.cloudstack.engine.service.api.OrchestrationService;
2121
import org.apache.cloudstack.storage.HostEndpointRpcServer;
22-
import org.apache.cloudstack.storage.endpoint.DefaultEndPointSelector;
2322
import org.apache.cloudstack.storage.endpoint.EndPointSelector;
2423
import org.mockito.Mockito;
2524
import org.springframework.context.annotation.Bean;
@@ -28,6 +27,8 @@
2827
import com.cloud.cluster.ClusteredAgentRebalanceService;
2928
import com.cloud.cluster.agentlb.dao.HostTransferMapDao;
3029
import com.cloud.cluster.agentlb.dao.HostTransferMapDaoImpl;
30+
import com.cloud.configuration.dao.ConfigurationDao;
31+
import com.cloud.configuration.dao.ConfigurationDaoImpl;
3132
import com.cloud.dc.dao.ClusterDao;
3233
import com.cloud.dc.dao.ClusterDaoImpl;
3334
import com.cloud.dc.dao.DataCenterDao;
@@ -39,6 +40,8 @@
3940
import com.cloud.dc.dao.HostPodDao;
4041
import com.cloud.dc.dao.HostPodDaoImpl;
4142
import com.cloud.dc.dao.PodVlanDaoImpl;
43+
import com.cloud.domain.dao.DomainDao;
44+
import com.cloud.domain.dao.DomainDaoImpl;
4245
import com.cloud.host.dao.HostDao;
4346
import com.cloud.host.dao.HostDetailsDao;
4447
import com.cloud.host.dao.HostDetailsDaoImpl;
@@ -47,7 +50,10 @@
4750
import com.cloud.server.auth.UserAuthenticator;
4851
import com.cloud.storage.dao.StoragePoolHostDao;
4952
import com.cloud.storage.dao.StoragePoolHostDaoImpl;
50-
import com.cloud.utils.component.ComponentContext;
53+
import com.cloud.storage.dao.VMTemplateDetailsDao;
54+
import com.cloud.storage.dao.VMTemplateDetailsDaoImpl;
55+
import com.cloud.storage.dao.VMTemplateZoneDao;
56+
import com.cloud.storage.dao.VMTemplateZoneDaoImpl;
5157

5258
public class ChildTestConfiguration extends TestConfiguration {
5359

@@ -105,11 +111,22 @@ public HostTagsDao hostTagsDao() {
105111
@Bean StoragePoolHostDao storagePoolHostDao() {
106112
return new StoragePoolHostDaoImpl();
107113
}
108-
114+
@Bean VMTemplateZoneDao templateZoneDao() {
115+
return new VMTemplateZoneDaoImpl();
116+
}
117+
@Bean VMTemplateDetailsDao templateDetailsDao() {
118+
return new VMTemplateDetailsDaoImpl();
119+
}
120+
@Bean ConfigurationDao configDao() {
121+
return new ConfigurationDaoImpl();
122+
}
109123
@Bean
110124
public AgentManager agentMgr() {
111125
return new DirectAgentManagerSimpleImpl();
112126
}
127+
@Bean DomainDao domainDao() {
128+
return new DomainDaoImpl();
129+
}
113130

114131
@Bean
115132
public HostEndpointRpcServer rpcServer() {

engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockRpcCallBack.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@
1919
import javax.inject.Inject;
2020

2121
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
22+
import org.apache.log4j.Logger;
2223

2324
import com.cloud.agent.AgentManager;
2425
import com.cloud.agent.api.Answer;
2526
import com.cloud.agent.api.Command;
2627
import com.cloud.utils.db.DB;
27-
import com.cloud.utils.db.Transaction;
2828

2929
public class MockRpcCallBack implements Runnable {
30+
private static final Logger s_logger = Logger.getLogger(MockRpcCallBack.class);
3031
@Inject
3132
AgentManager agentMgr;
3233
private Command cmd;
@@ -50,12 +51,9 @@ public void setCallback(AsyncCompletionCallback<Answer> callback) {
5051
public void run() {
5152
try {
5253
Answer answer = agentMgr.send(hostId, cmd);
53-
5454
callback.complete(answer);
5555
} catch (Throwable e) {
56-
//s_logger.debug("send command failed:" + e.toString());
57-
} finally {
58-
int i =1;
56+
s_logger.debug("send command failed:", e);
5957
}
6058
}
6159

0 commit comments

Comments
 (0)