Thanks to visit codestin.com
Credit goes to github.com

Skip to content

enhancement: add password to configdrive vendor_data.json #10061

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: 4.20
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,26 @@

File openStackFolder = new File(tempDirName + ConfigDrive.openStackConfigDriveName);

writeVendorEmptyJsonFile(openStackFolder);
/*
Try to find VM password in the vmData.
If it is found, then write it into vendor-data.json
*/
String vmPassword = "";
for (String[] item : vmData) {
String dataType = item[CONFIGDATA_DIR];
String fileName = item[CONFIGDATA_FILE];
String content = item[CONFIGDATA_CONTENT];

Check warning on line 137 in engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java

View check run for this annotation

Codecov / codecov/patch

engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java#L135-L137

Added lines #L135 - L137 were not covered by tests
if (PASSWORD_FILE.equals(fileName)) {
vmPassword = content;
break;

Check warning on line 140 in engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java

View check run for this annotation

Codecov / codecov/patch

engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java#L139-L140

Added lines #L139 - L140 were not covered by tests
}
}

Check warning on line 142 in engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java

View check run for this annotation

Codecov / codecov/patch

engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java#L142

Added line #L142 was not covered by tests
if (vmPassword.equals("")) {
writeVendorDataJsonFile(openStackFolder);
} else {
writeVendorDataJsonFile(openStackFolder, vmPassword);

Check warning on line 146 in engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java

View check run for this annotation

Codecov / codecov/patch

engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java#L146

Added line #L146 was not covered by tests
}

writeNetworkData(nics, supportedServices, openStackFolder);
for (NicProfile nic: nics) {
if (supportedServices.get(nic.getId()).contains(Network.Service.UserData)) {
Expand Down Expand Up @@ -253,14 +272,34 @@
*
* If the folder does not exist, and we cannot create it, we throw a {@link CloudRuntimeException}.
*/
static void writeVendorEmptyJsonFile(File openStackFolder) {
static void writeVendorDataJsonFile(File openStackFolder) {
if (openStackFolder.exists() || openStackFolder.mkdirs()) {
writeFile(openStackFolder, "vendor_data.json", "{}");
} else {
throw new CloudRuntimeException("Failed to create folder " + openStackFolder);
}
}

/**
* Writes vendor data containing Cloudstack-generated password into vendor-data.json
*
* If the folder does not exist, and we cannot create it, we throw a {@link CloudRuntimeException}.
*/
static void writeVendorDataJsonFile(File openStackFolder, String password) {

Check warning on line 288 in engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java

View check run for this annotation

Codecov / codecov/patch

engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java#L288

Added line #L288 was not covered by tests
if (openStackFolder.exists() || openStackFolder.mkdirs()) {
writeFile(

Check warning on line 290 in engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java

View check run for this annotation

Codecov / codecov/patch

engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java#L290

Added line #L290 was not covered by tests
openStackFolder,
"vendor_data.json",
String.format(

Check warning on line 293 in engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java

View check run for this annotation

Codecov / codecov/patch

engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java#L293

Added line #L293 was not covered by tests
"{\"cloud-init\": \"#cloud-config\\npassword: %s\\nchpasswd:\\n expire: False\"}",
password
)
);
} else {
throw new CloudRuntimeException("Failed to create folder " + openStackFolder);

Check warning on line 299 in engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java

View check run for this annotation

Codecov / codecov/patch

engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java#L299

Added line #L299 was not covered by tests
}
}

Check warning on line 301 in engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java

View check run for this annotation

Codecov / codecov/patch

engine/storage/configdrive/src/main/java/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java#L301

Added line #L301 was not covered by tests

/**
* Creates the {@link JsonObject} with VM's metadata. The vmData is a list of arrays; we expect this list to have the following entries:
* <ul>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ public void buildConfigDriveTestNoVmDataAndNic() {
@Test(expected = CloudRuntimeException.class)
public void buildConfigDriveTestIoException() {
try (MockedStatic<ConfigDriveBuilder> configDriveBuilderMocked = Mockito.mockStatic(ConfigDriveBuilder.class)) {
configDriveBuilderMocked.when(() -> ConfigDriveBuilder.writeVendorEmptyJsonFile(nullable(File.class))).thenThrow(CloudRuntimeException.class);
configDriveBuilderMocked.when(() -> ConfigDriveBuilder.writeVendorDataJsonFile(nullable(File.class))).thenThrow(CloudRuntimeException.class);
Mockito.when(ConfigDriveBuilder.buildConfigDrive(null, new ArrayList<>(), "teste", "C:", null, supportedServices)).thenCallRealMethod();
ConfigDriveBuilder.buildConfigDrive(null, new ArrayList<>(), "teste", "C:", null, supportedServices);
}
Expand All @@ -144,7 +144,7 @@ public void buildConfigDriveTestIoException() {
public void buildConfigDriveTest() {
try (MockedStatic<ConfigDriveBuilder> configDriveBuilderMocked = Mockito.mockStatic(ConfigDriveBuilder.class)) {

configDriveBuilderMocked.when(() -> ConfigDriveBuilder.writeVendorEmptyJsonFile(Mockito.any(File.class))).then(invocationOnMock -> null);
configDriveBuilderMocked.when(() -> ConfigDriveBuilder.writeVendorDataJsonFile(Mockito.any(File.class))).then(invocationOnMock -> null);

configDriveBuilderMocked.when(() -> ConfigDriveBuilder.writeVmMetadata(Mockito.anyList(), Mockito.anyString(), Mockito.any(File.class), anyMap())).then(invocationOnMock -> null);

Expand All @@ -163,7 +163,7 @@ public void buildConfigDriveTest() {
Assert.assertEquals("mockIsoDataBase64", returnedIsoData);

configDriveBuilderMocked.verify(() -> {
ConfigDriveBuilder.writeVendorEmptyJsonFile(Mockito.any(File.class));
ConfigDriveBuilder.writeVendorDataJsonFile(Mockito.any(File.class));
ConfigDriveBuilder.writeVmMetadata(Mockito.anyList(), Mockito.anyString(), Mockito.any(File.class), anyMap());
ConfigDriveBuilder.linkUserData(Mockito.anyString());
ConfigDriveBuilder.generateAndRetrieveIsoAsBase64Iso(Mockito.anyString(), Mockito.anyString(), Mockito.anyString());
Expand All @@ -172,33 +172,33 @@ public void buildConfigDriveTest() {
}

@Test(expected = CloudRuntimeException.class)
public void writeVendorEmptyJsonFileTestCannotCreateOpenStackFolder() {
public void writeVendorDataJsonFileTestCannotCreateOpenStackFolder() {
File folderFileMock = Mockito.mock(File.class);
Mockito.doReturn(false).when(folderFileMock).mkdirs();

ConfigDriveBuilder.writeVendorEmptyJsonFile(folderFileMock);
ConfigDriveBuilder.writeVendorDataJsonFile(folderFileMock);
}

@Test(expected = CloudRuntimeException.class)
public void writeVendorEmptyJsonFileTest() {
public void writeVendorDataJsonFileTest() {
File folderFileMock = Mockito.mock(File.class);
Mockito.doReturn(false).when(folderFileMock).mkdirs();

ConfigDriveBuilder.writeVendorEmptyJsonFile(folderFileMock);
ConfigDriveBuilder.writeVendorDataJsonFile(folderFileMock);
}

@Test
public void writeVendorEmptyJsonFileTestCreatingFolder() {
public void writeVendorDataJsonFileTestCreatingFolder() {
try (MockedStatic<ConfigDriveBuilder> configDriveBuilderMocked = Mockito.mockStatic(ConfigDriveBuilder.class)) {

File folderFileMock = Mockito.mock(File.class);
Mockito.doReturn(false).when(folderFileMock).exists();
Mockito.doReturn(true).when(folderFileMock).mkdirs();

//force execution of real method
configDriveBuilderMocked.when(() -> ConfigDriveBuilder.writeVendorEmptyJsonFile(folderFileMock)).thenCallRealMethod();
configDriveBuilderMocked.when(() -> ConfigDriveBuilder.writeVendorDataJsonFile(folderFileMock)).thenCallRealMethod();

ConfigDriveBuilder.writeVendorEmptyJsonFile(folderFileMock);
ConfigDriveBuilder.writeVendorDataJsonFile(folderFileMock);

Mockito.verify(folderFileMock).exists();
Mockito.verify(folderFileMock).mkdirs();
Expand Down
Loading