Ravi Nori has uploaded a new change for review.

Change subject: restapi : Creating template by specifing vm name, does not work 
(#915285)
......................................................................

restapi : Creating template by specifing vm name, does not work (#915285)

Creating template by specifing vm name, does not work,
works only when vm id is specified.

This patch lets the user create a template from a VM
by specifying the vm name.

Change-Id: Ibe6ff6059c22a853c76a0720e5c9e330f600712b
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=915285
Signed-off-by: Ravi Nori <rn...@redhat.com>
---
M backend/manager/dbscripts/vms_sp.sql
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmByVmNameForDataCenterQuery.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetVmByVmNameForDataCenterQueryTest.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/GetVmByVmNameForDataCenterParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAO.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAODbFacadeImpl.java
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmDAOTest.java
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
10 files changed, 234 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/75/13375/1

diff --git a/backend/manager/dbscripts/vms_sp.sql 
b/backend/manager/dbscripts/vms_sp.sql
index feb12b1..175468e 100644
--- a/backend/manager/dbscripts/vms_sp.sql
+++ b/backend/manager/dbscripts/vms_sp.sql
@@ -759,6 +759,24 @@
 
 
 
+Create or replace FUNCTION GetVmByVmNameForDataCenter(v_data_center_id UUID, 
v_vm_name VARCHAR(255), v_user_id UUID, v_is_filtered boolean) RETURNS SETOF vms
+   AS $procedure$
+BEGIN
+RETURN QUERY SELECT DISTINCT vms.*
+   FROM vms
+   WHERE vm_name = v_vm_name
+   AND   (v_data_center_id is null OR storage_pool_id = v_data_center_id)
+   AND   (NOT v_is_filtered OR EXISTS (SELECT 1
+                                       FROM   user_vm_permissions_view
+                                       WHERE  user_id = v_user_id AND 
entity_id = vms.vm_guid));
+END; $procedure$
+LANGUAGE plpgsql;
+
+
+
+
+
+
 Create or replace FUNCTION GetVmsByVmtGuid(v_vmt_guid UUID) RETURNS SETOF vms
    AS $procedure$
 BEGIN
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmByVmNameForDataCenterQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmByVmNameForDataCenterQuery.java
new file mode 100644
index 0000000..1f9872c
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmByVmNameForDataCenterQuery.java
@@ -0,0 +1,32 @@
+package org.ovirt.engine.core.bll;
+
+import org.ovirt.engine.core.common.businessentities.VM;
+import 
org.ovirt.engine.core.common.queries.GetVmByVmNameForDataCenterParameters;
+
+public class GetVmByVmNameForDataCenterQuery<P extends 
GetVmByVmNameForDataCenterParameters> extends 
QueriesCommandBase<GetVmByVmNameForDataCenterParameters> {
+    public GetVmByVmNameForDataCenterQuery(P parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void executeQueryCommand() {
+        VM vm = getDbFacade().getVmDao().getByNameForDataCenter(
+                getParameters().getDataCenterId(),
+                getParameters().getName(),
+                getUserID(),
+                getParameters().isFiltered());
+        if (vm != null) {
+            // Note that retrieving the VM is already filtered, and if there 
are no permissions for it, null will be
+            // returned.
+            // Thus, no additional concern should be given for permissions 
issues
+            updateVMDetails(vm);
+            getQueryReturnValue().setReturnValue(vm);
+        }
+    }
+
+    protected void updateVMDetails(VM vm) {
+        VmHandler.updateDisksFromDb(vm);
+        VmHandler.UpdateVmGuestAgentVersion(vm);
+        VmHandler.updateNetworkInterfacesFromDb(vm);
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetVmByVmNameForDataCenterQueryTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetVmByVmNameForDataCenterQueryTest.java
new file mode 100644
index 0000000..ea41a1a
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/GetVmByVmNameForDataCenterQueryTest.java
@@ -0,0 +1,41 @@
+package org.ovirt.engine.core.bll;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.junit.Test;
+import org.ovirt.engine.core.common.businessentities.VM;
+import 
org.ovirt.engine.core.common.queries.GetVmByVmNameForDataCenterParameters;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dao.VmDAO;
+
+/**
+ * A test case for {@link GetVmByVmNameForDataCenterQuery}.
+ * It does not test database implementation, but rather tests that the right 
delegations to the DAO occur.
+ */
+public class GetVmByVmNameForDataCenterQueryTest extends 
AbstractUserQueryTest<GetVmByVmNameForDataCenterParameters, 
GetVmByVmNameForDataCenterQuery<GetVmByVmNameForDataCenterParameters>> {
+    @Test
+    public void testExecuteQuery() {
+        Guid dataCenterId = Guid.NewGuid();
+        String VM_NAME = "VM";
+        VM expectedResult = new VM();
+        expectedResult.setId(dataCenterId);
+
+        GetVmByVmNameForDataCenterParameters paramsMock = getQueryParameters();
+        when(paramsMock.getName()).thenReturn(VM_NAME);
+        when(paramsMock.getDataCenterId()).thenReturn(dataCenterId);
+
+        VmDAO vmDAOMock = mock(VmDAO.class);
+        when(vmDAOMock.getByNameForDataCenter(dataCenterId, VM_NAME, 
getUser().getUserId(), paramsMock.isFiltered())).thenReturn(expectedResult);
+        when(getQuery().getDbFacade().getVmDao()).thenReturn(vmDAOMock);
+
+        doNothing().when(getQuery()).updateVMDetails(expectedResult);
+        getQuery().executeQueryCommand();
+
+        VM result = (VM) getQuery().getQueryReturnValue().getReturnValue();
+
+        assertEquals("Wrong VM returned", expectedResult, result);
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/GetVmByVmNameForDataCenterParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/GetVmByVmNameForDataCenterParameters.java
new file mode 100644
index 0000000..79bc3a1
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/GetVmByVmNameForDataCenterParameters.java
@@ -0,0 +1,23 @@
+package org.ovirt.engine.core.common.queries;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class GetVmByVmNameForDataCenterParameters extends 
VdcQueryParametersBase {
+    private static final long serialVersionUID = -3232978226860645746L;
+    private Guid dataCenterId;
+    private String name;
+
+    public GetVmByVmNameForDataCenterParameters(Guid dataCenterId, String 
name) {
+        this.dataCenterId = dataCenterId;
+        this.name = name;
+    }
+
+    public Guid getDataCenterId() {
+        return dataCenterId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
index e23bf8a..b076052 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
@@ -6,6 +6,7 @@
     // VM queries
     IsVmWithSameNameExist(VdcQueryAuthType.User),
     GetVmByVmId(VdcQueryAuthType.User),
+    GetVmByVmNameForDataCenter(VdcQueryAuthType.User),
     GetAllVms(VdcQueryAuthType.User),
     GetVmsRunningOnVDS,
     GetVmsRunningOnVDSCount,
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAO.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAO.java
index 1674a61..aaababc 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAO.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAO.java
@@ -35,6 +35,19 @@
     VM get(Guid id, Guid userID, boolean isFiltered);
 
     /**
+     * Returns the VM with the specified name, with optional filtering.
+     *
+     * @param id
+     *            the VM name
+     * @param userID
+     *            the ID of the user requesting the information
+     * @param isFiltered
+     *            Whether the results should be filtered according to the 
user's permissions
+     * @return the VM
+     */
+    VM getByNameForDataCenter(Guid dataCenterId, String name, Guid userID, 
boolean isFiltered);
+
+    /**
      * Retrieves the VM for the specified hibernate image.
      *
      * @param hibernationImage
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAODbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAODbFacadeImpl.java
index 49ffba1..8adf63d 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAODbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAODbFacadeImpl.java
@@ -49,6 +49,12 @@
     }
 
     @Override
+    public VM getByNameForDataCenter(Guid dataCenterId, String name, Guid 
userID, boolean isFiltered) {
+        return getCallsHandler().executeRead("GetVmByVmNameForDataCenter", 
VMRowMapper.instance, getCustomMapSqlParameterSource()
+                .addValue("data_center_id", dataCenterId).addValue("vm_name", 
name).addValue("user_id", userID).addValue("is_filtered", isFiltered));
+    }
+
+    @Override
     public VM getForHibernationImage(Guid id) {
         return getCallsHandler().executeRead("GetVmByHibernationImageId",
                 VMRowMapper.instance,
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmDAOTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmDAOTest.java
index 02803ad..253cf96 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmDAOTest.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmDAOTest.java
@@ -99,6 +99,28 @@
     }
 
     /**
+     * Ensures that get by name works as expected when a filtered for 
permissions
+     * of a privileged user.
+     */
+    @Test
+    public void testGetByNameFilteredWithPermissions() {
+        VM result = dao.getByNameForDataCenter(null, existingVm.getName(), 
PRIVILEGED_USER_ID, true);
+
+        assertGetResult(result);
+    }
+
+    /**
+     * Ensures that get by name works as expected when a filtered for 
permissions
+     * of an unprivileged user.
+     */
+    @Test
+    public void testGetByNameFilteredWithPermissionsNoPermissions() {
+        VM result = dao.getByNameForDataCenter(null, existingVm.getName(), 
UNPRIVILEGED_USER_ID, true);
+
+        assertNull(result);
+    }
+
+    /**
      * Ensures that get works as expected when a filtered for permissions of 
an unprivileged user, and filtering disabled.
      */
     @Test
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 21d8943..22d0dac 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
@@ -23,6 +23,7 @@
 import org.ovirt.engine.core.common.interfaces.SearchType;
 import org.ovirt.engine.core.common.queries.GetVdsGroupByVdsGroupIdParameters;
 import org.ovirt.engine.core.common.queries.GetVmByVmIdParameters;
+import 
org.ovirt.engine.core.common.queries.GetVmByVmNameForDataCenterParameters;
 import org.ovirt.engine.core.common.queries.GetVmTemplateParameters;
 import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
 import org.ovirt.engine.core.common.queries.VdcQueryType;
@@ -57,12 +58,19 @@
     public Response add(Template template) {
         validateParameters(template, "name", "vm.id|name");
         validateEnums(Template.class, template);
-        VmStatic staticVm = getMapper(Template.class, 
VmStatic.class).map(template, getVm(template));
+        Guid clusterId = null;
+        VDSGroup cluster = null;
         if (namedCluster(template)) {
-            staticVm.setVdsGroupId(getClusterId(template));
+            clusterId = getClusterId(template);
+            cluster = lookupCluster(clusterId);
+        }
+        VmStatic staticVm = getMapper(Template.class, 
VmStatic.class).map(template, getVm(cluster, template));
+        if (namedCluster(template)) {
+            staticVm.setVdsGroupId(clusterId);
         }
 
-        staticVm.setUsbPolicy(VmMapper.getUsbPolicyOnCreate(template.getUsb(), 
lookupCluster(staticVm.getVdsGroupId())));
+        staticVm.setUsbPolicy(VmMapper.getUsbPolicyOnCreate(template.getUsb(),
+                cluster != null ? cluster : 
lookupCluster(staticVm.getVdsGroupId())));
 
         // REVISIT: powershell has a IsVmTemlateWithSameNameExist safety check
         AddVmTemplateParameters params = new AddVmTemplateParameters(staticVm,
@@ -119,14 +127,23 @@
         return collection;
     }
 
-    protected VmStatic getVm(Template template) {
+    protected VmStatic getVm(VDSGroup cluster, Template template) {
         org.ovirt.engine.core.common.businessentities.VM vm;
         if (template.getVm().isSetId()) {
             vm = 
getEntity(org.ovirt.engine.core.common.businessentities.VM.class,
                            VdcQueryType.GetVmByVmId,
                            new 
GetVmByVmIdParameters(asGuid(template.getVm().getId())),
                            template.getVm().getId());
-        } else {
+        } else if (isFiltered()) {
+            Guid dataCenterId = null;
+            if (cluster != null && cluster.getStoragePoolId() != null) {
+                dataCenterId = asGuid(cluster.getStoragePoolId());
+            }
+            vm = 
getEntity(org.ovirt.engine.core.common.businessentities.VM.class,
+                           VdcQueryType.GetVmByVmNameForDataCenter,
+                           new 
GetVmByVmNameForDataCenterParameters(dataCenterId, template.getVm().getName()),
+                           template.getVm().getName());
+        } else  {
             vm = 
getEntity(org.ovirt.engine.core.common.businessentities.VM.class,
                            SearchType.VM,
                            "VM: name=" + template.getVm().getName());
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 932fe1d..e3ce9cc 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
@@ -1,9 +1,11 @@
 package org.ovirt.engine.api.restapi.resource;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Response;
+import org.easymock.EasyMock;
 
 import org.junit.Test;
 
@@ -26,6 +28,7 @@
 import org.ovirt.engine.core.compat.Guid;
 
 import static org.easymock.classextension.EasyMock.expect;
+import 
org.ovirt.engine.core.common.queries.GetVmByVmNameForDataCenterParameters;
 
 public class BackendTemplatesResourceTest
     extends AbstractBackendCollectionResourceTest<Template, VmTemplate, 
BackendTemplatesResource> {
@@ -236,6 +239,52 @@
     }
 
     @Test
+    public void testAddNamedVmFiltered() throws Exception {
+        setUpFilteredQueryExpectations();
+        setUriInfo(setUpBasicUriExpectations());
+        setUpEntityQueryExpectations(VdcQueryType.GetVdsGroupByVdsGroupId,
+                GetVdsGroupByVdsGroupIdParameters.class,
+                new String[] { "VdsGroupId" },
+                new Object[] { GUIDS[2] },
+                getVdsGroupEntity());
+
+        setUpHttpHeaderExpectations("Expect", "201-created");
+
+        setUpGetEntityExpectations(VdcQueryType.GetVmByVmNameForDataCenter,
+                                   GetVmByVmNameForDataCenterParameters.class,
+                                   new String[] { "Name" },
+                                   new Object[] { NAMES[1] },
+                                   setUpVm(GUIDS[1]));
+
+        setUpGetEntityExpectations();
+
+        setUpCreationExpectations(VdcActionType.AddVmTemplate,
+                                  AddVmTemplateParameters.class,
+                                  new String[] { "Name", "Description" },
+                                  new Object[] { NAMES[0], DESCRIPTIONS[0] },
+                                  true,
+                                  true,
+                                  GUIDS[0],
+                                  asList(GUIDS[2]),
+                                  asList(new 
AsyncTaskStatus(AsyncTaskStatusEnum.finished)),
+                                  VdcQueryType.GetVmTemplate,
+                                  GetVmTemplateParameters.class,
+                                  new String[] { "Id" },
+                                  new Object[] { GUIDS[0] },
+                                  getEntity(0));
+
+        Template model = getModel(0);
+        model.getVm().setId(null);
+        model.getVm().setName(NAMES[1]);
+
+        Response response = collection.add(model);
+        assertEquals(201, response.getStatus());
+        assertTrue(response.getEntity() instanceof Template);
+        verifyModel((Template)response.getEntity(), 0);
+        assertNull(((Template)response.getEntity()).getCreationStatus());
+    }
+
+    @Test
     public void testAddWithCluster() throws Exception {
         setUriInfo(setUpBasicUriExpectations());
         setUpHttpHeaderExpectations("Expect", "201-created");
@@ -335,6 +384,13 @@
         doTestBadAdd(true, false, FAILURE);
     }
 
+    protected void setUpFilteredQueryExpectations() {
+        List<String> filterValue = new ArrayList<String>();
+        filterValue.add("true");
+        EasyMock.reset(httpHeaders);
+        
expect(httpHeaders.getRequestHeader(USER_FILTER_HEADER)).andReturn(filterValue);
+    }
+
     private void doTestBadAdd(boolean canDo, boolean success, String detail) 
throws Exception {
         setUpEntityQueryExpectations(VdcQueryType.GetVdsGroupByVdsGroupId,
                 GetVdsGroupByVdsGroupIdParameters.class,


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibe6ff6059c22a853c76a0720e5c9e330f600712b
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: engine_3.2
Gerrit-Owner: Ravi Nori <rn...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to