Liron Ar has uploaded a new change for review. Change subject: core: add StorageDomainOvfInfo entity/db ......................................................................
core: add StorageDomainOvfInfo entity/db This patch adds the StorageDomainOvfInfo entity along implementation of the needed dao and stored procedures. This entity is used to determine which disk is used as the ovf store of each domain and if the ovf data on that disk is up to date. Change-Id: I6cd52f5b9f14559bcec224dee868cf267cd15ebe Signed-off-by: Liron Aravot <lara...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainOvfInfo.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainOvfInfoDao.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainOvfInfoDbFacadeImpl.java M packaging/dbscripts/create_functions.sql M packaging/dbscripts/create_views.sql M packaging/dbscripts/storages_sp.sql A packaging/dbscripts/upgrade/03_04_0250_add_storage_domain_ovf.sql 8 files changed, 312 insertions(+), 8 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/61/23461/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java index c34ba90..4c66f6e 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java @@ -41,7 +41,6 @@ import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; -import org.ovirt.engine.core.dao.VdsDynamicDAO; import org.ovirt.engine.core.utils.log.Log; import org.ovirt.engine.core.utils.log.LogFactory; import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; @@ -290,10 +289,6 @@ log.debugFormat("Decreasing vds {0} pending vcpu count by {1} and vmem size by {2} (Vm: {3})", vdsId, numOfCpus, minAllocatedMem, vmName); } - } - - protected VdsDynamicDAO getVdsDynamicDao() { - return DbFacade.getInstance().getVdsDynamicDao(); } /** diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainOvfInfo.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainOvfInfo.java new file mode 100644 index 0000000..73298f2 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainOvfInfo.java @@ -0,0 +1,75 @@ +package org.ovirt.engine.core.common.businessentities; + +import java.util.HashSet; + +import org.ovirt.engine.core.compat.Guid; + +public class StorageDomainOvfInfo implements BusinessEntity<Guid> { + private Guid storageDomainId; + private HashSet<Guid> storedOvfIds; + private Guid ovfDiskId; + private Guid storagePoolId; + private boolean updated; + + public StorageDomainOvfInfo(Guid storageDomainId, HashSet<Guid> storedOvfIds, + Guid ovfDiskId, Guid storagePoolId, boolean updated) { + this.storageDomainId = storageDomainId; + this.storedOvfIds = storedOvfIds; + this.ovfDiskId = ovfDiskId; + this.storagePoolId = storagePoolId; + this.updated = updated; + } + + public StorageDomainOvfInfo() { + } + + public boolean isUpdated() { + return updated; + } + + public void setUpdated(boolean updated) { + this.updated = updated; + } + + public Guid getStorageDomainId() { + return storageDomainId; + } + + public void setStorageDomainId(Guid storageDomainId) { + this.storageDomainId = storageDomainId; + } + + public Guid getOvfDiskId() { + return ovfDiskId; + } + + public void setOvfDiskId(Guid ovfDiskId) { + this.ovfDiskId = ovfDiskId; + } + + public Guid getStoragePoolId() { + return storagePoolId; + } + + public void setStoragePoolId(Guid storagePoolId) { + this.storagePoolId = storagePoolId; + } + + @Override + public Guid getId() { + return storageDomainId; + } + + @Override + public void setId(Guid id) { + storageDomainId = id; + } + + public HashSet<Guid> getStoredOvfIds() { + return storedOvfIds; + } + + public void setStoredOvfIds(HashSet<Guid> storedOvfIds) { + this.storedOvfIds = storedOvfIds; + } +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainOvfInfoDao.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainOvfInfoDao.java new file mode 100644 index 0000000..906bf8d --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainOvfInfoDao.java @@ -0,0 +1,38 @@ +package org.ovirt.engine.core.dao; + +import java.util.Collection; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.StorageDomainOvfInfo; +import org.ovirt.engine.core.compat.Guid; + + +public interface StorageDomainOvfInfoDao extends GenericDao<StorageDomainOvfInfo, Guid> { + /** + * Updates the ovf updated flag of the given domain ids to the given values + * + * + * @param ids + * - storage domains ids + * @param updated + * - boolean indicating whether the ovf data is updated + * @return + */ + public void updateOvfUpdatedInfo(Collection<Guid> ids, boolean updated); + + /** + * Get the ovf info for storage domains that need ovf update + * + * @param storagePoolId + * - storage pool id + */ + public List<StorageDomainOvfInfo> loadStorageDomainsInfoByPoolId(Guid storagePoolId); + + /** + * Get the ovf info for storage domains that need ovf update + * + * @param storageDomainId + * - storage domain id + */ + public StorageDomainOvfInfo loadStorageDomainsInfoByDomainId(Guid storageDomainId); +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainOvfInfoDbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainOvfInfoDbFacadeImpl.java new file mode 100644 index 0000000..599c5cb --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainOvfInfoDbFacadeImpl.java @@ -0,0 +1,92 @@ +package org.ovirt.engine.core.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.common.businessentities.StorageDomainOvfInfo; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.utils.GuidUtils; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; + +public class StorageDomainOvfInfoDbFacadeImpl extends DefaultGenericDaoDbFacade<StorageDomainOvfInfo, Guid> implements StorageDomainOvfInfoDao{ + + public StorageDomainOvfInfoDbFacadeImpl() { + super("StorageDomainOvfInfo"); + } + + @Override + public void updateOvfUpdatedInfo(Collection<Guid> ids, boolean updated) { + getCallsHandler().executeModification("UpdateOvfUpdatedInfo", getCustomMapSqlParameterSource() + .addValue("storage_domains_ids", StringUtils.join(ids, ',')) + .addValue("updated", updated)); } + + @Override + public List<StorageDomainOvfInfo> loadStorageDomainsInfoByPoolId(Guid storagePoolId) { + return getCallsHandler().executeReadList("LoadStorageDomainInfoByPoolId", + storageDomainInfoRowMapper, + getCustomMapSqlParameterSource().addValue("storage_pool_id", storagePoolId)); + } + + @Override + public StorageDomainOvfInfo loadStorageDomainsInfoByDomainId(Guid storageDomainId) { + return getCallsHandler().executeRead("LoadStorageDomainInfoByDomainId", + storageDomainInfoRowMapper, + getCustomMapSqlParameterSource().addValue("storage_domain_id", storageDomainId)); + } + + private static final RowMapper<StorageDomainOvfInfo> storageDomainInfoRowMapper = new RowMapper<StorageDomainOvfInfo>() { + + @Override + public StorageDomainOvfInfo mapRow(ResultSet resultSet, int i) throws SQLException { + StorageDomainOvfInfo toReturn = new StorageDomainOvfInfo(); + toReturn.setStorageDomainId(getGuid(resultSet, "storage_domain_id")); + toReturn.setStoragePoolId(getGuid(resultSet, "storage_pool_id")); + toReturn.setUpdated(resultSet.getBoolean("ovf_updated")); + toReturn.setOvfDiskId(getGuid(resultSet, "ovf_disk_id")); + String storedOvfs = resultSet.getString("stored_ovfs_ids"); + if (storedOvfs != null && !storedOvfs.isEmpty()) { + toReturn.setStoredOvfIds(new HashSet<>(GuidUtils.getGuidListFromStringArray(Arrays.asList(StringUtils.split(resultSet.getString("stored_ovfs_ids"), ','))))); + } else { + toReturn.setStoredOvfIds(new HashSet<Guid>()); + } + return toReturn; + } + }; + + @Override + protected MapSqlParameterSource createFullParametersMapper(StorageDomainOvfInfo entity) { + return createIdParameterMapper(entity.getId()).addValue("v_storage_domain_id", entity.getStorageDomainId()) + .addValue("storage_pool_id", entity.getStoragePoolId()) + .addValue("ovf_updated", entity.isUpdated()) + .addValue("ovf_disk_id", entity.getOvfDiskId()) + .addValue("stored_ovfs_ids", StringUtils.join(entity.getStoredOvfIds(), ',')); + } + + @Override + public StorageDomainOvfInfo get(Guid guid) { + return getCallsHandler().executeRead("LoadStorageDomainInfoByDomainId", + storageDomainInfoRowMapper, + getCustomMapSqlParameterSource().addValue("storage_domain_id", guid)); + } + + @Override + public List<StorageDomainOvfInfo> getAll() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + protected MapSqlParameterSource createIdParameterMapper(Guid guid) { + return getCustomMapSqlParameterSource().addValue("storage_domain_id", guid); + } + + @Override + protected RowMapper<StorageDomainOvfInfo> createEntityRowMapper() { + return storageDomainInfoRowMapper; + } +} diff --git a/packaging/dbscripts/create_functions.sql b/packaging/dbscripts/create_functions.sql index a808589..090b1f2 100644 --- a/packaging/dbscripts/create_functions.sql +++ b/packaging/dbscripts/create_functions.sql @@ -53,6 +53,17 @@ +CREATE OR REPLACE FUNCTION public.fnSplitterWithSeperator(ids TEXT, seperator VARCHAR(10)) RETURNS SETOF idTextType IMMUTABLE AS +$function$ +BEGIN + RETURN QUERY + SELECT regexp_split_to_table(ids, seperator) AS id; +END; $function$ +LANGUAGE plpgsql; + + + + --All permissions of current user (include groups) DROP TYPE IF EXISTS user_permissions CASCADE; CREATE TYPE user_permissions AS(permission_id UUID, role_id UUID, user_id UUID); diff --git a/packaging/dbscripts/create_views.sql b/packaging/dbscripts/create_views.sql index ebcc883..b213587 100644 --- a/packaging/dbscripts/create_views.sql +++ b/packaging/dbscripts/create_views.sql @@ -74,7 +74,8 @@ disk_image_dynamic.write_latency_seconds as write_latency_seconds, disk_image_dynamic.flush_latency_seconds as flush_latency_seconds, base_disks.alignment as alignment, - base_disks.last_alignment_scan as last_alignment_scan + base_disks.last_alignment_scan as last_alignment_scan, + EXISTS (SELECT 1 FROM storage_domains_ovf_info WHERE images.image_group_id = storage_domains_ovf_info.ovf_disk_id) as ovf_store FROM images left outer join disk_image_dynamic on images.image_guid = disk_image_dynamic.image_id @@ -139,7 +140,7 @@ images_storage_domain_view.entity_type as entity_type,images_storage_domain_view.number_of_vms as number_of_vms,images_storage_domain_view.vm_names as vm_names, storage_for_image_view.quota_id as quota_id, storage_for_image_view.quota_name as quota_name, images_storage_domain_view.quota_enforcement_type, images_storage_domain_view.disk_id, images_storage_domain_view.disk_alias as disk_alias, images_storage_domain_view.disk_description as disk_description,images_storage_domain_view.shareable as shareable, - images_storage_domain_view.alignment as alignment, images_storage_domain_view.last_alignment_scan as last_alignment_scan + images_storage_domain_view.alignment as alignment, images_storage_domain_view.last_alignment_scan as last_alignment_scan, images_storage_domain_view.ovf_store as ovf_store FROM images_storage_domain_view INNER JOIN disk_image_dynamic ON images_storage_domain_view.image_guid = disk_image_dynamic.image_id INNER JOIN storage_for_image_view ON images_storage_domain_view.image_guid = storage_for_image_view.image_id @@ -193,6 +194,7 @@ storage_for_image_view.quota_id as quota_id, -- Quota fields storage_for_image_view.quota_name as quota_name, quota_enforcement_type, + ovf_store, null AS lun_id, -- LUN fields null AS physical_volume_id, null AS volume_group_id, @@ -235,6 +237,7 @@ null AS quota_id, -- Quota fields null AS quota_name, null AS quota_enforcement_type, + false as ovf_store, l.lun_id, -- LUN fields l.physical_volume_id, l.volume_group_id, diff --git a/packaging/dbscripts/storages_sp.sql b/packaging/dbscripts/storages_sp.sql index 303f8e7..96b69d8 100644 --- a/packaging/dbscripts/storages_sp.sql +++ b/packaging/dbscripts/storages_sp.sql @@ -262,9 +262,88 @@ ---------------------------------------------------------------- +-- [storage_domains_ovf_info] Table +-- +Create or replace FUNCTION LoadStorageDomainInfoByPoolId(v_storage_pool_id UUID) RETURNS SETOF storage_domains_ovf_info STABLE + AS $procedure$ +BEGIN +RETURN QUERY SELECT * + FROM storage_domains_ovf_info ovf + WHERE ovf.storage_pool_id = v_storage_pool_id; +END; $procedure$ +LANGUAGE plpgsql; + + + +Create or replace FUNCTION LoadStorageDomainInfoByDomainId(v_storage_domain_id UUID) RETURNS SETOF storage_domains_ovf_info STABLE + AS $procedure$ +BEGIN +RETURN QUERY SELECT * + FROM storage_domains_ovf_info ovf + WHERE ovf.storage_domain_id = v_storage_domain_id; +END; $procedure$ +LANGUAGE plpgsql; + + + +Create or replace FUNCTION InsertStorageDomainOvfInfo(v_storage_domain_id UUID, v_storage_pool_id UUID, v_ovf_updated BOOLEAN, v_ovf_disk_id UUID, +v_stored_ovfs_ids TEXT) RETURNS VOID + AS $procedure$ +BEGIN +INSERT INTO storage_domains_ovf_info (storage_domain_id, storage_pool_id, ovf_updated, ovf_disk_id, stored_ovfs_ids) +VALUES(v_storage_domain_id, v_storage_pool_id, v_ovf_updated, v_ovf_disk_id, +v_stored_ovfs_ids); +END; $procedure$ +LANGUAGE plpgsql; + + + +Create or replace FUNCTION UpdateStorageDomainOvfInfo(v_storage_domain_id UUID, v_storage_pool_id UUID, v_ovf_updated BOOLEAN, v_ovf_disk_id UUID, +v_stored_ovfs_ids TEXT) RETURNS VOID + AS $procedure$ +BEGIN +UPDATE storage_domains_ovf_info SET storage_pool_id = v_storage_pool_id, ovf_updated = v_ovf_updated, +ovf_disk_id = v_ovf_disk_id, stored_ovfs_ids = v_stored_ovfs_ids +WHERE storage_domain_id = v_storage_domain_id; +END; $procedure$ +LANGUAGE plpgsql; + + + +Create or replace FUNCTION DeleteStorageDomainOvfInfo(v_storage_domain_id UUID) RETURNS VOID + AS $procedure$ +BEGIN +DELETE FROM storage_domains_ovf_info where storage_domain_id = v_storage_domain_id; +END; $procedure$ +LANGUAGE plpgsql; + + + +Create or replace FUNCTION UpdateOvfUpdatedInfo(v_storage_domains_ids VARCHAR(5000), v_updated BOOLEAN) + RETURNS VOID + AS $procedure$ +DECLARE +curs_storages_ids CURSOR FOR SELECT * FROM fnSplitterUuid(v_storage_domains_ids); +id UUID; +BEGIN + OPEN curs_storages_ids; +LOOP + FETCH curs_storages_ids INTO id; + IF NOT FOUND THEN + EXIT; + END IF; + UPDATE storage_domains_ovf_info + SET ovf_updated = v_updated WHERE storage_domain_id = id; +END LOOP; +CLOSE curs_storages_ids; +END; $procedure$ +LANGUAGE plpgsql; + + + +-- ---------------------------------------------------------------- -- [storage_domain_static] Table -- - --This function is also called during installation. If you change it, please verify --that functions in inst_sp.sql can be executed successfully. diff --git a/packaging/dbscripts/upgrade/03_04_0250_add_storage_domain_ovf.sql b/packaging/dbscripts/upgrade/03_04_0250_add_storage_domain_ovf.sql new file mode 100644 index 0000000..bfff64a --- /dev/null +++ b/packaging/dbscripts/upgrade/03_04_0250_add_storage_domain_ovf.sql @@ -0,0 +1,11 @@ +CREATE TABLE storage_domains_ovf_info +( + storage_domain_id UUID PRIMARY KEY REFERENCES storage_domain_static(id) ON DELETE CASCADE, + storage_pool_id UUID REFERENCES storage_pool(id) ON DELETE CASCADE, + ovf_updated BOOLEAN DEFAULT TRUE, + ovf_disk_id UUID REFERENCES base_disks(disk_id) ON DELETE CASCADE, + stored_ovfs_ids TEXT +); + +CREATE INDEX IDX_storage_domains_ovf_info_storage_pool_id ON storage_domains_ovf_info(storage_pool_id); +SELECT fn_db_add_column('vm_ovf_generations', 'ovf_data', 'text'); -- To view, visit http://gerrit.ovirt.org/23461 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6cd52f5b9f14559bcec224dee868cf267cd15ebe Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Liron Ar <lara...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches