Sahina Bose has uploaded a new change for review.

Change subject: engine: Validate change to gluster network
......................................................................

engine: Validate change to gluster network

Added validations for Manage networks to prevent
gluster network role from being detached/unset
when used by bricks in cluster

Change-Id: I57398b39783dbdc5ae9f79e7d32794f416c23116
Bug-Url: https://bugzilla.redhat.com/1049994
Signed-off-by: Sahina Bose <sab...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkFromClusterInternalCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/UpdateNetworkClusterValidator.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/UpdateNetworkOnClusterCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterBrickEntity.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
M 
frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
M packaging/dbscripts/create_views.sql
M packaging/dbscripts/gluster_volumes_sp.sql
13 files changed, 85 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/77/38177/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkFromClusterInternalCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkFromClusterInternalCommand.java
index d1138f2..bdbe918 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkFromClusterInternalCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkFromClusterInternalCommand.java
@@ -39,7 +39,8 @@
                 new DetachNetworkValidator(getNetwork(), 
getParameters().getNetworkCluster());
         return validate(validator.notManagementNetwork())
                 && validate(validator.clusterNetworkNotUsedByVms())
-                && validate(validator.clusterNetworkNotUsedByTemplates());
+                && validate(validator.clusterNetworkNotUsedByTemplates())
+                && validate(validator.clusterNetworkNotUsedByBricks());
     }
 
     @Override
@@ -54,7 +55,7 @@
 
     private class DetachNetworkValidator extends NetworkValidator {
 
-        private NetworkCluster networkCluster;
+        private final NetworkCluster networkCluster;
 
         public DetachNetworkValidator(Network network, NetworkCluster 
networkCluster) {
             super(network);
@@ -81,5 +82,12 @@
                     VdcBllMessages.VAR__ENTITIES__VM_TEMPLATES,
                     VdcBllMessages.VAR__ENTITIES__VM_TEMPLATE);
         }
+
+        public ValidationResult clusterNetworkNotUsedByBricks() {
+            return 
networkNotUsed(getGlusterBrickDao().getAllByClusterAndNetworkId(networkCluster.getClusterId(),
+                    network.getId()),
+                    VdcBllMessages.VAR__ENTITIES__GLUSTER_BRICKS,
+                    VdcBllMessages.VAR__ENTITIES__GLUSTER_BRICK);
+        }
     }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/UpdateNetworkClusterValidator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/UpdateNetworkClusterValidator.java
index 5284b3a..ec76592 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/UpdateNetworkClusterValidator.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/UpdateNetworkClusterValidator.java
@@ -1,9 +1,12 @@
 package org.ovirt.engine.core.bll.network.cluster;
 
 import org.ovirt.engine.core.bll.ValidationResult;
+import org.ovirt.engine.core.common.businessentities.VDSGroup;
 import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.compat.Version;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.gluster.GlusterBrickDao;
 
 public class UpdateNetworkClusterValidator extends NetworkClusterValidatorBase 
{
 
@@ -17,6 +20,7 @@
         this.oldNetworkCluster = oldNetworkCluster;
     }
 
+    @Override
     protected boolean isManagementNetworkChanged() {
         return !oldNetworkCluster.isManagement() && 
networkCluster.isManagement();
     }
@@ -25,4 +29,19 @@
         return 
ValidationResult.failWith(VdcBllMessages.ACTION_TYPE_FAILED_MANAGEMENT_NETWORK_UNSET).
                 when(oldNetworkCluster.isManagement() && 
!networkCluster.isManagement());
     }
+
+    public ValidationResult glusterNetworkInUseAndUnset(VDSGroup cluster) {
+        return 
ValidationResult.failWith(VdcBllMessages.ACTION_TYPE_FAILED_MANAGEMENT_NETWORK_UNSET).
+                when(cluster.supportsGlusterService() && 
oldNetworkCluster.isGluster() && !networkCluster.isGluster()
+                        && isGlusterNetworkInUse());
+    }
+
+    private boolean isGlusterNetworkInUse() {
+        return 
!getGlusterBrickDao().getAllByClusterAndNetworkId(oldNetworkCluster.getClusterId(),
+                oldNetworkCluster.getNetworkId()).isEmpty();
+    }
+
+    private GlusterBrickDao getGlusterBrickDao() {
+        return DbFacade.getInstance().getGlusterBrickDao();
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/UpdateNetworkOnClusterCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/UpdateNetworkOnClusterCommand.java
index 14163ae..b7e7c51 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/UpdateNetworkOnClusterCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/UpdateNetworkOnClusterCommand.java
@@ -119,6 +119,7 @@
     private boolean validateAttachment() {
         final UpdateNetworkClusterValidator networkClusterValidator = 
createNetworkClusterValidator();
         return validate(networkClusterValidator.managementNetworkUnset()) &&
+                
validate(networkClusterValidator.glusterNetworkInUseAndUnset(getVdsGroup())) &&
                validateAttachment(networkClusterValidator);
     }
 
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterBrickEntity.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterBrickEntity.java
index c3c037b..b87dfd2 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterBrickEntity.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterBrickEntity.java
@@ -5,6 +5,7 @@
 import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask;
 import org.ovirt.engine.core.common.businessentities.BusinessEntityWithStatus;
 import org.ovirt.engine.core.common.businessentities.IVdcQueryable;
+import org.ovirt.engine.core.common.businessentities.Nameable;
 import org.ovirt.engine.core.common.utils.ObjectUtils;
 import org.ovirt.engine.core.common.validation.group.CreateEntity;
 import org.ovirt.engine.core.common.validation.group.gluster.AddBrick;
@@ -20,7 +21,7 @@
  * @see GlusterVolumeEntity
  * @see GlusterBrickStatus
  */
-public class GlusterBrickEntity extends IVdcQueryable implements 
BusinessEntityWithStatus<Guid, GlusterStatus>, GlusterTaskSupport {
+public class GlusterBrickEntity extends IVdcQueryable implements 
BusinessEntityWithStatus<Guid, GlusterStatus>, GlusterTaskSupport, Nameable {
     private static final long serialVersionUID = 7119439284741452278L;
 
     @NotNull(message = "VALIDATION.GLUSTER.BRICK.ID.NOT_NULL", groups = { 
RemoveBrick.class })
@@ -237,4 +238,9 @@
         this.volumeName = volumeName;
     }
 
+    @Override
+    public String getName() {
+        return getQualifiedName();
+    }
+
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
index 91f30a6..8a7b02e 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
@@ -10,6 +10,8 @@
     VAR__TYPE__VM,
     VAR__ENTITIES__VMS,
     VAR__ENTITIES__VM,
+    VAR__ENTITIES__GLUSTER_BRICKS,
+    VAR__ENTITIES__GLUSTER_BRICK,
     VAR__TYPE__QUOTA,
     VAR__TYPE__VM__CLUSTER,
     VAR__TYPE__VM_TEMPLATE,
@@ -587,6 +589,7 @@
     ACTION_TYPE_FAILED_PROVIDER_DOESNT_EXIST(ErrorType.BAD_PARAMETERS),
     ACTION_TYPE_FAILED_MANAGEMENT_NETWORK_REQUIRED(ErrorType.BAD_PARAMETERS),
     ACTION_TYPE_FAILED_MANAGEMENT_NETWORK_UNSET(ErrorType.BAD_PARAMETERS),
+    ACTION_TYPE_FAILED_GLUSTER_NETWORK_INUSE(ErrorType.BAD_PARAMETERS),
     
ACTION_TYPE_FAILED_NETWORK_ADDRESS_CANNOT_BE_CHANGED(ErrorType.BAD_PARAMETERS),
     ACTION_TYPE_FAILED_EXTERNAL_NETWORK_ALREADY_EXISTS(ErrorType.CONFLICT),
     
ACTION_TYPE_FAILED_EXTERNAL_NETWORK_DETAILS_CANNOT_BE_EDITED(ErrorType.NOT_SUPPORTED),
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java
index 8f7af26..86f0505 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java
@@ -46,6 +46,7 @@
 import org.ovirt.engine.core.dao.VmStaticDAO;
 import org.ovirt.engine.core.dao.VmStatisticsDAO;
 import org.ovirt.engine.core.dao.VmTemplateDAO;
+import org.ovirt.engine.core.dao.gluster.GlusterBrickDao;
 import org.ovirt.engine.core.dao.gluster.GlusterHooksDao;
 import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao;
 import org.ovirt.engine.core.dao.network.InterfaceDao;
@@ -609,6 +610,10 @@
         return getDbFacade().getGlusterHooksDao();
     }
 
+    public GlusterBrickDao getGlusterBrickDao() {
+        return getDbFacade().getGlusterBrickDao();
+    }
+
     public StorageDomainDAO getStorageDomainDAO() {
         return getDbFacade().getStorageDomainDao();
     }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
index a804aca..26dfb9e 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDao.java
@@ -64,4 +64,6 @@
     public void updateBrickProperties(List<GlusterBrickEntity> bricks);
 
     public void updateBrickNetworkId(Guid brickId, Guid networkId);
+
+    public List<GlusterBrickEntity> getAllByClusterAndNetworkId(Guid 
clusterId, Guid networkId);
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
index 20b0676..dc03889 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterBrickDaoDbFacadeImpl.java
@@ -186,6 +186,15 @@
     }
 
     @Override
+    public List<GlusterBrickEntity> getAllByClusterAndNetworkId(Guid 
clusterId, Guid networkId) {
+        return 
getCallsHandler().executeReadList("GetBricksByClusterIdAndNetworkId",
+                brickRowMapper,
+                getCustomMapSqlParameterSource()
+                        .addValue("cluster_id", clusterId)
+                        .addValue("network_id", networkId));
+    }
+
+    @Override
     protected MapSqlParameterSource 
createFullParametersMapper(GlusterBrickEntity brick) {
         return createBrickParams(brick);
     }
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
index cbd7db5..44b497f 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -290,6 +290,8 @@
 VAR__TYPE__VM=$type VM
 VAR__ENTITIES__VMS=$entities virtual machines
 VAR__ENTITIES__VM=$entities virtual machine
+VAR__ENTITIES__GLUSTER_BRICKS=$entities gluster bricks
+VAR__ENTITIES__GLUSTER_BRICK=$entities gluster brick
 VAR__TYPE__QUOTA=$type Quota
 VAR__TYPE__COMPUTER_ACCOUNT=$type Computer Account
 VAR__TYPE__VM_TEMPLATE=$type Template
@@ -649,6 +651,7 @@
 VM_CLUSTER_IS_NOT_VALID=Cannot ${action} ${type}. Cluster ID is not valid.
 NETWORK_CANNOT_REMOVE_MANAGEMENT_NETWORK=The Management Network 
('${NetworkName}') is mandatory and cannot be removed.
 ACTION_TYPE_FAILED_MANAGEMENT_NETWORK_UNSET=Cannot ${action} ${type}. 
Unsetting management network property is not allowed. It is done automatically 
when moving the role to another network.
+ACTION_TYPE_FAILED_GLUSTER_NETWORK_INUSE==Cannot ${action} ${type}. Unsetting 
gluster network property is not allowed when it is used by gluster bricks on 
volumes. The gluster volumes will need to be removed to change this.
 NETWORK_CANNOT_REMOVE_ISCSI_BOND_NETWORK=The Network ('${NetworkName}') could 
not be removed since several iSCSI bonds (${IscsiBonds_COUNTER}) are using this 
network:\n ${IscsiBonds}.\nPlease remove the network first from those iSCSI bon
 NETWORK_OLD_NETWORK_NOT_SPECIFIED=Previous network name is required.
 ACTION_TYPE_FAILED_DETECTED_ACTIVE_VMS=Cannot ${action} ${type}. Active VMs 
were detected.\n\
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
index 44e7962..ccbc18b 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
@@ -784,6 +784,12 @@
     @DefaultStringValue("$entities virtual machine")
     String VAR__ENTITIES__VM();
 
+    @DefaultStringValue("$entities gluster bricks")
+    String VAR__ENTITIES__GLUSTER_BRICKS();
+
+    @DefaultStringValue("$entities gluster brick")
+    String VAR__ENTITIES__GLUSTER_BRICK();
+
     @DefaultStringValue("$type Quota")
     String VAR__TYPE__QUOTA();
 
@@ -1777,6 +1783,9 @@
     @DefaultStringValue("Cannot ${action} ${type}. Unsetting management 
network property is not allowed.")
     String ACTION_TYPE_FAILED_MANAGEMENT_NETWORK_UNSET();
 
+    @DefaultStringValue("Cannot ${action} ${type}. Unsetting gluster network 
property is not allowed when it is used by gluster bricks on volumes. The 
gluster volumes will need to be removed to change this.")
+    String ACTION_TYPE_FAILED_GLUSTER_NETWORK_INUSE();
+
     @DefaultStringValue("The Network ('${NetworkName}') could not be removed 
since several iSCSI bonds (${IscsiBonds_COUNTER}) are using this network:\n 
${IscsiBonds}.\nPlease remove the network first from those iSCSI bonds, and try 
again.")
     String NETWORK_CANNOT_REMOVE_ISCSI_BOND_NETWORK();
 
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
 
b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
index 82fccad..614765e 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
+++ 
b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
@@ -287,6 +287,8 @@
 VAR__TYPE__VM=$type VM
 VAR__ENTITIES__VMS=$entities virtual machines
 VAR__ENTITIES__VM=$entities virtual machine
+VAR__ENTITIES__GLUSTER_BRICKS=$entities gluster bricks
+VAR__ENTITIES__GLUSTER_BRICK=$entities gluster brick
 VAR__TYPE__QUOTA=$type Quota
 VAR__TYPE__COMPUTER_ACCOUNT=$type Computer Account
 VAR__TYPE__VM_TEMPLATE=$type Template
diff --git a/packaging/dbscripts/create_views.sql 
b/packaging/dbscripts/create_views.sql
index 99eb57a..6d77a5f 100644
--- a/packaging/dbscripts/create_views.sql
+++ b/packaging/dbscripts/create_views.sql
@@ -3023,7 +3023,8 @@
 SELECT gluster_volume_bricks.*,
        vds_static.host_name AS vds_name,
        gluster_volumes.vol_name AS volume_name,
-       vds_interface.addr as interface_address
+       vds_interface.addr as interface_address,
+       gluster_volumes.cluster_id as cluster_id
 FROM gluster_volume_bricks
 INNER JOIN vds_static ON vds_static.vds_id = gluster_volume_bricks.server_id
 INNER JOIN gluster_volumes ON gluster_volumes.id = 
gluster_volume_bricks.volume_id
diff --git a/packaging/dbscripts/gluster_volumes_sp.sql 
b/packaging/dbscripts/gluster_volumes_sp.sql
index 89e1e94..835650f 100644
--- a/packaging/dbscripts/gluster_volumes_sp.sql
+++ b/packaging/dbscripts/gluster_volumes_sp.sql
@@ -618,3 +618,16 @@
 WHERE id = v_volume_id;
 END; $procedure$
 LANGUAGE plpgsql;
+
+
+Create or replace FUNCTION GetBricksByClusterIdAndNetworkId(v_cluster_id UUID,
+                                                            v_network_id UUID)
+RETURNS SETOF gluster_volume_bricks_view STABLE
+   AS $procedure$
+BEGIN
+   RETURN QUERY SELECT *
+   FROM  gluster_volume_bricks_view
+   WHERE network_id = v_network_id
+   AND cluster_id = v_cluster_id;
+END; $procedure$
+LANGUAGE plpgsql;


-- 
To view, visit https://gerrit.ovirt.org/38177
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I57398b39783dbdc5ae9f79e7d32794f416c23116
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Sahina Bose <sab...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to