package org.ovirt.engine.core.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Named; import javax.inject.Singleton; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.ArchitectureType; import org.ovirt.engine.core.common.businessentities.ImageType; import org.ovirt.engine.core.common.businessentities.InstanceType; import org.ovirt.engine.core.common.businessentities.QuotaEnforcementTypeEnum; import org.ovirt.engine.core.common.businessentities.VmEntityType; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.VmTemplateStatus; import org.ovirt.engine.core.compat.Guid; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.SingleColumnRowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; /** * {@code VmTemplateDaoImpl} provides a concrete implementation of {@link VmTemplateDao}. */ @Named @Singleton public class VmTemplateDaoImpl extends VmBaseDao<VmTemplate> implements VmTemplateDao { public VmTemplateDaoImpl() { super("VmTemplate"); setProcedureNameForRemove("DeleteVmTemplates"); } @Override public VmTemplate get(Guid id) { return get(id, null, false); } @Override public InstanceType getInstanceType(Guid id, Guid userID, boolean isFiltered) { VmTemplate result = get(id, userID, isFiltered); if (result != null && result.getTemplateType() != VmEntityType.INSTANCE_TYPE) { result = null; } return result; } @Override public InstanceType getInstanceType(Guid id) { return getInstanceType(id, null, false); } @Override public ImageType getImageType(Guid id) { VmTemplate result = get(id); if (result != null && result.getTemplateType() != VmEntityType.IMAGE_TYPE) { result = null; } return result; } @Override public VmTemplate get(Guid id, Guid userID, boolean isFiltered) { return getCallsHandler().executeRead("GetVmTemplateByVmtGuid", VMTemplateRowMapper.instance, createIdParameterMapper(id).addValue("user_id", userID).addValue("is_filtered", isFiltered)); } @Override public VmTemplate getByName(String name, Guid datacenterId, Guid userID, boolean isFiltered) { return getCallsHandler().executeRead("GetVmTemplateByVmtName", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("vmt_name", name) .addValue("storage_pool_id", datacenterId) .addValue("user_id", userID) .addValue("is_filtered", isFiltered)); } @Override public VmTemplate getInstanceTypeByName(String name, Guid userID, boolean isFiltered) { return getByName(name, null, userID, isFiltered); } @Override public List<VmTemplate> getAll() { return getAll(null, false, VmEntityType.TEMPLATE); } @Override public List<VmTemplate> getAll(Guid userID, boolean isFiltered, VmEntityType entityType) { return getCallsHandler().executeReadList("GetAllFromVmTemplates", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("entity_type", entityType.name()) .addValue("user_id", userID) .addValue("is_filtered", isFiltered)); } @Override public List<VmTemplate> getVmTemplatesByIds(List<Guid> templatesIds) { return getCallsHandler().executeReadList("GetVmTemplatesByIds", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource().addValue("vm_templates_ids", StringUtils.join(templatesIds, ','))); } @Override public List<VmTemplate> getAllForStorageDomain(Guid storageDomain) { return getAllForStorageDomain(storageDomain, null, false); } @Override public List<VmTemplate> getAllForStorageDomain(Guid storageDomain, Guid userID, boolean isFiltered) { return getCallsHandler().executeReadList("GetVmTemplatesByStorageDomainId", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("storage_domain_id", storageDomain) .addValue("user_id", userID) .addValue("is_filtered", isFiltered)); } @Override public List<VmTemplate> getAllWithQuery(String query) { return getJdbcTemplate().query(query, VMTemplateRowMapper.instance); } @Override public List<VmTemplate> getAllForCluster(Guid id) { return getCallsHandler().executeReadList("GetVmTemplateByClusterId", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("cluster_id", id)); } @Override public List<VmTemplate> getAllForStoragePool(Guid id) { return getCallsHandler().executeReadList("GetVmTemplatesByStoragePoolId", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("storage_pool_id", id)); } @Override public List<VmTemplate> getAllTemplatesRelatedToQuotaId(Guid quotaId) { return getCallsHandler().executeReadList("GetAllVmTemplatesRelatedToQuotaId", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("quota_id", quotaId)); } @Override public Map<Boolean, VmTemplate> getAllForImage(Guid imageId) { VMTemplateWithPlugInfo plugInfo = getVMTemplatesWithPlugInfo(imageId); Map<Boolean, VmTemplate> result = new HashMap<>(); if (plugInfo != null) { result.put(plugInfo.isPlugged(), plugInfo.getVmTemplate()); } return result; } private VMTemplateWithPlugInfo getVMTemplatesWithPlugInfo(Guid imageId) { return getCallsHandler().executeRead("GetVmTemplatesByImageId", vmTemplateWithPlugInfoRowMapper, getCustomMapSqlParameterSource().addValue("image_guid", imageId)); } @Override public List<VmTemplate> getAllTemplatesWithDisksOnOtherStorageDomain(Guid storageDomainGuid) { return getCallsHandler().executeReadList("GetAllVmTemplatesWithDisksOnOtherStorageDomain", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource().addValue("storage_domain_id", storageDomainGuid)); } @Override public List<VmTemplate> getAllWithoutIcon() { return getCallsHandler().executeReadList("GetVmTemplatesWithoutIcon", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource()); } @Override protected MapSqlParameterSource createFullParametersMapper(VmTemplate template) { return createBaseParametersMapper(template) .addValue("child_count", template.getChildCount()) .addValue("name", template.getName()) .addValue("status", template.getStatus()) .addValue("is_disabled", template.isDisabled()) .addValue("template_type", template.getTemplateType().name()) .addValue("base_template_id", template.getBaseTemplateId()) .addValue("template_version_name", template.getTemplateVersionName()); } @Override protected MapSqlParameterSource createIdParameterMapper(Guid id) { return getCustomMapSqlParameterSource().addValue("vmt_guid", id); } @Override public void updateStatus(Guid id, VmTemplateStatus status) { getCallsHandler().executeModification("UpdateVmTemplateStatus", createIdParameterMapper(id).addValue("status", status)); } @Override public List<VmTemplate> getTemplatesWithPermittedAction(Guid userId, ActionGroup actionGroup) { return getCallsHandler().executeReadList("fn_perms_get_templates_with_permitted_action", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("user_id", userId).addValue("action_group_id", actionGroup.getId())); } @Override public int getCount() { return getCallsHandler().executeRead("GetTemplateCount", SingleColumnRowMapper.newInstance(Integer.class), getCustomMapSqlParameterSource()); } @Override public List<VmTemplate> getAllForNetwork(Guid id) { return getCallsHandler().executeReadList("GetVmTemplatesByNetworkId", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("network_id", id)); } @Override public List<VmTemplate> getAllForVnicProfile(Guid vnicProfileId) { return getCallsHandler().executeReadList("GetVmTemplatesByVnicProfileId", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("vnic_profile_id", vnicProfileId)); } @Override public List<VmTemplate> getTemplateVersionsForBaseTemplate(Guid id) { return getCallsHandler().executeReadList("GetTemplateVersionsForBaseTemplate", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("base_template_id", id)); } @Override public VmTemplate getTemplateWithLatestVersionInChain(Guid id) { return getCallsHandler().executeRead("GetTemplateWithLatestVersionInChain", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("template_id", id)); } @Override public void shiftBaseTemplate(Guid baseTemplateId) { getCallsHandler().executeModification("UpdateVmTemplateShiftBaseTemplate", getCustomMapSqlParameterSource().addValue("base_template_id", baseTemplateId)); } @Override public List<VmTemplate> getAllForCpuProfile(Guid cpuProfileId) { return getCallsHandler().executeReadList("GetVmTemplatesByCpuProfileId", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("cpu_profile_id", cpuProfileId)); } @Override public List<VmTemplate> getAllForDiskProfile(Guid diskProfileId) { return getCallsHandler().executeReadList("GetAllVmTemplatesRelatedToDiskProfile", VMTemplateRowMapper.instance, getCustomMapSqlParameterSource() .addValue("disk_profile_id", diskProfileId)); } private static final class VMTemplateRowMapper extends AbstractVmRowMapper<VmTemplate> { public static final VMTemplateRowMapper instance = new VMTemplateRowMapper(); @Override public VmTemplate mapRow(ResultSet rs, int rowNum) throws SQLException { final VmTemplate entity = new VmTemplate(); map(rs, entity); entity.setId(getGuidDefaultEmpty(rs, "vmt_guid")); entity.setChildCount(rs.getInt("child_count")); entity.setName(rs.getString("name")); entity.setClusterId(getGuid(rs, "cluster_id")); entity.setStatus(VmTemplateStatus.forValue(rs.getInt("status"))); entity.setClusterName(rs.getString("cluster_name")); entity.setClusterCompatibilityVersion(new VersionRowMapper("cluster_compatibility_version").mapRow(rs, rowNum)); entity.setStoragePoolId(getGuid(rs, "storage_pool_id")); entity.setStoragePoolName(rs.getString("storage_pool_name")); entity.setQuotaName(rs.getString("quota_name")); entity.setQuotaEnforcementType(QuotaEnforcementTypeEnum.forValue(rs.getInt("quota_enforcement_type"))); entity.setDisabled(rs.getBoolean("is_disabled")); entity.setTrustedService(rs.getBoolean("trusted_service")); entity.setTemplateType(VmEntityType.valueOf(rs.getString("entity_type"))); entity.setClusterArch(ArchitectureType.forValue(rs.getInt("architecture"))); entity.setBaseTemplateId(getGuidDefaultEmpty(rs, "base_template_id")); entity.setTemplateVersionNumber(rs.getInt("template_version_number")); entity.setTemplateVersionName(rs.getString("template_version_name")); return entity; } } @Override protected RowMapper<VmTemplate> createEntityRowMapper() { return VMTemplateRowMapper.instance; } private static class VMTemplateWithPlugInfo { public VmTemplate getVmTemplate() { return vmTemplate; } public void setVmTemplate(VmTemplate vmTemplate) { this.vmTemplate = vmTemplate; } public boolean isPlugged() { return isPlugged; } public void setPlugged(boolean isPlugged) { this.isPlugged = isPlugged; } private VmTemplate vmTemplate; private boolean isPlugged; } private static final RowMapper<VMTemplateWithPlugInfo> vmTemplateWithPlugInfoRowMapper = (rs, rowNum) -> { VMTemplateWithPlugInfo entity = new VMTemplateWithPlugInfo(); entity.setPlugged(rs.getBoolean("is_plugged")); entity.setVmTemplate(VMTemplateRowMapper.instance.mapRow(rs, rowNum)); return entity; }; }