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

Reply via email to