Greg Padgett has uploaded a new change for review. Change subject: WIP core, restapi: cloud-init [1/4] - multiple files in VM Payload ......................................................................
WIP core, restapi: cloud-init [1/4] - multiple files in VM Payload Changes required for cloud-init integration: support multiple files (<file> elements) in VM Payloads. Change-Id: I70934b8013459037f3d56573f80915bfa6b42bb4 Signed-off-by: Greg Padgett <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmPayloadQuery.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmPayload.java M backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmResourceTest.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmsResourceTest.java M backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilder.java 10 files changed, 49 insertions(+), 54 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/48/14348/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java index 777f494..293d209 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java @@ -316,8 +316,9 @@ getParameters().getVmStaticData().getIsoPath()); if (returnValue) { // we save the content in base64 string - getParameters().getVmPayload().setContent(Base64.encodeBase64String( - getParameters().getVmPayload().getContent().getBytes())); + for (Map.Entry<String, String> entry : getParameters().getVmPayload().getFiles().entrySet()) { + entry.setValue(Base64.encodeBase64String(entry.getValue().getBytes())); + } } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmPayloadQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmPayloadQuery.java index 36fd7c3..c47130e 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmPayloadQuery.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmPayloadQuery.java @@ -1,6 +1,7 @@ package org.ovirt.engine.core.bll; import java.util.List; +import java.util.Map; import org.apache.commons.codec.binary.Base64; @@ -27,7 +28,9 @@ VmPayload payload = new VmPayload(VmDeviceType.valueOf(disk.getType().toUpperCase()), disk.getSpecParams()); payload.setType(VmDeviceType.valueOf(disk.getDevice().toUpperCase())); - payload.setContent(new String(Base64.decodeBase64(payload.getContent()))); + for (Map.Entry<String, String> entry : payload.getFiles().entrySet()) { + entry.setValue(new String(Base64.decodeBase64(entry.getValue()))); + } getQueryReturnValue().setReturnValue(payload); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java index c7476f1..875d39f 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java @@ -265,8 +265,9 @@ return false; } // we save the content in base64 string - getParameters().getVmPayload().setContent(Base64.encodeBase64String( - getParameters().getVmPayload().getContent().getBytes())); + for (Map.Entry<String, String> entry : getParameters().getVmPayload().getFiles().entrySet()) { + entry.setValue(Base64.encodeBase64String(entry.getValue().getBytes())); + } } // Check that the USB policy is legal diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java index 9bdb2ef..d3e3ccd 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java @@ -428,11 +428,17 @@ if (payload.getType() != VmDeviceType.CDROM && payload.getType() != VmDeviceType.FLOPPY) { addCanDoActionMessage(VdcBllMessages.VMPAYLOAD_INVALID_PAYLOAD_TYPE); returnValue = false; - } else if (!VmPayload.isPayloadSizeLegal(payload.getContent())) { - Integer lengthInKb = 2 * Config.<Integer> GetValue(ConfigValues.PayloadSize) / Kb; - addCanDoActionMessage(VdcBllMessages.VMPAYLOAD_SIZE_EXCEEDED); - addCanDoActionMessage(String.format("$size %1$s", lengthInKb.toString())); - returnValue = false; + } else { + for (String content : payload.getFiles().values()) { + // Check each file individually, no constraint on total size + if (!VmPayload.isPayloadSizeLegal(content)) { + Integer lengthInKb = 2 * Config.<Integer> GetValue(ConfigValues.PayloadSize) / Kb; + addCanDoActionMessage(VdcBllMessages.VMPAYLOAD_SIZE_EXCEEDED); + addCanDoActionMessage(String.format("$size %1$s", lengthInKb.toString())); + returnValue = false; + break; + } + } } return returnValue; } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmPayload.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmPayload.java index 8425ad9..247a192 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmPayload.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmPayload.java @@ -15,25 +15,19 @@ private static String SpecParamsFileType = "file"; private VmDeviceType type; - private String fileName; - private String content; + private Map<String, String> files; // file data is base64-encoded public VmPayload() { this.type = VmDeviceType.CDROM; - this.fileName = SpecParamsPayload; - this.content = ""; + this.files = new HashMap<String, String>(); } + @SuppressWarnings("unchecked") public VmPayload(VmDeviceType type, Map<String, Object> specParams) { this.type = type; Map<String, Object> payload = (Map<String, Object>)specParams.get(SpecParamsPayload); - Map<String, Object> files = (Map<String, Object>)payload.get(SpecParamsFileType); - // for now we use only one file and one content... - for (Map.Entry<String, Object> entry : files.entrySet()) { - this.fileName = entry.getKey(); - this.content = entry.getValue().toString(); - } + this.files = (Map<String, String>)payload.get(SpecParamsFileType); } public static boolean isPayload(Map<String, Object> specParams) { @@ -52,32 +46,25 @@ this.type = type; } - public String getFileName() { - return this.fileName; - } - - public void setFileName(String fileName) { - this.fileName = fileName; - } - - public String getContent() { - return this.content; - } - - public void setContent(String content) { - this.content = content; + /** + * Retrieve a map of files in this payload. The map is always initialized, + * and can be updated to add/remove files to/from the payload. + * The key is the file path, and the value is base64-encoded file content. + * + * @return Map of files in this payload + */ + public Map<String, String> getFiles() { + return files; } public Map<String, Object> getSpecParams() { // function produce something like that: - // vmPayload={file:{filename:content}} + // vmPayload={file:{filename:content,filename2:content2,...}} Map<String, Object> specParams = new HashMap<String, Object>(); Map<String, Object> fileTypeList = new HashMap<String, Object>(); - Map<String, Object> fileList = new HashMap<String, Object>(); specParams.put(SpecParamsPayload, fileTypeList); - fileTypeList.put(SpecParamsFileType, fileList); - fileList.put(this.fileName, this.content); + fileTypeList.put(SpecParamsFileType, files); return specParams; } diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd index c57c0a3..1ad8540 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd @@ -2032,7 +2032,7 @@ <xs:complexType name="Payload"> <xs:sequence> - <xs:element name="file" type="PayloadFile"/> + <xs:element name="file" type="PayloadFile" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="type" type="xs:string"> <xs:annotation> diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmResourceTest.java index b08261f..85beb41 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmResourceTest.java @@ -8,7 +8,6 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; -import org.apache.commons.codec.binary.Base64; import org.junit.Test; import org.ovirt.engine.api.model.Action; @@ -840,8 +839,7 @@ private VmPayload getPayloadModel() { VmPayload payload = new VmPayload(); payload.setType(VmDeviceType.CDROM); - payload.setContent(PAYLOAD_COMTENT); - payload.setContent(new String(Base64.decodeBase64(payload.getContent()))); + payload.getFiles().put("payloadFile", PAYLOAD_COMTENT); return payload; } diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmsResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmsResourceTest.java index de71436..177403c 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmsResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendVmsResourceTest.java @@ -11,7 +11,6 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; -import org.apache.commons.codec.binary.Base64; import org.junit.Test; import org.ovirt.engine.api.model.Action; import org.ovirt.engine.api.model.Cluster; @@ -775,8 +774,7 @@ private VmPayload getPayloadModel() { VmPayload payload = new VmPayload(); payload.setType(VmDeviceType.CDROM); - payload.setContent(PAYLOAD_COMTENT); - payload.setContent(new String(Base64.decodeBase64(payload.getContent()))); + payload.getFiles().put("payloadFile", PAYLOAD_COMTENT); return payload; } diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java index 3a1bfed..84f9f86 100644 --- a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; @@ -910,7 +911,7 @@ @Mapping(from = VmPayload.class, to = Payload.class) public static Payload map(VmPayload entity, Payload template) { - if (entity.getType() != null || entity.getFileName() != null) { + if (entity.getType() != null || entity.getFiles().isEmpty()) { Payload model = template != null ? template : new Payload(); if (entity.getType() != null) { org.ovirt.engine.api.model.VmDeviceType deviceType = map(entity.getType(), null); @@ -918,11 +919,11 @@ model.setType(deviceType.value()); } } - if (entity.getFileName() != null) { + for (Map.Entry<String, String> entry : entity.getFiles().entrySet()) { PayloadFile file = new PayloadFile(); - file.setName(entity.getFileName()); - file.setContent(entity.getContent()); - model.setFile(file); + file.setName(entry.getKey()); + file.setContent(entry.getValue()); + model.getFile().add(file); } return model; } @@ -939,8 +940,9 @@ } } if (model.getFile() != null) { - entity.setFileName(model.getFile().getName()); - entity.setContent(model.getFile().getContent()); + for (PayloadFile file : model.getFile()) { + entity.getFiles().put(file.getName(), file.getContent()); + } } return entity; } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilder.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilder.java index 102d17b..79e4a19 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilder.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilder.java @@ -420,8 +420,7 @@ // The sysprep file size isn't being verified for 3.0 clusters and below, so we maintain the same behavior here. VmPayload vmPayload = new VmPayload(); vmPayload.setType(VmDeviceType.FLOPPY); - vmPayload.setFileName(SYSPREP_FILE_NAME); - vmPayload.setContent(Base64.encodeBase64String(sysPrepContent.getBytes())); + vmPayload.getFiles().put(SYSPREP_FILE_NAME, Base64.encodeBase64String(sysPrepContent.getBytes())); VmDevice vmDevice = new VmDevice(new VmDeviceId(Guid.NewGuid(), vm.getId()), -- To view, visit http://gerrit.ovirt.org/14348 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I70934b8013459037f3d56573f80915bfa6b42bb4 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Greg Padgett <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
