Omer Frenkel has uploaded a new change for review. Change subject: core: use template version on add vm/pool ......................................................................
core: use template version on add vm/pool When adding stateless vm, or vm-pool, if using latest version, we need to get latest version available and use it. http://www.ovirt.org/index.php?title=Features/Template_Versions Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1037478 Change-Id: I2d1b3ee9cd64d73866762fbf5fe02a468cdd578e Signed-off-by: Omer Frenkel <ofren...@redhat.com> --- 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/CommonVmPoolWithVmsCommand.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmCommandTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommandTestAbstract.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmTemplateDAO.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmTemplateDAODbFacadeImpl.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmTemplateDAOTest.java M packaging/dbscripts/vm_templates_sp.sql 8 files changed, 87 insertions(+), 2 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/75/22975/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 02b8b63..4e76ea6 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 @@ -108,7 +108,25 @@ parameters.setVmId(getVmId()); setStorageDomainId(getParameters().getStorageDomainId()); if (parameters.getVmStaticData() != null) { - setVmTemplateId(parameters.getVmStaticData().getVmtGuid()); + Guid templateIdToUse = getParameters().getVmStaticData().getVmtGuid(); + + if (getParameters().getVmStaticData().getTemplateVersion() == null) { + VmTemplate latest = getVmTemplateDAO().getTemplateWithLatestVersionInChain(templateIdToUse); + + if (latest != null) { + // if not using original template, need to override storage mappings + // as it may have different set of disks + if (!templateIdToUse.equals(latest.getId())) { + getParameters().setDiskInfoDestinationMap(null); + } + + setVmTemplate(latest); + templateIdToUse = latest.getId(); + getParameters().getVmStaticData().setVmtGuid(templateIdToUse); + } + } + + setVmTemplateId(templateIdToUse); // API backward compatibility if (parameters.isSoundDeviceEnabled() == null) { @@ -761,6 +779,13 @@ protected void addVmStatic() { VmStatic vmStatic = getParameters().getVmStaticData(); + + // if not using latest template version, override with the selected template version + // to have to correct version + if (vmStatic.getTemplateVersion() != null) { + vmStatic.setTemplateVersion(getVmTemplate().getTemplateVersion()); + } + if (vmStatic.getOrigin() == null) { vmStatic.setOrigin(OriginType.valueOf(Config.<String> getValue(ConfigValues.OriginType))); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java index 6dd960c..2e4a433 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommand.java @@ -26,6 +26,7 @@ import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.VmPool; import org.ovirt.engine.core.common.businessentities.VmStatic; +import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmType; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; @@ -66,7 +67,26 @@ public CommonVmPoolWithVmsCommand(T parameters) { super(parameters); - setVmTemplateId(getParameters().getVmStaticData().getVmtGuid()); + + Guid templateIdToUse = getParameters().getVmStaticData().getVmtGuid(); + // if set to use latest version, get it from db and use it as template + if (getParameters().getVmStaticData().getTemplateVersion() == null) { + VmTemplate latest = getVmTemplateDAO().getTemplateWithLatestVersionInChain(templateIdToUse); + + if (latest != null) { + // if not using original template, need to override storage mappings + // as it may have different set of disks + if (!templateIdToUse.equals(latest.getId())) { + getParameters().setDiskInfoDestinationMap(null); + } + + setVmTemplate(latest); + templateIdToUse = latest.getId(); + getParameters().getVmStaticData().setVmtGuid(templateIdToUse); + } + } + + setVmTemplateId(templateIdToUse); initTemplate(); diskInfoDestinationMap = getParameters().getDiskInfoDestinationMap(); if (diskInfoDestinationMap == null) { diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmCommandTest.java index 08923cd..63bf8ee 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmCommandTest.java @@ -496,6 +496,7 @@ vm.setStaticData(stat); vm.setDynamicData(dynamic); vm.setSingleQxlPci(false); + vm.setTemplateVersion(1); return vm; } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommandTestAbstract.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommandTestAbstract.java index 2e583cd..9135e6c 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommandTestAbstract.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommonVmPoolWithVmsCommandTestAbstract.java @@ -204,6 +204,7 @@ vm.setVmtGuid(vmTemplateId); vm.setStaticData(getVmStatic()); vm.setClusterArch(ArchitectureType.x86_64); + vm.setTemplateVersion(1); return vm; } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmTemplateDAO.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmTemplateDAO.java index cb1c5f1..100a42a 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmTemplateDAO.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmTemplateDAO.java @@ -154,4 +154,14 @@ ImageType getImageType(Guid id); int getCount(); + + /** + * Retrieve the id of the latest template for the given template (base or version) + * + * @param id + * the template id to get latest version for + * @return + * id of the latest template version in the chain + */ + VmTemplate getTemplateWithLatestVersionInChain(Guid id); } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmTemplateDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmTemplateDAODbFacadeImpl.java index 3642429..6d51a39 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmTemplateDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmTemplateDAODbFacadeImpl.java @@ -245,6 +245,15 @@ .addValue("vnic_profile_id", vnicProfileId)); } + @Override + public VmTemplate getTemplateWithLatestVersionInChain(Guid id) + { + return getCallsHandler().executeRead("GetTemplateWithLatestVersionInChain", + VMTemplateRowMapper.instance, + getCustomMapSqlParameterSource() + .addValue("template_id", id)); + } + private final static class VMTemplateRowMapper extends AbstractVmRowMapper<VmTemplate> { public static final VMTemplateRowMapper instance = new VMTemplateRowMapper(); diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmTemplateDAOTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmTemplateDAOTest.java index f80ef2a..f9a40ae 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmTemplateDAOTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmTemplateDAOTest.java @@ -356,4 +356,12 @@ public void testCountTemplates() { assertEquals(NUMBER_OF_TEMPLATES_IN_DB, dao.getCount()); } + + /** + * Assert that latest version (VM_TEMPLATE_RHEL5_V2) returns for base template (VM_TEMPLATE_RHEL5) + */ + @Test + public void testGetTemplateWithLatestVersionInChain(){ + assertEquals(FixturesTool.VM_TEMPLATE_RHEL5_V2, dao.getTemplateWithLatestVersionInChain(FixturesTool.VM_TEMPLATE_RHEL5).getId()); + } } diff --git a/packaging/dbscripts/vm_templates_sp.sql b/packaging/dbscripts/vm_templates_sp.sql index 5099fab..c6dfae8 100644 --- a/packaging/dbscripts/vm_templates_sp.sql +++ b/packaging/dbscripts/vm_templates_sp.sql @@ -462,3 +462,14 @@ END; $procedure$ LANGUAGE plpgsql; +Create or replace FUNCTION GetTemplateWithLatestVersionInChain(v_template_id UUID) RETURNS SETOF vm_templates_view STABLE +AS $procedure$ +BEGIN + RETURN QUERY SELECT * + from vm_templates_view + where base_template_id = + (select vmt_guid from vm_static where vm_guid = v_template_id) + order by template_version desc + limit 1; +END; $procedure$ +LANGUAGE plpgsql; -- To view, visit http://gerrit.ovirt.org/22975 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I2d1b3ee9cd64d73866762fbf5fe02a468cdd578e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Omer Frenkel <ofren...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches