Skip to content

Commit b1dac54

Browse files
committed
Create boilerplate to allow download of screenshot when using vmware
1 parent c95146f commit b1dac54

4 files changed

Lines changed: 148 additions & 5 deletions

File tree

server/src/main/java/org/apache/cloudstack/backup/InternalBackupServiceImpl.java

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

2121
import com.cloud.agent.api.Command;
2222
import com.cloud.agent.api.to.DataTO;
23+
import com.cloud.hypervisor.Hypervisor;
2324
import com.cloud.storage.DataStoreRole;
2425
import com.cloud.storage.Storage;
2526
import com.cloud.storage.Upload;
@@ -49,6 +50,7 @@
4950
import org.apache.cloudstack.backup.dao.BackupDetailsDao;
5051
import org.apache.cloudstack.backup.dao.InternalBackupJoinDao;
5152
import org.apache.cloudstack.backup.dao.InternalBackupStoragePoolDao;
53+
import org.apache.cloudstack.backup.to.BackupScreenshotObject;
5254
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
5355
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
5456
import org.apache.cloudstack.jobs.JobInfo;
@@ -57,6 +59,7 @@
5759
import org.apache.cloudstack.storage.datastore.db.ImageStoreObjectDownloadDao;
5860
import org.apache.cloudstack.storage.datastore.db.ImageStoreObjectDownloadVO;
5961
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
62+
import org.apache.cloudstack.backup.to.BackupScreenshotTO;
6063
import org.apache.cloudstack.storage.to.VolumeObjectTO;
6164
import org.apache.commons.collections4.CollectionUtils;
6265
import org.apache.logging.log4j.LogManager;
@@ -273,7 +276,9 @@ public ExtractResponse downloadScreenshot(long backupId) {
273276
ImageStoreObjectDownloadVO imageStoreObj = imageStoreObjectDownloadDao.findByStoreIdAndPath(Long.parseLong(imageStoreId.getValue()), screenshotPath);
274277

275278
if (imageStoreObj == null) {
276-
String downloadUrl = imageStore.createEntityExtractUrl(screenshotPath, Storage.ImageFormat.PNG, null);
279+
BackupScreenshotTO dataTo = new BackupScreenshotTO(imageStore.getTO(), Hypervisor.HypervisorType.KVM, screenshotPath);
280+
BackupScreenshotObject objectTo = new BackupScreenshotObject(dataTo, imageStore);
281+
String downloadUrl = imageStore.createEntityExtractUrl(screenshotPath, Storage.ImageFormat.PNG, objectTo);
277282
imageStoreObj = imageStoreObjectDownloadDao.persist(new ImageStoreObjectDownloadVO(imageStore.getId(), screenshotPath, downloadUrl));
278283
}
279284

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package org.apache.cloudstack.backup.to;
2+
3+
import com.cloud.agent.api.Answer;
4+
import com.cloud.agent.api.to.DataObjectType;
5+
import com.cloud.agent.api.to.DataTO;
6+
import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
7+
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
8+
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
9+
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;import java.util.UUID;
10+
11+
public class BackupScreenshotObject implements DataObject {
12+
13+
private DataTO dataTO;
14+
private DataStore dataStore;
15+
16+
public BackupScreenshotObject(DataTO dataTO, DataStore dataStore) {
17+
this.dataTO = dataTO;
18+
this.dataStore = dataStore;
19+
}
20+
21+
@Override
22+
public String toString() {
23+
return String.format("BackupScreenshotObject %s", ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "dataTO", "dataStore"));
24+
}
25+
26+
@Override
27+
public long getId() {
28+
return 0;
29+
}
30+
31+
@Override
32+
public String getUri() {
33+
return null;
34+
}
35+
36+
@Override
37+
public DataTO getTO() {
38+
return dataTO;
39+
}
40+
41+
@Override
42+
public DataStore getDataStore() {
43+
return dataStore;
44+
}
45+
46+
@Override
47+
public Long getSize() {
48+
return null;
49+
}
50+
51+
@Override
52+
public long getPhysicalSize() {
53+
return 0;
54+
}
55+
56+
@Override
57+
public DataObjectType getType() {
58+
return dataTO.getObjectType();
59+
}
60+
61+
@Override
62+
public String getUuid() {
63+
return null;
64+
}
65+
66+
@Override
67+
public boolean delete() {
68+
return false;
69+
}
70+
71+
@Override
72+
public void processEvent(ObjectInDataStoreStateMachine.Event event) {
73+
}
74+
75+
@Override
76+
public void processEvent(ObjectInDataStoreStateMachine.Event event, Answer answer) {
77+
}
78+
79+
@Override
80+
public void incRefCount() {
81+
}
82+
83+
@Override
84+
public void decRefCount() {
85+
}
86+
87+
@Override
88+
public Long getRefCount() {
89+
return null;
90+
}
91+
92+
@Override
93+
public String getName() {
94+
return UUID.randomUUID().toString();
95+
}
96+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.apache.cloudstack.backup.to;
2+
3+
import com.cloud.agent.api.to.DataObjectType;
4+
import com.cloud.agent.api.to.DataStoreTO;
5+
import com.cloud.agent.api.to.DataTO;
6+
import com.cloud.hypervisor.Hypervisor;
7+
8+
public class BackupScreenshotTO implements DataTO {
9+
DataStoreTO dataStoreTO;
10+
Hypervisor.HypervisorType hypervisor;
11+
String path;
12+
13+
public BackupScreenshotTO(DataStoreTO dataStoreTO, Hypervisor.HypervisorType hypervisor, String path) {
14+
this.dataStoreTO = dataStoreTO;
15+
this.hypervisor = hypervisor;
16+
this.path = path;
17+
}
18+
19+
@Override
20+
public DataObjectType getObjectType() {
21+
return DataObjectType.ARCHIVE;
22+
}
23+
24+
@Override
25+
public DataStoreTO getDataStore() {
26+
return dataStoreTO;
27+
}
28+
29+
@Override
30+
public Hypervisor.HypervisorType getHypervisorType() {
31+
return hypervisor;
32+
}
33+
34+
@Override
35+
public String getPath() {
36+
return path;
37+
}
38+
39+
@Override
40+
public long getId() {
41+
return 0;
42+
}
43+
}

server/src/test/java/org/apache/cloudstack/backup/InternalBackupServiceImplTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.junit.Assert.assertTrue;
2121
import static org.mockito.ArgumentMatchers.anyLong;
2222
import static org.mockito.ArgumentMatchers.anyString;
23+
import static org.mockito.ArgumentMatchers.eq;
2324
import static org.mockito.Mockito.any;
2425
import static org.mockito.Mockito.doNothing;
2526
import static org.mockito.Mockito.doReturn;
@@ -461,7 +462,6 @@ public void downloadScreenshotTestImageStoreObjectMissingButPersistSucceedsRetur
461462
doReturn(imageStoreEntityMock).when(dataStoreMgrMock).getDataStore(IMAGE_STORE_ID, DataStoreRole.Image);
462463
doReturn(null).when(imageStoreObjectDownloadDaoMock).findByStoreIdAndPath(IMAGE_STORE_ID, SCREENSHOT_PATH);
463464
doReturn(123L).when(imageStoreEntityMock).getId();
464-
doReturn("http://download/url").when(imageStoreEntityMock).createEntityExtractUrl(SCREENSHOT_PATH, Storage.ImageFormat.PNG, null);
465465
doReturn(imageStoreObjectDownloadVoMock).when(imageStoreObjectDownloadDaoMock).persist(any(ImageStoreObjectDownloadVO.class));
466466
doReturn("http://download/url").when(imageStoreObjectDownloadVoMock).getDownloadUrl();
467467

@@ -470,7 +470,7 @@ public void downloadScreenshotTestImageStoreObjectMissingButPersistSucceedsRetur
470470
verify(backupDetailDaoMock).findDetail(BACKUP_ID, BackupDetailsDao.SCREENSHOT_PATH);
471471
verify(backupDetailDaoMock).findDetail(BACKUP_ID, BackupDetailsDao.IMAGE_STORE_ID);
472472
verify(imageStoreObjectDownloadDaoMock).findByStoreIdAndPath(IMAGE_STORE_ID, SCREENSHOT_PATH);
473-
verify(imageStoreEntityMock).createEntityExtractUrl(SCREENSHOT_PATH, Storage.ImageFormat.PNG, null);
473+
verify(imageStoreEntityMock).createEntityExtractUrl(eq(SCREENSHOT_PATH), eq(Storage.ImageFormat.PNG), any());
474474
verify(imageStoreObjectDownloadDaoMock).persist(any(ImageStoreObjectDownloadVO.class));
475475
assertEquals("http://download/url", result.getUrl());
476476
assertEquals("screenshot.png", result.getName());
@@ -486,15 +486,14 @@ public void downloadScreenshotTestImageStoreObjectMissingAndPersistReturnsNullRe
486486
doReturn(imageStoreEntityMock).when(dataStoreMgrMock).getDataStore(IMAGE_STORE_ID, DataStoreRole.Image);
487487
doReturn(null).when(imageStoreObjectDownloadDaoMock).findByStoreIdAndPath(IMAGE_STORE_ID, SCREENSHOT_PATH);
488488
doReturn(123L).when(imageStoreEntityMock).getId();
489-
doReturn("http://download/url").when(imageStoreEntityMock).createEntityExtractUrl(SCREENSHOT_PATH, Storage.ImageFormat.PNG, null);
490489
doReturn(null).when(imageStoreObjectDownloadDaoMock).persist(any(ImageStoreObjectDownloadVO.class));
491490

492491
ExtractResponse result = internalBackupServiceImplSpy.downloadScreenshot(BACKUP_ID);
493492

494493
verify(backupDetailDaoMock).findDetail(BACKUP_ID, BackupDetailsDao.SCREENSHOT_PATH);
495494
verify(backupDetailDaoMock).findDetail(BACKUP_ID, BackupDetailsDao.IMAGE_STORE_ID);
496495
verify(imageStoreObjectDownloadDaoMock).findByStoreIdAndPath(IMAGE_STORE_ID, SCREENSHOT_PATH);
497-
verify(imageStoreEntityMock).createEntityExtractUrl(SCREENSHOT_PATH, Storage.ImageFormat.PNG, null);
496+
verify(imageStoreEntityMock).createEntityExtractUrl(eq(SCREENSHOT_PATH), eq(Storage.ImageFormat.PNG), any());
498497
verify(imageStoreObjectDownloadDaoMock).persist(any(ImageStoreObjectDownloadVO.class));
499498
org.junit.Assert.assertNull(result.getUrl());
500499
org.junit.Assert.assertNull(result.getName());

0 commit comments

Comments
 (0)