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

Reply via email to