Skip to content

Commit c921118

Browse files
author
Edison Su
committed
add image create test case
1 parent aa7b3e0 commit c921118

24 files changed

Lines changed: 313 additions & 67 deletions

File tree

engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CreateCmdResult.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,18 @@
2020

2121
public class CreateCmdResult extends CommandResult {
2222
private String path;
23-
public CreateCmdResult(String path) {
23+
private Long size;
24+
public CreateCmdResult(String path, Long size) {
2425
super();
2526
this.path = path;
27+
this.size = size;
2628
}
2729

2830
public String getPath() {
2931
return this.path;
3032
}
33+
34+
public Long getSize() {
35+
return this.size;
36+
}
3137
}

engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public interface DataObject {
2424
public long getId();
2525
public String getUri();
2626
public DataStore getDataStore();
27-
public long getSize();
27+
public Long getSize();
2828
public DataObjectType getType();
2929
public DiskFormat getFormat();
3030
public String getUuid();

engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/ScopeType.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,7 @@
2121
public enum ScopeType {
2222
HOST,
2323
CLUSTER,
24-
ZONE;
24+
ZONE,
25+
REGION,
26+
GLOBAL;
2527
}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,17 @@ public class ImageDataFactoryImpl implements ImageDataFactory {
4040
DataStoreManager storeMgr;
4141
@Override
4242
public TemplateInfo getTemplate(long templateId, DataStore store) {
43+
ImageDataVO templ = imageDataDao.findById(templateId);
44+
if (store == null) {
45+
TemplateObject tmpl = TemplateObject.getTemplate(templ, null);
46+
return tmpl;
47+
}
4348
ObjectInDataStoreVO obj = objMap.findObject(templateId, DataObjectType.TEMPLATE, store.getId(), store.getRole());
4449
if (obj == null) {
45-
return null;
50+
TemplateObject tmpl = TemplateObject.getTemplate(templ, null);
51+
return tmpl;
4652
}
47-
ImageDataVO templ = imageDataDao.findById(templateId);
53+
4854
TemplateObject tmpl = TemplateObject.getTemplate(templ, store);
4955
return tmpl;
5056
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ public AsyncCallFuture<CommandResult> createTemplateAsync(
7878
TemplateInfo templateOnStore = null;
7979
if (obj == null) {
8080
templateOnStore = objectInDataStoreMgr.create(template, store);
81+
obj = objectInDataStoreMgr.findObject(template.getId(), template.getType(), store.getId(), store.getRole());
8182
} else {
8283
CommandResult result = new CommandResult();
8384
result.setResult("duplicate template on the storage");
@@ -128,6 +129,10 @@ protected Void createTemplateCallback(AsyncCallbackDispatcher<ImageServiceImpl,
128129
ObjectInDataStoreVO obj = context.obj;
129130
obj.setInstallPath(callbackResult.getPath());
130131

132+
if (callbackResult.getSize() != null) {
133+
obj.setSize(callbackResult.getSize());
134+
}
135+
131136
try {
132137
objectInDataStoreMgr.update(templateOnStore, Event.OperationSuccessed);
133138
} catch (NoTransitionException e) {

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

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
import java.util.Set;
2222

23+
import javax.inject.Inject;
24+
2325
import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
2426
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
2527
import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
@@ -28,11 +30,15 @@
2830
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
2931
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
3032
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
33+
import org.apache.cloudstack.storage.command.CreateObjectAnswer;
34+
import org.apache.cloudstack.storage.command.CreateObjectCommand;
35+
import org.apache.cloudstack.storage.endpoint.EndPointSelector;
3136
import org.apache.cloudstack.storage.image.ImageDataStoreDriver;
3237

3338
//http-read-only based image store
3439
public class DefaultImageDataStoreDriverImpl implements ImageDataStoreDriver {
35-
40+
@Inject
41+
EndPointSelector selector;
3642
public DefaultImageDataStoreDriverImpl() {
3743
}
3844

@@ -57,10 +63,28 @@ public Set<DataObject> listObjects(DataStore store) {
5763
public void createAsync(DataObject data,
5864
AsyncCompletionCallback<CreateCmdResult> callback) {
5965
//for default http data store, can create http based template/iso
60-
CreateCmdResult result = new CreateCmdResult("");
66+
CreateCmdResult result = new CreateCmdResult("", null);
6167
if (!data.getUri().startsWith("http")) {
6268
result.setResult("can't register an image which is not a http link");
6369
callback.complete(result);
70+
return;
71+
}
72+
73+
if (data.getSize() == null && data.getType() == DataObjectType.TEMPLATE) {
74+
//the template size is unknown during registration, need to find out the size of template
75+
EndPoint ep = selector.select(data);
76+
if (ep == null) {
77+
result.setResult("can't find storage client for:" + data.getId() + "," + data.getType());
78+
callback.complete(result);
79+
return;
80+
}
81+
CreateObjectCommand createCmd = new CreateObjectCommand(data.getUri());
82+
CreateObjectAnswer answer = (CreateObjectAnswer)ep.sendMessage(createCmd);
83+
if (answer.getResult()) {
84+
result = new CreateCmdResult(answer.getPath(), answer.getSize());
85+
} else {
86+
result.setResult(answer.getDetails());
87+
}
6488
}
6589

6690
callback.complete(result);

engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataManagerImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@
2121
import org.apache.cloudstack.storage.image.TemplateEvent;
2222
import org.apache.cloudstack.storage.image.TemplateState;
2323
import org.apache.cloudstack.storage.image.db.ImageDataVO;
24+
import org.springframework.stereotype.Component;
2425

2526
import com.cloud.utils.fsm.StateMachine2;
2627

28+
@Component
2729
public class ImageDataManagerImpl implements ImageDataManager {
28-
private final static StateMachine2<TemplateState, TemplateEvent, ImageDataVO>
30+
private final StateMachine2<TemplateState, TemplateEvent, ImageDataVO>
2931
stateMachine = new StateMachine2<TemplateState, TemplateEvent, ImageDataVO>();
3032

3133
public ImageDataManagerImpl() {

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,16 @@ public class HttpDataStoreImpl implements ImageDataStore {
4545
ImageDataDao imageDao;
4646
@Inject
4747
private ObjectInDataStoreManager objectInStoreMgr;
48-
ImageDataStoreDriver driver;
49-
ImageDataStoreVO imageDataStoreVO;
50-
ImageDataStoreProvider provider;
48+
protected ImageDataStoreDriver driver;
49+
protected ImageDataStoreVO imageDataStoreVO;
50+
protected ImageDataStoreProvider provider;
5151
boolean needDownloadToCacheStorage = false;
5252

53-
private HttpDataStoreImpl(ImageDataStoreVO dataStoreVO, ImageDataStoreDriver imageDataStoreDriver,
53+
protected HttpDataStoreImpl() {
54+
55+
}
56+
57+
protected void configure(ImageDataStoreVO dataStoreVO, ImageDataStoreDriver imageDataStoreDriver,
5458
ImageDataStoreProvider provider) {
5559
this.driver = imageDataStoreDriver;
5660
this.imageDataStoreVO = dataStoreVO;
@@ -59,8 +63,9 @@ private HttpDataStoreImpl(ImageDataStoreVO dataStoreVO, ImageDataStoreDriver ima
5963

6064
public static HttpDataStoreImpl getDataStore(ImageDataStoreVO dataStoreVO, ImageDataStoreDriver imageDataStoreDriver,
6165
ImageDataStoreProvider provider) {
62-
HttpDataStoreImpl instance = new HttpDataStoreImpl(dataStoreVO, imageDataStoreDriver, provider);
63-
return ComponentContext.inject(instance);
66+
HttpDataStoreImpl instance = (HttpDataStoreImpl)ComponentContext.inject(HttpDataStoreImpl.class);
67+
instance.configure(dataStoreVO, imageDataStoreDriver, provider);
68+
return instance;
6469
}
6570

6671
@Override

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,18 @@ public class TemplateObject implements TemplateInfo {
4949
@Inject
5050
ObjectInDataStoreManager ojbectInStoreMgr;
5151

52-
private TemplateObject(ImageDataVO template, DataStore dataStore) {
52+
protected TemplateObject() {
53+
}
54+
55+
protected void configure(ImageDataVO template, DataStore dataStore) {
5356
this.imageVO = template;
5457
this.dataStore = dataStore;
5558
}
5659

5760
public static TemplateObject getTemplate(ImageDataVO vo, DataStore store) {
58-
TemplateObject to = new TemplateObject(vo, store);
59-
return ComponentContext.inject(to);
61+
TemplateObject to = ComponentContext.inject(TemplateObject.class);
62+
to.configure(vo, store);
63+
return to;
6064
}
6165

6266
public void setImageStoreId(long id) {
@@ -90,17 +94,20 @@ public String getUri() {
9094
} else {
9195
ObjectInDataStoreVO obj = ojbectInStoreMgr.findObject(this.imageVO.getId(), DataObjectType.TEMPLATE, this.dataStore.getId(), this.dataStore.getRole());
9296
if (obj.getState() != ObjectInDataStoreStateMachine.State.Ready) {
93-
return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.TEMPLATE + "&size=" + this.imageVO.getSize();
97+
return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.TEMPLATE + "&size=" + this.imageVO.getSize() + "&path=" + this.imageVO.getUrl();
9498
} else {
9599
return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.TEMPLATE + "&path=" + obj.getInstallPath();
96100
}
97101
}
98102
}
99103

100104
@Override
101-
public long getSize() {
102-
// TODO Auto-generated method stub
103-
return 0;
105+
public Long getSize() {
106+
if (this.dataStore == null) {
107+
return null;
108+
}
109+
ObjectInDataStoreVO obj = ojbectInStoreMgr.findObject(this.imageVO.getId(), DataObjectType.TEMPLATE, this.dataStore.getId(), this.dataStore.getRole());
110+
return obj.getSize();
104111
}
105112

106113
@Override

engine/storage/image/src/org/apache/cloudstack/storage/image/store/lifecycle/DefaultImageDataStoreLifeCycle.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,26 @@
2323
import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
2424
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
2525
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
26+
import org.apache.cloudstack.storage.image.datastore.ImageDataStoreHelper;
27+
import org.apache.cloudstack.storage.image.datastore.ImageDataStoreManager;
2628
import org.apache.cloudstack.storage.image.db.ImageDataStoreDao;
29+
import org.apache.cloudstack.storage.image.db.ImageDataStoreVO;
2730

2831
public class DefaultImageDataStoreLifeCycle implements ImageDataStoreLifeCycle {
2932
@Inject
3033
protected ImageDataStoreDao imageStoreDao;
31-
34+
@Inject
35+
ImageDataStoreHelper imageStoreHelper;
36+
@Inject
37+
ImageDataStoreManager imageStoreMgr;
3238
public DefaultImageDataStoreLifeCycle() {
3339
}
3440

3541

3642
@Override
3743
public DataStore initialize(Map<String, String> dsInfos) {
38-
// TODO Auto-generated method stub
39-
return null;
44+
ImageDataStoreVO ids = imageStoreHelper.createImageDataStore(dsInfos);
45+
return imageStoreMgr.getImageDataStore(ids.getId());
4046
}
4147

4248

0 commit comments

Comments
 (0)