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