Skip to content

Commit 6f4abff

Browse files
committed
plugins-external: improve payload path
Signed-off-by: Abhishek Kumar <[email protected]>
1 parent 249c5ae commit 6f4abff

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

plugins/hypervisors/external/src/main/java/org/apache/cloudstack/hypervisor/external/provisioner/ExternalPathPayloadProvisioner.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.util.List;
3636
import java.util.Map;
3737
import java.util.Properties;
38+
import java.util.UUID;
3839
import java.util.concurrent.ExecutorService;
3940
import java.util.concurrent.Executors;
4041
import java.util.concurrent.Future;
@@ -784,8 +785,7 @@ protected void scheduleExtensionPayloadDirectoryCleanup(String extensionName) {
784785

785786
protected String prepareExternalPayload(String extensionName, Map<String, Object> details) throws IOException {
786787
String json = GsonHelper.getGson().toJson(details);
787-
long epochMillis = System.currentTimeMillis();
788-
String fileName = epochMillis + ".json";
788+
String fileName = UUID.randomUUID() + ".json";
789789
String extensionPayloadDir = extensionsDataDirectory + File.separator + extensionName;
790790
Path payloadDirPath = Paths.get(extensionPayloadDir);
791791
if (!Files.exists(payloadDirPath)) {

plugins/hypervisors/external/src/test/java/org/apache/cloudstack/hypervisor/external/provisioner/ExternalPathPayloadProvisionerTest.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import static org.mockito.ArgumentMatchers.anyLong;
2929
import static org.mockito.ArgumentMatchers.anyMap;
3030
import static org.mockito.ArgumentMatchers.anyString;
31+
import static org.mockito.ArgumentMatchers.eq;
32+
import static org.mockito.Mockito.doNothing;
3133
import static org.mockito.Mockito.doReturn;
3234
import static org.mockito.Mockito.mock;
3335
import static org.mockito.Mockito.when;
@@ -36,6 +38,8 @@
3638
import java.io.IOException;
3739
import java.nio.file.Files;
3840
import java.nio.file.Path;
41+
import java.nio.file.Paths;
42+
import java.nio.file.StandardOpenOption;
3943
import java.util.ArrayList;
4044
import java.util.HashMap;
4145
import java.util.List;
@@ -622,4 +626,53 @@ public void deleteExtensionPayloadFile_DoesNothing_WhenActionIsNotTrivial() {
622626
Mockito.verify(logger, Mockito.never()).trace(anyString(), any(), any(), any(), any());
623627
}
624628
}
629+
630+
@Test
631+
public void prepareExternalPayloadCreatesFileInNewDirectory() throws IOException {
632+
String extensionName = "test-extension";
633+
Map<String, Object> details = Map.of("key", "value");
634+
String result = provisioner.prepareExternalPayload(extensionName, details);
635+
assertNotNull(result);
636+
Path payloadFile = Paths.get(result);
637+
assertTrue(Files.exists(payloadFile));
638+
assertTrue(Files.isRegularFile(payloadFile));
639+
assertEquals("{\"key\":\"value\"}", Files.readString(payloadFile));
640+
}
641+
642+
@Test
643+
public void prepareExternalPayloadCreatesFileInExistingDirectory() throws IOException {
644+
String extensionName = "test-extension";
645+
Map<String, Object> details = Map.of("key", "value");
646+
Path existingDir = Paths.get(tempDataDir.getAbsolutePath(), extensionName);
647+
Files.createDirectories(existingDir);
648+
doNothing().when(provisioner).scheduleExtensionPayloadDirectoryCleanup(extensionName);
649+
String result = provisioner.prepareExternalPayload(extensionName, details);
650+
assertNotNull(result);
651+
Path payloadFile = Paths.get(result);
652+
assertTrue(Files.exists(payloadFile));
653+
assertTrue(Files.isRegularFile(payloadFile));
654+
assertEquals("{\"key\":\"value\"}", Files.readString(payloadFile));
655+
}
656+
657+
@Test
658+
public void prepareExternalPayloadSchedulesCleanupForExistingDirectory() throws IOException {
659+
String extensionName = "test-extension";
660+
Map<String, Object> details = Map.of("key", "value");
661+
Path existingDir = Paths.get(tempDataDir.getAbsolutePath(), extensionName);
662+
Files.createDirectories(existingDir);
663+
doNothing().when(provisioner).scheduleExtensionPayloadDirectoryCleanup(extensionName);
664+
provisioner.prepareExternalPayload(extensionName, details);
665+
}
666+
667+
@Test(expected = IOException.class)
668+
public void prepareExternalPayloadThrowsExceptionWhenFileCannotBeWritten() throws IOException {
669+
String extensionName = "test-extension";
670+
Map<String, Object> details = Map.of("key", "value");
671+
Path existingDir = Paths.get(tempDataDir.getAbsolutePath(), extensionName);
672+
Files.createDirectories(existingDir);
673+
try (MockedStatic<Files> filesMock = Mockito.mockStatic(Files.class)) {
674+
filesMock.when(() -> Files.writeString(any(Path.class), anyString(), eq(StandardOpenOption.CREATE_NEW))).thenThrow(IOException.class);
675+
provisioner.prepareExternalPayload(extensionName, details);
676+
}
677+
}
625678
}

0 commit comments

Comments
 (0)