Hello Alissa Bonas,

I'd like you to do a code review.  Please visit

    http://gerrit.ovirt.org/23453

to review the following change.

Change subject: WIP restapi: add template versions support
......................................................................

WIP restapi: add template versions support

Feature page:
http://www.ovirt.org/Features/Template_Versions

Change-Id: Id8e4c498c4a1856ac341237837db40db8375c6da
Signed-off-by: Alissa Bonas <[email protected]>
---
M 
backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
M 
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResourceTest.java
M 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/TemplateMapper.java
4 files changed, 142 insertions(+), 13 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/53/23453/1

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 86809df..bd920d6 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
@@ -485,6 +485,14 @@
     </xs:sequence>
   </xs:complexType>
 
+  <xs:complexType name="TemplateVersion">
+    <xs:sequence>
+       <xs:element name="base_template" type="Template"  minOccurs="1" 
maxOccurs="1"/>
+       <xs:element name="version_number" type="xs:int"  minOccurs="0" 
maxOccurs="1" />
+       <xs:element name="version_name" type="xs:string"  minOccurs="0" 
maxOccurs="1"/>
+    </xs:sequence>
+  </xs:complexType>
+
   <!-- Version numbers -->
 
   <xs:element name="system_version" type="Version"/>
@@ -2312,6 +2320,7 @@
           <xs:element ref="virtio_scsi" minOccurs="0" maxOccurs="1"/>
           <xs:element ref="permissions" minOccurs="0" maxOccurs="1"/>
           <!-- also rel="cdroms/disks/nics/watchdogs" links, see Devices below 
-->
+          <xs:element name="version" type="TemplateVersion" minOccurs="0" 
maxOccurs="1"/>
         </xs:sequence>
       </xs:extension>
     </xs:complexContent>
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
index 2dd9677..5fcb1d0 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
@@ -66,6 +66,9 @@
             clusterId = getClusterId(template);
             cluster = lookupCluster(clusterId);
         }
+        if (template.getVersion() != null) {
+            validateParameters(template.getVersion(), "baseTemplate");
+        }
         VmStatic staticVm = getMapper(Template.class, 
VmStatic.class).map(template, getVm(cluster, template));
         if (namedCluster(template)) {
             staticVm.setVdsGroupId(clusterId);
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResourceTest.java
 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResourceTest.java
index d4e930b..ae6983d 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResourceTest.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResourceTest.java
@@ -4,17 +4,17 @@
 
 import java.util.ArrayList;
 import java.util.List;
-
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Response;
-
 import javax.ws.rs.core.UriInfo;
+
 import org.easymock.EasyMock;
 import org.junit.Test;
 import org.ovirt.engine.api.model.Cluster;
 import org.ovirt.engine.api.model.CreationStatus;
 import org.ovirt.engine.api.model.Permissions;
 import org.ovirt.engine.api.model.Template;
+import org.ovirt.engine.api.model.TemplateVersion;
 import org.ovirt.engine.api.model.VM;
 import org.ovirt.engine.api.restapi.util.VmHelper;
 import org.ovirt.engine.core.common.action.AddVmTemplateParameters;
@@ -35,6 +35,7 @@
     extends AbstractBackendCollectionResourceTest<Template, VmTemplate, 
BackendTemplatesResource> {
 
     protected VmHelper vmHelper = VmHelper.getInstance();
+    private static final String VERSION_NAME = "my new version";
 
     public BackendTemplatesResourceTest() {
         super(new BackendTemplatesResource(), SearchType.VmTemplate, "Template 
: ");
@@ -69,7 +70,7 @@
                 new String[] { "Id" },
                 new Object[] { GUIDS[1] },
                 setUpVm(GUIDS[1]));
-        setUpGetEntityExpectations();
+        setUpGetEntityExpectations(0);
         setUpGetConsoleExpectations(new int[]{0, 0, 0});
         setUpGetVirtioScsiExpectations(new int[]{0, 0});
         setUpEntityQueryExpectations(VdcQueryType.GetVdsGroupByVdsGroupId,
@@ -102,7 +103,7 @@
 
     @Test
     public void testRemove() throws Exception {
-        setUpGetEntityExpectations();
+        setUpGetEntityExpectations(0);
         setUriInfo(setUpActionExpectations(VdcActionType.RemoveVmTemplate,
                                            VmTemplateParametersBase.class,
                                            new String[] { "VmTemplateId" },
@@ -129,12 +130,12 @@
         }
     }
 
-    private void setUpGetEntityExpectations() throws Exception {
+    private void setUpGetEntityExpectations(int index) throws Exception {
         setUpGetEntityExpectations(VdcQueryType.GetVmTemplate,
                 GetVmTemplateParameters.class,
                 new String[] { "Id" },
-                new Object[] { GUIDS[0] },
-                getEntity(0));
+                new Object[] { GUIDS[index] },
+                getEntity(index));
     }
 
     @Test
@@ -152,7 +153,7 @@
     }
 
     protected void doTestBadRemove(boolean canDo, boolean success, String 
detail) throws Exception {
-        setUpGetEntityExpectations();
+        setUpGetEntityExpectations(0);
         setUriInfo(setUpActionExpectations(VdcActionType.RemoveVmTemplate,
                                            VmTemplateParametersBase.class,
                                            new String[] { "VmTemplateId" },
@@ -235,7 +236,7 @@
                                    new String[] { "Id" },
                                    new Object[] { GUIDS[1] },
                                    setUpVm(GUIDS[1]));
-        setUpGetEntityExpectations();
+        setUpGetEntityExpectations(0);
         setUpEntityQueryExpectations(VdcQueryType.GetVdsGroupByVdsGroupId,
                 IdQueryParameters.class,
                 new String[] { "Id" },
@@ -265,6 +266,64 @@
     }
 
     @Test
+    public void testAddVersionNoBaseTemplateId() throws Exception {
+       setUriInfo(setUpBasicUriExpectations());
+       control.replay();
+       Template t = getModel(2);
+       t.getVersion().setBaseTemplate(null);
+       try {
+         collection.add(t);
+         fail("Should have failed with 400 error due to a missing base 
template");
+       }
+       catch (WebApplicationException e) {
+            assertNotNull(e.getResponse());
+            assertEquals(400, e.getResponse().getStatus());
+        }
+    }
+
+    @Test
+    public void testAddVersion() throws Exception {
+            setUriInfo(setUpBasicUriExpectations());
+            setUpHttpHeaderExpectations("Expect", "201-created");
+
+            setUpGetConsoleExpectations(new int[]{2, 0, 2});
+            setUpGetVirtioScsiExpectations(new int[]{2, 2});
+            setUpGetEntityExpectations(VdcQueryType.GetVmByVmId,
+                                       IdQueryParameters.class,
+                                       new String[] { "Id" },
+                                       new Object[] { GUIDS[1] },
+                                       setUpVm(GUIDS[1]));
+            setUpGetEntityExpectations(2);
+            setUpEntityQueryExpectations(VdcQueryType.GetVdsGroupByVdsGroupId,
+                    IdQueryParameters.class,
+                    new String[] { "Id" },
+                    new Object[] { GUIDS[2] },
+                    getVdsGroupEntity());
+
+            setUpCreationExpectations(VdcActionType.AddVmTemplate,
+                                      AddVmTemplateParameters.class,
+                                      new String[] { "Name", "Description" },
+                                      new Object[] { NAMES[2], DESCRIPTIONS[2] 
},
+                                      true,
+                                      true,
+                                      GUIDS[2],
+                                      asList(GUIDS[2]),
+                                      asList(new 
AsyncTaskStatus(AsyncTaskStatusEnum.finished)),
+                                      VdcQueryType.GetVmTemplate,
+                                      GetVmTemplateParameters.class,
+                                      new String[] { "Id" },
+                                      new Object[] { GUIDS[2] },
+                                      getEntity(2));
+
+            Response response = collection.add(getModel(2));
+            assertEquals(201, response.getStatus());
+            assertTrue(response.getEntity() instanceof Template);
+            assertEquals(((Template) 
response.getEntity()).getVersion().getVersionName(), VERSION_NAME);
+            assertEquals(((Template) 
response.getEntity()).getVersion().getBaseTemplate().getId(), 
GUIDS[1].toString());
+            verifyModel((Template)response.getEntity(), 2);
+    }
+
+    @Test
     public void testAddNamedVm() throws Exception {
         setUriInfo(setUpBasicUriExpectations());
         setUpEntityQueryExpectations(VdcQueryType.GetVdsGroupByVdsGroupId,
@@ -278,7 +337,7 @@
         setUpGetEntityExpectations("VM: name=" + NAMES[1],
                                    SearchType.VM,
                                    setUpVm(GUIDS[1]));
-        setUpGetEntityExpectations();
+        setUpGetEntityExpectations(0);
         setUpGetConsoleExpectations(new int[] {0, 0, 0});
         setUpGetVirtioScsiExpectations(new int[] {0, 0});
 
@@ -326,7 +385,7 @@
                                    new Object[] { NAMES[1] },
                                    setUpVm(GUIDS[1]));
 
-        setUpGetEntityExpectations();
+        setUpGetEntityExpectations(0);
         setUpGetConsoleExpectations(new int[] {0, 0, 0});
         setUpGetVirtioScsiExpectations(new int[] {0, 0});
 
@@ -372,7 +431,7 @@
                                    new String[] { "Id" },
                                    new Object[] { GUIDS[1] },
                                    setUpVm(GUIDS[1]));
-        setUpGetEntityExpectations();
+        setUpGetEntityExpectations(0);
 
         setUpGetConsoleExpectations(new int[] {0, 0, 0});
         setUpGetVirtioScsiExpectations(new int[] {0, 0});
@@ -418,7 +477,7 @@
                                    new String[] { "Id" },
                                    new Object[] { GUIDS[1] },
                                    setUpVm(GUIDS[1]));
-        setUpGetEntityExpectations();
+        setUpGetEntityExpectations(0);
 
         setUpGetConsoleExpectations(new int[] {0, 0, 0});
         setUpGetVirtioScsiExpectations(new int[] {0, 0});
@@ -532,6 +591,16 @@
         
expect(entity.getDescription()).andReturn(DESCRIPTIONS[index]).anyTimes();
         expect(entity.getNumOfCpus()).andReturn(8).anyTimes();
         expect(entity.getNumOfSockets()).andReturn(2).anyTimes();
+        if(index == 2) {
+           
expect(entity.getTemplateVersionName()).andReturn(VERSION_NAME).anyTimes();
+           expect(entity.getTemplateVersionNumber()).andReturn(2).anyTimes();
+           expect(entity.getBaseTemplateId()).andReturn(GUIDS[1]).anyTimes();
+        }
+        else {
+            expect(entity.getTemplateVersionNumber()).andReturn(1).anyTimes();
+            // same base template id as the template itself
+            
expect(entity.getBaseTemplateId()).andReturn(GUIDS[index]).anyTimes();
+        }
         return entity;
     }
 
@@ -543,7 +612,20 @@
         model.getVm().setId(GUIDS[1].toString());
         model.setCluster(new Cluster());
         model.getCluster().setId(GUIDS[2].toString());
+        if(index == 2) {
+            populateVersion(model);
+        }
         return model;
+    }
+
+    public static void populateVersion(Template t) {
+        TemplateVersion templateVersion = new TemplateVersion();
+        templateVersion.setVersionName(VERSION_NAME);
+        templateVersion.setVersionNumber(2);
+        Template base = new Template();
+        base.setId(GUIDS[1].toString());
+        templateVersion.setBaseTemplate(base);
+        t.setVersion(templateVersion);
     }
 
     @Override
@@ -586,6 +668,14 @@
 
         for (Template template : collection) {
             assertTrue(populated ? template.isSetConsole() : 
!template.isSetConsole());
+            if(template.getId().equals(GUIDS[2].toString())) {
+                 assertEquals(template.getVersion().getVersionName(), 
VERSION_NAME);
+                 assertEquals(template.getVersion().getVersionNumber(), new 
Integer(2));
+                 assertEquals(template.getVersion().getBaseTemplate().getId(), 
GUIDS[1].toString());
+            }
+            else {
+                assertNull(template.getVersion());
+            }
         }
     }
 
@@ -602,6 +692,10 @@
         assertNotNull(model.getCpu().getTopology());
         assertEquals(4, model.getCpu().getTopology().getCores().intValue());
         assertEquals(2, model.getCpu().getTopology().getSockets().intValue());
+        if(index == 2) {
+            assertNotNull(model.getVersion());
+            assertNotSame(model.getVersion().getBaseTemplate().getId(), 
model.getId());
+        }
     }
 
     private void setUpGetVirtioScsiExpectations(int ... idxs) throws Exception 
{
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/TemplateMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/TemplateMapper.java
index ed43eb6..1a8a8da7 100644
--- 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/TemplateMapper.java
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/TemplateMapper.java
@@ -1,5 +1,6 @@
 package org.ovirt.engine.api.restapi.types;
 
+import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.api.common.util.StatusUtils;
 import org.ovirt.engine.api.model.Architecture;
 import org.ovirt.engine.api.model.Boot;
@@ -13,6 +14,7 @@
 import org.ovirt.engine.api.model.OperatingSystem;
 import org.ovirt.engine.api.model.Template;
 import org.ovirt.engine.api.model.TemplateStatus;
+import org.ovirt.engine.api.model.TemplateVersion;
 import org.ovirt.engine.api.model.Usb;
 import org.ovirt.engine.api.model.UsbType;
 import org.ovirt.engine.api.model.VmType;
@@ -25,6 +27,7 @@
 import org.ovirt.engine.core.common.businessentities.VmTemplateStatus;
 import org.ovirt.engine.core.common.osinfo.OsRepository;
 import org.ovirt.engine.core.common.utils.SimpleDependecyInjector;
+import org.ovirt.engine.core.compat.Guid;
 
 import static 
org.ovirt.engine.api.restapi.types.IntegerMapper.mapNullToMinusOne;
 import static 
org.ovirt.engine.api.restapi.types.IntegerMapper.mapMinusOneToNull;
@@ -158,6 +161,15 @@
         if (model.isSetMigrationDowntime()) {
             
entity.setMigrationDowntime(mapMinusOneToNull(model.getMigrationDowntime()));
         }
+        if (model.getVersion() != null) {
+            if (model.getVersion().getBaseTemplate() != null
+                    && 
StringUtils.isNotEmpty(model.getVersion().getBaseTemplate().getId())) {
+                
entity.setBaseTemplateId(Guid.createGuidFromString(model.getVersion().getBaseTemplate().getId()));
+            }
+            entity.setTemplateVersionName(model.getVersion().getVersionName());
+            // numbering is generated in the backend, hence even if user 
specified version number, we ignore it.
+        }
+
         return entity;
     }
 
@@ -362,6 +374,17 @@
         model.setTimezone(entity.getTimeZone());
         model.setTunnelMigration(entity.getTunnelMigration());
         
model.setMigrationDowntime(mapNullToMinusOne(entity.getMigrationDowntime()));
+        // if a base template id exists, that means this is a template version
+        // so need to populate template version properties
+        if (entity.getBaseTemplateId() != null && 
!entity.getBaseTemplateId().equals(entity.getId())) {
+            TemplateVersion version = new TemplateVersion();
+            version.setVersionName(entity.getTemplateVersionName());
+            version.setVersionNumber(entity.getTemplateVersionNumber());
+            Template baseTemplate = new Template();
+            baseTemplate.setId(entity.getBaseTemplateId().toString());
+            version.setBaseTemplate(baseTemplate);
+            model.setVersion(version);
+        }
 
         return model;
     }


-- 
To view, visit http://gerrit.ovirt.org/23453
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id8e4c498c4a1856ac341237837db40db8375c6da
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Omer Frenkel <[email protected]>
Gerrit-Reviewer: Alissa Bonas <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to