Vered Volansky has uploaded a new change for review. Change subject: core: Add storage space thresholds support ......................................................................
core: Add storage space thresholds support This patch adds two thresholds per domain: FreeSpaceLow (Percentage) and FreeSpaceCriticalkLow (absolute value. The initial and default values for these thresholds are taken from configuration/vdc_options table. Change-Id: I19621dfc770c69003d731a7593d037d7d4040a82 Signed-off-by: Vered Volansky <vvola...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageDomainCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/StorageDomainParametersBase.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomain.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatic.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainDAODbFacadeImpl.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainStaticDAODbFacadeImpl.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd M backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResourceTest.java M backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java M backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java M backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/StorageDomainMapperTest.java M backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/StorageDomainFieldAutoCompleter.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/NfsStorageModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageGeneralModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java M frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.ui.xml M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageGeneralView.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/inst_sp.sql M packaging/dbscripts/storages_sp.sql A packaging/dbscripts/upgrade/03_06_0540_add_thresholds_to_storage_domain_static.sql 29 files changed, 350 insertions(+), 40 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/77/35277/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageDomainCommand.java index 839b5e4..eef1547 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageDomainCommand.java @@ -37,18 +37,8 @@ oldDomain = getStorageDomainStaticDAO().get(getStorageDomain().getId()); getStorageDomain().setLastTimeUsedAsMaster(oldDomain.getLastTimeUsedAsMaster()); - // Collect changed fields to update in a list. - List<String> props = ObjectIdentityChecker.GetChangedFields(oldDomain, getStorageDomain() - .getStorageStaticData()); - - // Allow change only to name & description field - props.remove("storageName"); - props.remove("description"); - props.remove("comment"); - if (!props.isEmpty()) { - log.warn("There was an attempt to update the following fields although they are not allowed to be updated: {}", - StringUtils.join(props, ",")); - return failCanDoAction(VdcBllMessages.ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS); + if (!validateUpdateableFields()) { + return false; } _storageDomainNameChanged = @@ -66,6 +56,25 @@ return true; } + protected boolean validateUpdateableFields() { + // props - fields to be updated. + List<String> props = ObjectIdentityChecker.GetChangedFields(oldDomain, getStorageDomain() + .getStorageStaticData()); + + // Allow change to the following fields only + props.remove("storageName"); + props.remove("description"); + props.remove("comment"); + props.remove("freeSpaceLow"); + props.remove("freeSpaceCriticalLow"); + if (!props.isEmpty()) { + log.warn("There was an attempt to update the following fields although they are not allowed to be updated: {}", + StringUtils.join(props, ",")); + return failCanDoAction(VdcBllMessages.ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS); + } + return true; + } + @Override protected void setActionMessageParameters() { super.setActionMessageParameters(); diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/StorageDomainParametersBase.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/StorageDomainParametersBase.java index 51bcf8a..e9f7316 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/StorageDomainParametersBase.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/StorageDomainParametersBase.java @@ -10,6 +10,9 @@ private Guid quotaId; private Guid diskProfileId; + /*private int freeSpaceLowThreshold; + private int freeSpaceCriticalLowThreshold;*/ + public StorageDomainParametersBase() { storageDomainId = Guid.Empty; } @@ -24,6 +27,22 @@ setStorageDomainId(storageDomainId); } + /*public int getFreeSpaceLowThreshold() { + return freeSpaceLowThreshold; + } + + public void setFreeSpaceLowThreshold(int freeSpaceLowThreshold) { + this.freeSpaceLowThreshold = freeSpaceLowThreshold; + } + + public int getFreeSpaceCriticalLowThreshold() { + return freeSpaceCriticalLowThreshold; + } + + public void setFreeSpaceCriticalLowThreshold(int freeSpaceCriticalLowThreshold) { + this.freeSpaceCriticalLowThreshold = freeSpaceCriticalLowThreshold; + }*/ + public Guid getStorageDomainId() { return storageDomainId; } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomain.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomain.java index ce9f090..1ba71e7 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomain.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomain.java @@ -137,6 +137,22 @@ return getAvailableDiskSize() * SizeConverter.BYTES_IN_GB; } + public Integer getFreeSpaceLow() { + return staticData.getFreeSpaceLow(); + } + + public void setFreeSpaceLow(int freeSpaceLow) { + staticData.setFreeSpaceLow(freeSpaceLow); + } + + public Integer getFreeSpaceCriticalLow() { + return staticData.getFreeSpaceCriticalLow(); + } + + public void setFreeSpaceCriticalLow(int freeSpaceCriticalLow) { + staticData.setFreeSpaceCriticalLow(freeSpaceCriticalLow); + } + public void setAvailableDiskSize(Integer availableDiskSize) { getStorageDynamicData().setAvailableDiskSize(availableDiskSize); UpdateTotalDiskSize(); diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatic.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatic.java index ecb3eb0..256b3b9 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatic.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatic.java @@ -47,6 +47,10 @@ private transient long lastTimeUsedAsMaster; + private int freeSpaceLow; + + private int freeSpaceCriticalLow; + public StorageDomainStatic() { id = Guid.Empty; storageType = StorageDomainType.Master; @@ -161,6 +165,22 @@ this.sanState = sanState; } + public int getFreeSpaceLow() { + return freeSpaceLow; + } + + public void setFreeSpaceLow(int freeSpaceLow) { + this.freeSpaceLow = freeSpaceLow; + } + + public int getFreeSpaceCriticalLow() { + return freeSpaceCriticalLow; + } + + public void setFreeSpaceCriticalLow(int freeSpaceCriticalLow) { + this.freeSpaceCriticalLow = freeSpaceCriticalLow; + } + @Override public String getName() { return getStorageName(); @@ -181,6 +201,8 @@ result = prime * result + ((storageType == null) ? 0 : storageType.hashCode()); result = prime * result + ((description == null) ? 0 : description.hashCode()); result = prime * result + ((sanState == null) ? 0 : sanState.hashCode()); + result = prime * freeSpaceLow; + result = prime * freeSpaceCriticalLow; return result; } @@ -206,7 +228,9 @@ && storagePoolType == other.storagePoolType && storageType == other.storageType && sanState == other.sanState - && ObjectUtils.objectsEqual(description, other.description)); + && ObjectUtils.objectsEqual(description, other.description)) + && freeSpaceLow == other.freeSpaceLow + && freeSpaceCriticalLow == other.freeSpaceCriticalLow; } @Override diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainDAODbFacadeImpl.java index 914f4b3..471db71 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainDAODbFacadeImpl.java @@ -173,6 +173,8 @@ entity.setAutoRecoverable(rs.getBoolean("recoverable")); entity.setContainsUnregisteredEntities(rs.getBoolean("contains_unregistered_entities")); entity.setLastTimeUsedAsMaster(rs.getLong("last_time_used_as_master")); + entity.setFreeSpaceLow(rs.getInt("free_space_low")); + entity.setFreeSpaceCriticalLow(rs.getInt("free_space_critical_low")); return entity; } } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainStaticDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainStaticDAODbFacadeImpl.java index 8b40202..153173a 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainStaticDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/StorageDomainStaticDAODbFacadeImpl.java @@ -84,7 +84,9 @@ .addValue("storage_domain_type", domain.getStorageDomainType()) .addValue("storage_domain_format_type", domain.getStorageFormat()) - .addValue("last_time_used_as_master", domain.getLastTimeUsedAsMaster()); + .addValue("last_time_used_as_master", domain.getLastTimeUsedAsMaster()) + .addValue("free_space_low", domain.getFreeSpaceLow()) + .addValue("free_space_critical_low", domain.getFreeSpaceCriticalLow()); } @Override @@ -111,6 +113,8 @@ entity.setStorageFormat(StorageFormatType.forValue(rs .getString("storage_domain_format_type"))); entity.setLastTimeUsedAsMaster(rs.getLong("last_time_used_as_master")); + entity.setFreeSpaceLow(rs.getInt("free_space_low")); + entity.setFreeSpaceCriticalLow(rs.getInt("free_space_critical_low")); return entity; } } 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 d14e990..695fad2 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -558,7 +558,7 @@ ACTION_TYPE_FAILED_STORAGE_DOMAIN_FORMAT_ILLEGAL_HOST=Cannot ${action} ${type}. Storage format ${storageFormat} is not supported on the selected host version. ERROR_CANNOT_EXTEND_NON_DATA_DOMAIN=Cannot extend Storage Domain. Extend operation is supported only on Data Storage Domain. ERROR_CANNOT_EXTEND_CONNECTION_FAILED=Cannot extend Storage Domain. Storage device ${lun} is unreachable on ${hostName}. -ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS=Cannot ${action} ${type}. Only Storage Domain name, description and comment are updateable. +ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS=Cannot ${action} ${type}. Only Storage Domain name, description, comment and low space thresholds are updateable. ERROR_CANNOT_UPDATE_STORAGE_POOL_COMPATIBILITY_VERSION_BIGGER_THAN_CLUSTERS=Cannot update Data Center compatibility version to a value that is greater than its Cluster's version. The following clusters should be upgraded ${ClustersList}. ERROR_CANNOT_ADD_EXISTING_STORAGE_DOMAIN_CONNECTION_DATA_ILLEGAL=Cannot import Storage Domain. Internal Error: The connection data is illegal. ERROR_CANNOT_ADD_DEPRECATED_EXISTING_SAN_EXPORT_STORAGE_DOMAIN=Cannot import SAN Export Storage Domain as it is no longer supported. diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd index 86a5cce..76ae939 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd @@ -2667,6 +2667,8 @@ <xs:element name="used" type="xs:long" minOccurs="0"/> <xs:element name="committed" type="xs:long" minOccurs="0"/> <xs:element name="storage_format" type="xs:string" minOccurs="0"/> + <xs:element name="free_space_low" type="xs:int" minOccurs="0"/> + <xs:element name="free_space_critical_low" type="xs:int" minOccurs="0"/> </xs:sequence> </xs:extension> </xs:complexContent> diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml index 13f8dbe..f1137d0 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml @@ -1516,7 +1516,8 @@ logical_unit.port: 'xs:int', logical_unit.target: 'xs:string', logical_unit.username: 'xs:string', logical_unit.password: 'xs:string', logical_unit.serial: 'xs:string', logical_unit.vendor_id: 'xs:string', logical_unit.product_id: 'xs:string', logical_unit.lun_mapping: 'xs:int', logical_unit.portal: 'xs:string', logical_unit.paths: 'xs:int', logical_unit.id: 'xs:string'}} - optionalArguments: {storagedomain.name: 'xs:string', storagedomain.comment: 'xs:string', storagedomain.storage.override_luns: 'xs:boolean'} + optionalArguments: {storagedomain.name: 'xs:string', storagedomain.comment: 'xs:string', storagedomain.storage.override_luns: 'xs:boolean', + storagedomain.free_Space_low: 'xs:int', storagedomain.free_space_critical_low: 'xs:int'} description: update the storage domain urlparams: async: {context: matrix, type: 'xs:boolean', value: true|false, required: false} @@ -2247,7 +2248,7 @@ parameterType: StorageDomain signatures: - mandatoryArguments: {storagedomain.id|name: 'xs:string'} - optionalArguments: {} + optionalArguments: {storagedomain.storage.free_space_low: 'xs:int', storagedomain.storage.free_space_critical_low: 'xs:int'} description: add a new storage domain to the data center urlparams: {} headers: diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResourceTest.java index a570e8f..d8de1c1 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainResourceTest.java @@ -5,12 +5,14 @@ import static org.ovirt.engine.api.restapi.resource.BackendStorageDomainsResourceTest.setUpEntityExpectations; import static org.ovirt.engine.api.restapi.resource.BackendStorageDomainsResourceTest.setUpStorageServerConnection; import static org.ovirt.engine.api.restapi.resource.BackendStorageDomainsResourceTest.verifyModelSpecific; +import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig; import java.util.ArrayList; import java.util.List; import javax.ws.rs.WebApplicationException; +import org.junit.Rule; import org.junit.Test; import org.ovirt.engine.api.model.StorageDomain; import org.ovirt.engine.api.model.StorageDomainType; @@ -18,14 +20,25 @@ import org.ovirt.engine.core.common.action.StorageDomainManagementParameter; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.LUNs; +import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.queries.GetLunsByVgIdParameters; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.StorageServerConnectionQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.utils.MockConfigRule; public class BackendStorageDomainResourceTest extends AbstractBackendSubResourceTest<StorageDomain, org.ovirt.engine.core.common.businessentities.StorageDomain, BackendStorageDomainResource> { + private final static int FREE_SPACE_CRITICAL_LOW_IN_GB = 5; + private final static int FREE_SPACE_LOW = 10; + + @Rule + public MockConfigRule mcr = new MockConfigRule( + mockConfig(ConfigValues.FreeSpaceCriticalLowInGB, FREE_SPACE_CRITICAL_LOW_IN_GB), + mockConfig(ConfigValues.FreeSpaceLow, FREE_SPACE_LOW) + ); + public BackendStorageDomainResourceTest() { super(new BackendStorageDomainResource(GUIDS[0].toString(), new BackendStorageDomainsResource())); } diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java index 5accb1c..d906117 100644 --- a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainsResourceTest.java @@ -1,6 +1,7 @@ package org.ovirt.engine.api.restapi.resource; import static org.easymock.EasyMock.expect; +import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig; import java.util.ArrayList; import java.util.List; @@ -8,6 +9,7 @@ import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; +import org.junit.Rule; import org.junit.Test; import org.ovirt.engine.api.model.Host; import org.ovirt.engine.api.model.LogicalUnit; @@ -27,6 +29,7 @@ import org.ovirt.engine.core.common.businessentities.StorageServerConnections; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VdsStatic; +import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.GetDeviceListQueryParameters; import org.ovirt.engine.core.common.queries.GetExistingStorageDomainListParameters; @@ -35,6 +38,7 @@ import org.ovirt.engine.core.common.queries.NameQueryParameters; import org.ovirt.engine.core.common.queries.StorageServerConnectionQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.utils.MockConfigRule; public class BackendStorageDomainsResourceTest extends AbstractBackendCollectionResourceTest<StorageDomain, org.ovirt.engine.core.common.businessentities.StorageDomain, BackendStorageDomainsResource> { @@ -55,6 +59,15 @@ protected static final String TARGET = "iqn.2009-08.org.fubar.engine:markmc.test1"; protected static final Integer PORT = 3260; + private final static int FREE_SPACE_CRITICAL_LOW_IN_GB = 5; + private final static int FREE_SPACE_LOW = 10; + + @Rule + public MockConfigRule mcr = new MockConfigRule( + mockConfig(ConfigValues.FreeSpaceCriticalLowInGB, FREE_SPACE_CRITICAL_LOW_IN_GB), + mockConfig(ConfigValues.FreeSpaceLow, FREE_SPACE_LOW) + ); + protected static final org.ovirt.engine.core.common.businessentities.StorageDomainType TYPES_MAPPED[] = { org.ovirt.engine.core.common.businessentities.StorageDomainType.Data, org.ovirt.engine.core.common.businessentities.StorageDomainType.ISO, diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java index f535ae3..4d0fd9f 100644 --- a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/StorageDomainMapper.java @@ -14,6 +14,8 @@ import org.ovirt.engine.api.restapi.utils.GuidUtils; import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.utils.SizeConverter; public class StorageDomainMapper { @@ -51,6 +53,19 @@ entity.setStorageFormat(StorageFormatMapper.map(storageFormat, null)); } } + + int freeSpaceLow = Config.<Integer>getValue(ConfigValues.FreeSpaceLow); + if (model.isSetFreeSpaceLow()) { + freeSpaceLow = model.getFreeSpaceLow(); + } + entity.setFreeSpaceLow(freeSpaceLow); + + int freeSpaceCriticalLow = Config.<Integer>getValue(ConfigValues.FreeSpaceCriticalLowInGB); + if (model.isSetFreeSpaceCriticalLow()) { + freeSpaceCriticalLow = model.getFreeSpaceCriticalLow(); + } + entity.setFreeSpaceCriticalLow(freeSpaceCriticalLow); + return entity; } @@ -87,6 +102,9 @@ } if (storage.isSetMountOptions()) { entity.setMountOptions(storage.getMountOptions()); + } + if(storage.getNfsTimeo() != null) { + entity.setNfsTimeo(storage.getNfsTimeo().shortValue()); } break; case LOCALFS: @@ -145,6 +163,12 @@ model.setUsed(SizeConverter.convert(entity.getUsedDiskSize().longValue(), SizeConverter.SizeUnit.GB, SizeConverter.SizeUnit.BYTES).longValue()); } + if (entity.getFreeSpaceLow()!= null) { + model.setFreeSpaceLow(entity.getFreeSpaceLow()); + } + if (entity.getFreeSpaceCriticalLow()!= null) { + model.setFreeSpaceCriticalLow(entity.getFreeSpaceCriticalLow()); + } model.setCommitted(SizeConverter.convert(entity.getCommittedDiskSize(), SizeConverter.SizeUnit.GB, SizeConverter.SizeUnit.BYTES).longValue()); if (entity.getStorageFormat()!= null) { @@ -153,6 +177,7 @@ model.setStorageFormat(storageFormat); } } + return model; } diff --git a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/StorageDomainMapperTest.java b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/StorageDomainMapperTest.java index 22457c6..bf6de9a 100644 --- a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/StorageDomainMapperTest.java +++ b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/StorageDomainMapperTest.java @@ -1,5 +1,6 @@ package org.ovirt.engine.api.restapi.types; +import org.junit.Rule; import org.junit.Test; import org.ovirt.engine.api.model.NfsVersion; import org.ovirt.engine.api.model.Storage; @@ -11,12 +12,24 @@ import org.ovirt.engine.api.restapi.model.StorageFormat; import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; +import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.utils.MockConfigRule; +import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig; public class StorageDomainMapperTest extends AbstractInvertibleMappingTest<StorageDomain, StorageDomainStatic, org.ovirt.engine.core.common.businessentities.StorageDomain> { + private final static int FREE_SPACE_CRITICAL_LOW_IN_GB = 5; + private final static int FREE_SPACE_LOW = 10; + + @Rule + public MockConfigRule mcr = new MockConfigRule( + mockConfig(ConfigValues.FreeSpaceCriticalLowInGB, FREE_SPACE_CRITICAL_LOW_IN_GB), + mockConfig(ConfigValues.FreeSpaceLow, FREE_SPACE_LOW) + ); + public StorageDomainMapperTest() { super(StorageDomain.class, StorageDomainStatic.class, org.ovirt.engine.core.common.businessentities.StorageDomain.class); } diff --git a/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/StorageDomainFieldAutoCompleter.java b/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/StorageDomainFieldAutoCompleter.java index 187ca05..3fc43af 100644 --- a/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/StorageDomainFieldAutoCompleter.java +++ b/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/StorageDomainFieldAutoCompleter.java @@ -14,6 +14,8 @@ public static final String COMMITTED = "COMMITTED"; public static final String COMMENT = "COMMENT"; public static final String DESCRIPTION = "DESCRIPTION"; + public static final String LOW_SPACE_THRESHOLD = "LOW_SPACE"; + public static final String CRITICAL_LOW_SPACE_THRESHOLD = "CRITICAL_LOW"; public StorageDomainFieldAutoCompleter() { @@ -27,6 +29,8 @@ mVerbs.add(COMMITTED); mVerbs.add(COMMENT); mVerbs.add(DESCRIPTION); + mVerbs.add(LOW_SPACE_THRESHOLD); + mVerbs.add(CRITICAL_LOW_SPACE_THRESHOLD); // Building the autoCompletion Dict buildCompletions(); @@ -40,6 +44,8 @@ getTypeDictionary().put(COMMITTED, Integer.class); getTypeDictionary().put(COMMENT, String.class); getTypeDictionary().put(DESCRIPTION, String.class); + getTypeDictionary().put(LOW_SPACE_THRESHOLD, Integer.class); + getTypeDictionary().put(CRITICAL_LOW_SPACE_THRESHOLD, Integer.class); // building the ColumnName Dict columnNameDict.put(NAME, "storage_name"); @@ -51,6 +57,8 @@ columnNameDict.put(COMMITTED, "commited_disk_size"); columnNameDict.put(COMMENT, "storage_comment"); columnNameDict.put(DESCRIPTION, "storage_description"); + columnNameDict.put(LOW_SPACE_THRESHOLD, "free_space_low"); + columnNameDict.put(CRITICAL_LOW_SPACE_THRESHOLD, "free_space_critical_low"); // Building the validation dict buildBasicValidationTable(); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java index fe9113e..c3abfae 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsProxyData.java @@ -427,9 +427,9 @@ int freeDiskInGB = data.getStorageDynamicData().getfreeDiskInGB(); AuditLogType type = AuditLogType.UNASSIGNED; boolean spaceThresholdMet = - freeDiskInGB <= Config.<Integer> getValue(ConfigValues.FreeSpaceCriticalLowInGB); + freeDiskInGB <= data.getFreeSpaceCriticalLow(); boolean percentThresholdMet = - freePercent <= Config.<Integer> getValue(ConfigValues.FreeSpaceLow); + freePercent <= data.getFreeSpaceLow(); if (spaceThresholdMet && percentThresholdMet) { type = AuditLogType.IRS_DISK_SPACE_LOW_ERROR; } else { 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 37cde6e..041e7b9 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 @@ -1549,7 +1549,7 @@ @DefaultStringValue("Cannot extend Storage Domain. Storage device ${lun} is unreachable from ${hostName}.") String ERROR_CANNOT_EXTEND_CONNECTION_FAILED(); - @DefaultStringValue("Cannot ${action} ${type}. Only Storage Domain name, description and comment are updateable.") + @DefaultStringValue("Cannot ${action} ${type}. Only Storage Domain name, description, comment and low space thresholds are updateable.") String ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS(); @DefaultStringValue("Cannot update Data Center compatibility version to a value that is greater than its Cluster's version. The following clusters should be upgraded ${ClustersList}.") diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/NfsStorageModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/NfsStorageModel.java index d862d96..5e1e01c 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/NfsStorageModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/NfsStorageModel.java @@ -7,6 +7,8 @@ import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.StorageType; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.ui.uicommonweb.UICommand; @@ -32,6 +34,10 @@ private final static short RETRANS_MAX = 32767; //timeo nfs option max value private final static short TIMEOUT_MAX = 6000; + //free space low nfs option max value + private final static short FREE_SPACE_LOW = 100; + //free space critical low nfs option max value + private final static short FREE_SPACE_CRITICAL_LOW = 100; public static final EventDefinition pathChangedEventDefinition; private Event<EventArgs> pathChangedEvent; @@ -142,6 +148,26 @@ mountOptions = value; } + private EntityModel<Integer> freeSpaceLow; + + public EntityModel<Integer> getFreeSpaceLow() { + return freeSpaceLow; + } + + public void setFreeSpaceLow(EntityModel<Integer> freeSpaceLow) { + this.freeSpaceLow = freeSpaceLow; + } + + private EntityModel<Integer> freeSpaceCriticalLow; + + public EntityModel<Integer> getFreeSpaceCriticalLow() { + return freeSpaceCriticalLow; + } + + public void setFreeSpaceCriticalLow(EntityModel<Integer> freeSpaceCriticalLow) { + this.freeSpaceCriticalLow = freeSpaceCriticalLow; + } + static { pathChangedEventDefinition = new EventDefinition("PathChanged", NfsStorageModel.class); //$NON-NLS-1$ @@ -171,6 +197,8 @@ setRetransmissions(new EntityModel<Short>()); setTimeout(new EntityModel<Short>()); setMountOptions(new EntityModel<String>()); + setFreeSpaceLow(new EntityModel<Integer>(Config.<Integer> getValue(ConfigValues.FreeSpaceLow))); + setFreeSpaceCriticalLow(new EntityModel<Integer>(Config.<Integer> getValue(ConfigValues.FreeSpaceCriticalLowInGB))); setOverride(new EntityModel<Boolean>()); getOverride().getEntityChangedEvent().addListener(this); @@ -187,6 +215,8 @@ getTimeout().setIsChangable(isChangeable); getMountOptions().setIsChangable(isChangeable); getMountOptions().setTitle(isChangeable ? ConstantsManager.getInstance().getConstants().mountOptionsHint() : null); + getFreeSpaceLow().setIsChangable(isChangeable); + getFreeSpaceCriticalLow().setIsChangable(isChangeable); } @Override @@ -221,10 +251,20 @@ new NonUtfValidation() }); + getFreeSpaceLow().validateEntity(new IValidation[] { + new IntegerValidation(1, FREE_SPACE_LOW) + }); + + getFreeSpaceCriticalLow().validateEntity(new IValidation[] { + new IntegerValidation(1, FREE_SPACE_CRITICAL_LOW) + }); + return getPath().getIsValid() && getRetransmissions().getIsValid() && getTimeout().getIsValid() - && getMountOptions().getIsValid(); + && getMountOptions().getIsValid() + && getFreeSpaceLow().getIsValid() + && getFreeSpaceCriticalLow().getIsValid(); } @Override diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageGeneralModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageGeneralModel.java index e20c60f..fa45608 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageGeneralModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageGeneralModel.java @@ -146,6 +146,32 @@ } } + private Integer freeSpaceLow; + + public String getFreeSpaceLow() { + return freeSpaceLow == null ? null : freeSpaceLow.toString(); + } + + public void setFreeSpaceLow(Integer freeSpaceLow) { + if (!ObjectUtils.objectsEqual(this.freeSpaceLow, freeSpaceLow)) { + this.freeSpaceLow = freeSpaceLow; + onPropertyChanged(new PropertyChangedEventArgs("freeSpaceLow")); //$NON-NLS-1$ + } + } + + private Integer freeSpaceCriticalLow; + + public String getFreeSpaceCriticalLow() { + return freeSpaceCriticalLow == null ? null : freeSpaceCriticalLow.toString(); + } + + public void setFreeSpaceCriticalLow(Integer freeSpaceCriticalLow) { + if (!ObjectUtils.objectsEqual(this.freeSpaceCriticalLow, freeSpaceCriticalLow)) { + this.freeSpaceCriticalLow = freeSpaceCriticalLow; + onPropertyChanged(new PropertyChangedEventArgs("freeSpaceCriticalLow")); //$NON-NLS-1$ + } + } + public StorageGeneralModel() { setTitle(ConstantsManager.getInstance().getConstants().generalTitle()); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java index fcb785a..b9419bd 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java @@ -26,6 +26,8 @@ import org.ovirt.engine.core.common.businessentities.StorageServerConnections; import org.ovirt.engine.core.common.businessentities.StorageType; import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.mode.ApplicationMode; import org.ovirt.engine.core.common.queries.SearchParameters; @@ -419,7 +421,7 @@ } } - private IStorageModel prepareNfsStorageForEdit(StorageDomain storage) + private IStorageModel prepareNfsStorageForEdit(final StorageDomain storage) { final NfsStorageModel model = new NfsStorageModel(); model.setRole(storage.getStorageDomainType()); @@ -438,6 +440,8 @@ model.getRetransmissions().setEntity(connection.getNfsRetrans()); model.getTimeout().setEntity(connection.getNfsTimeo()); model.getMountOptions().setEntity(connection.getMountOptions()); + model.getFreeSpaceLow().setEntity(storage.getFreeSpaceLow()); + model.getFreeSpaceCriticalLow().setEntity(storage.getFreeSpaceCriticalLow()); for (EntityModel<NfsVersion> item : model.getVersion().getItems()) { EntityModel itemModel = item; boolean noNfsVersion = itemModel.getEntity() == null && connection.getNfsVersion() == null; @@ -455,8 +459,9 @@ connection.getNfsVersion() != null || connection.getNfsRetrans() != null || connection.getNfsTimeo() != null || - connection.getMountOptions() != null); - + connection.getMountOptions() != null || + storageDomain.getFreeSpaceLow() != Config.<Integer> getValue(ConfigValues.FreeSpaceLow) || + storageDomain.getFreeSpaceCriticalLow() != Config.<Integer> getValue(ConfigValues.FreeSpaceCriticalLowInGB)); } }), storage.getStorage(), true); @@ -1542,6 +1547,8 @@ connection.setNfsRetrans(nfsModel.getRetransmissions().asConvertible().nullableShort()); connection.setNfsTimeo(nfsModel.getTimeout().asConvertible().nullableShort()); connection.setMountOptions(nfsModel.getMountOptions().getEntity()); + storageDomain.setFreeSpaceLow(nfsModel.getFreeSpaceLow().getEntity()); + storageDomain.setFreeSpaceLow(nfsModel.getFreeSpaceCriticalLow().getEntity()); } } diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index 06d22b5..8a62207 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -520,7 +520,7 @@ ACTION_TYPE_FAILED_STORAGE_DOMAIN_FORMAT_ILLEGAL_HOST=Cannot ${action} ${type}. Storage format ${storageFormat} is not supported on the selected host version. ERROR_CANNOT_EXTEND_NON_DATA_DOMAIN=Cannot extend Storage Domain. Extend operation is supported only on Data Storage Domain. ERROR_CANNOT_EXTEND_CONNECTION_FAILED=Cannot extend Storage Domain. Storage device ${lun} is unreachable from ${hostName}. -ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS=Cannot ${action} ${type}. Only Storage Domain name, description and comment are updateable. +ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS=Cannot ${action} ${type}. Only Storage Domain name, description, comment and low space thresholds are updateable. ERROR_CANNOT_UPDATE_STORAGE_POOL_COMPATIBILITY_VERSION_BIGGER_THAN_CLUSTERS=Cannot update Data Center compatibility version to a value that is greater than its Cluster's version. The following clusters should be upgraded ${ClustersList}. ERROR_CANNOT_ADD_EXISTING_STORAGE_DOMAIN_CONNECTION_DATA_ILLEGAL=Cannot import Storage Domain. Internal Error: The connection data is illegal. ERROR_CANNOT_ADD_DEPRECATED_EXISTING_SAN_EXPORT_STORAGE_DOMAIN=Cannot import SAN Export Storage Domain as it is no longer supported. diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java index c7b6a59..d82733f 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/ApplicationConstants.java @@ -1712,6 +1712,12 @@ @DefaultStringValue("Timeout (deciseconds)") String nfsTimeoutGeneral(); + @DefaultStringValue("Free Space Threshold") + String freeSpaceLow(); + + @DefaultStringValue("Free Space Critical Threshold") + String freeSpaceCriticalLow(); + // VM @DefaultStringValue("Cluster") String clusterVm(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.java index 6a21c82..bcb2585 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.java @@ -12,6 +12,7 @@ import org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxEditor; import org.ovirt.engine.ui.common.widget.editor.generic.EntityModelTextBoxOnlyEditor; import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxOnlyEditor; +import org.ovirt.engine.ui.common.widget.editor.generic.IntegerEntityModelTextBoxOnlyEditor; import org.ovirt.engine.ui.common.widget.editor.generic.ShortEntityModelTextBoxOnlyEditor; import org.ovirt.engine.ui.common.widget.editor.generic.StringEntityModelTextBoxOnlyEditor; import org.ovirt.engine.ui.common.widget.uicommon.storage.AbstractStorageView; @@ -125,6 +126,24 @@ Label mountOptionsLabel; @UiField + @WithElementId + @Path(value = "freeSpaceLow.entity") + IntegerEntityModelTextBoxOnlyEditor freeSpaceLowEditor; + + @UiField + @Ignore + Label freeSpaceLowLabel; + + @UiField + @WithElementId + @Path(value = "freeSpaceCriticalLow.entity") + IntegerEntityModelTextBoxOnlyEditor freeSpaceCriticalLowEditor; + + @UiField + @Ignore + Label freeSpaceCriticalLowLabel; + + @UiField Label message; private final Driver driver = GWT.create(Driver.class); @@ -177,6 +196,8 @@ retransmissionsLabel.setText(constants.storagePopupNfsRetransmissionsLabel()); timeoutLabel.setText(constants.storagePopupNfsTimeoutLabel()); mountOptionsLabel.setText(constants.storagePopupAdditionalMountOptionsLabel()); + freeSpaceLowLabel.setText(constants.freeSpaceLow()); + freeSpaceCriticalLowLabel.setText(constants.freeSpaceCriticalLow()); } @Override @@ -202,6 +223,8 @@ styleTextBoxEditor(retransmissionsEditor, object.getOverride().getIsChangable()); styleTextBoxEditor(versionReadOnlyEditor, object.getOverride().getIsChangable()); styleTextBoxEditor(mountOptionsEditor, object.getOverride().getIsChangable()); + styleTextBoxEditor(freeSpaceLowEditor, object.getOverride().getIsChangable()); + styleTextBoxEditor(freeSpaceCriticalLowEditor, object.getOverride().getIsChangable()); setElementVisibility(versionEditor, object.getOverride().getIsChangable()); setElementVisibility(versionReadOnlyEditor, !object.getOverride().getIsChangable()); @@ -209,12 +232,16 @@ setElementVisibility(retransmissionsLabel, object.getRetransmissions().getIsAvailable()); setElementVisibility(timeoutLabel, object.getTimeout().getIsAvailable()); setElementVisibility(mountOptionsLabel, object.getMountOptions().getIsAvailable()); + setElementVisibility(freeSpaceLowLabel, object.getFreeSpaceLow().getIsAvailable()); + setElementVisibility(freeSpaceCriticalLowLabel, object.getFreeSpaceCriticalLow().getIsAvailable()); // When all advanced fields are unavailable - hide the expander. boolean anyField = object.getVersion().getIsAvailable() || object.getRetransmissions().getIsAvailable() || object.getTimeout().getIsAvailable() - || object.getMountOptions().getIsAvailable(); + || object.getMountOptions().getIsAvailable() + || object.getFreeSpaceLow().getIsAvailable() + || object.getFreeSpaceCriticalLow().getIsAvailable(); expander.getElement().getStyle().setVisibility(anyField ? Style.Visibility.VISIBLE : Style.Visibility.HIDDEN); } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.ui.xml b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.ui.xml index 0de1dcf..b7fb314 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.ui.xml +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/popup/storage/NfsStorageView.ui.xml @@ -112,6 +112,22 @@ <ge:StringEntityModelTextBoxOnlyEditor ui:field="mountOptionsEditor" addStyleNames="table_contentWidget_pfly_fix"/> </td> </tr> + <tr> + <td nowrap="nowrap"> + <g:Label ui:field="freeSpaceLowLabel" addStyleNames="{style.label}"/> + </td> + <td> + <ge:IntegerEntityModelTextBoxOnlyEditor ui:field="freeSpaceLowEditor"/> + </td> + </tr> + <tr> + <td nowrap="nowrap"> + <g:Label ui:field="freeSpaceCriticalLowLabel" addStyleNames="{style.label}"/> + </td> + <td> + <ge:IntegerEntityModelTextBoxOnlyEditor ui:field="freeSpaceCriticalLowEditor"/> + </td> + </tr> </table> </table> </g:HTMLPanel> diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageGeneralView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageGeneralView.java index 853291e..5f3c8b1 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageGeneralView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/storage/SubTabStorageGeneralView.java @@ -52,6 +52,12 @@ @Ignore PercentLabel<Integer> overAllocationRatio = new PercentLabel<Integer>(); + @Ignore + PercentLabel<Integer> freeSpaceLow = new PercentLabel<Integer>(); + + @Ignore + StorageSizeLabel<Integer> freeSpaceCriticalLow = new StorageSizeLabel<Integer>(); + @Path("path") TextBoxLabel path = new TextBoxLabel(); @@ -143,6 +149,9 @@ return getDetailModel().getIsNfs() && getDetailModel().getTimeout() != null; } }); + + formBuilder.addFormItem(new FormItem(constants.freeSpaceLow(), freeSpaceLow, 12, 0)); + formBuilder.addFormItem(new FormItem(constants.freeSpaceCriticalLow(), freeSpaceCriticalLow, 13, 0)); } @Override @@ -162,6 +171,8 @@ usedSize.setValue(entity.getUsedDiskSize()); allocatedSize.setValue(entity.getCommittedDiskSize()); overAllocationRatio.setValue(entity.getStorageDomainOverCommitPercent()); + freeSpaceLow.setValue(entity.getFreeSpaceLow()); + freeSpaceCriticalLow.setValue(entity.getFreeSpaceCriticalLow()); } formBuilder.update(getDetailModel()); 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 f0071b6..3ea8d24 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 @@ -563,7 +563,7 @@ ACTION_TYPE_FAILED_STORAGE_DOMAIN_FORMAT_ILLEGAL_HOST=Cannot ${action} ${type}. Storage format ${storageFormat} is not supported on the selected host version. ERROR_CANNOT_EXTEND_NON_DATA_DOMAIN=Cannot extend Storage Domain. Extend operation is supported only on Data Storage Domain. ERROR_CANNOT_EXTEND_CONNECTION_FAILED=Cannot extend Storage Domain. Storage device ${lun} is unreachable from ${hostName}. -ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS=Cannot ${action} ${type}. Only Storage Domain name, description and comment are updateable. +ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS=Cannot ${action} ${type}. Only Storage Domain name, description, comment and low space thresholds are updateable. ERROR_CANNOT_UPDATE_STORAGE_POOL_COMPATIBILITY_VERSION_BIGGER_THAN_CLUSTERS=Cannot update Data Center compatibility version to a value that is greater than its Cluster's version. The following clusters should be upgraded ${ClustersList}. ERROR_CANNOT_ADD_EXISTING_STORAGE_DOMAIN_CONNECTION_DATA_ILLEGAL=Cannot import Storage Domain. Internal Error: The connection data is illegal. ERROR_CANNOT_ADD_DEPRECATED_EXISTING_SAN_EXPORT_STORAGE_DOMAIN=Cannot import SAN Export Storage Domain as it is no longer supported. diff --git a/packaging/dbscripts/create_views.sql b/packaging/dbscripts/create_views.sql index 3d31550..39d032b 100644 --- a/packaging/dbscripts/create_views.sql +++ b/packaging/dbscripts/create_views.sql @@ -17,7 +17,9 @@ storage_domain_static.storage_domain_format_type as storage_domain_format_type, storage_domain_static.last_time_used_as_master as last_time_used_as_master, storage_pool.name as storage_pool_name, - unregistered_entities.storage_domain_id IS NOT NULL AS contains_unregistered_entities + unregistered_entities.storage_domain_id IS NOT NULL AS contains_unregistered_entities, + storage_domain_static.free_space_low, + storage_domain_static.free_space_critical_low FROM storage_domain_static LEFT OUTER JOIN storage_pool_iso_map on storage_pool_iso_map.storage_id = storage_domain_static.id LEFT OUTER JOIN storage_pool ON storage_pool.id = storage_pool_iso_map.storage_pool_id @@ -309,7 +311,9 @@ storage_domain_static.last_time_used_as_master as last_time_used_as_master, fn_get_storage_domain_shared_status_by_domain_id(storage_domain_static.id,storage_pool_iso_map.status,storage_domain_static.storage_domain_type) as storage_domain_shared_status, storage_domain_static.recoverable as recoverable, - unregistered_entities.storage_domain_id IS NOT NULL AS contains_unregistered_entities + unregistered_entities.storage_domain_id IS NOT NULL AS contains_unregistered_entities, + storage_domain_static.free_space_low as free_space_low, + storage_domain_static.free_space_critical_low as free_space_critical_low FROM storage_domain_static INNER JOIN storage_domain_dynamic ON storage_domain_static.id = storage_domain_dynamic.id LEFT OUTER JOIN storage_pool_iso_map ON storage_domain_static.id = storage_pool_iso_map.storage_id @@ -335,7 +339,9 @@ null as status, fn_get_storage_domain_shared_status_by_domain_id(storage_domain_static.id,storage_pool_iso_map.status,storage_domain_static.storage_domain_type) as storage_domain_shared_status, storage_domain_static.recoverable as recoverable, - unregistered_entities.storage_domain_id IS NOT NULL AS contains_unregistered_entities + unregistered_entities.storage_domain_id IS NOT NULL AS contains_unregistered_entities, + storage_domain_static.free_space_low as free_space_low, + storage_domain_static.free_space_critical_low as free_space_critical_low FROM storage_domain_static INNER JOIN storage_domain_dynamic ON storage_domain_static.id = storage_domain_dynamic.id @@ -363,7 +369,9 @@ fn_get_actual_images_size_by_storage(storage_domain_static.id) as actual_images_size, fn_get_storage_domain_shared_status_by_domain_id(storage_domain_static.id,status_table.status,storage_domain_static.storage_domain_type) as storage_domain_shared_status, storage_domain_static.recoverable as recoverable, - unregistered_entities.storage_domain_id IS NOT NULL AS contains_unregistered_entities + unregistered_entities.storage_domain_id IS NOT NULL AS contains_unregistered_entities, + storage_domain_static.free_space_low as free_space_low, + storage_domain_static.free_space_critical_low as free_space_critical_low FROM storage_domain_static INNER JOIN diff --git a/packaging/dbscripts/inst_sp.sql b/packaging/dbscripts/inst_sp.sql index 338f584..cb5f256 100644 --- a/packaging/dbscripts/inst_sp.sql +++ b/packaging/dbscripts/inst_sp.sql @@ -17,7 +17,8 @@ -- This function calls insert_server_connections, insertstorage_domain_static,insertstorage_domain_dynamic -- Any change to these functions may effect correctness of the installion. -Create or replace FUNCTION inst_add_iso_storage_domain(v_storage_domain_id UUID, v_name VARCHAR(250), v_connection_id uuid, v_connection VARCHAR(250),v_available int, v_used int) +Create or replace FUNCTION inst_add_iso_storage_domain(v_storage_domain_id UUID, v_name VARCHAR(250), v_connection_id uuid, v_connection VARCHAR(250),v_available int, v_used int, + v_free_space_low INTEGER, v_free_space_space_critical_low INTEGER) RETURNS VOID AS $procedure$ DECLARE @@ -26,7 +27,7 @@ -- Insert storage server connection info perform Insertstorage_server_connections(v_connection,cast(v_connection_id as varchar(250)),NULL,NULL,NULL,NULL,1,NULL,NULL,NULL,NULL,NULL,NULL); -- Insert storage domain static info - perform Insertstorage_domain_static(v_storage_domain_id,cast(v_connection_id as varchar(250)),v_name,v_name,'',1,2,'0',0); + perform Insertstorage_domain_static(v_storage_domain_id,cast(v_connection_id as varchar(250)),v_name,v_name,'',1,2,'0',0, v_free_space_low, v_free_space_space_critical_low); -- Insert storage domain dynamic info perform Insertstorage_domain_dynamic(v_available,v_storage_domain_id,v_used); end if; diff --git a/packaging/dbscripts/storages_sp.sql b/packaging/dbscripts/storages_sp.sql index f81921a..7ae853e 100644 --- a/packaging/dbscripts/storages_sp.sql +++ b/packaging/dbscripts/storages_sp.sql @@ -413,17 +413,21 @@ Create or replace FUNCTION Insertstorage_domain_static(v_id UUID, v_storage VARCHAR(250), v_storage_name VARCHAR(250), - v_storage_description VARCHAR(4000), + v_storage_description VARCHAR(4000), v_storage_comment text, v_storage_type INTEGER, v_storage_domain_type INTEGER, - v_storage_domain_format_type VARCHAR(50), - v_last_time_used_as_master BIGINT) + v_storage_domain_format_type VARCHAR(50), + v_last_time_used_as_master BIGINT, + v_free_space_low INTEGER, + v_free_space_critical_low INTEGER) RETURNS VOID AS $procedure$ BEGIN -INSERT INTO storage_domain_static(id, storage,storage_name, storage_description, storage_comment, storage_type, storage_domain_type, storage_domain_format_type, last_time_used_as_master) - VALUES(v_id, v_storage, v_storage_name, v_storage_description, v_storage_comment, v_storage_type, v_storage_domain_type, v_storage_domain_format_type, v_last_time_used_as_master); +INSERT INTO storage_domain_static(id, storage,storage_name, storage_description, storage_comment, storage_type, storage_domain_type, storage_domain_format_type, last_time_used_as_master, + free_space_low, free_space_critical_low) + VALUES(v_id, v_storage, v_storage_name, v_storage_description, v_storage_comment, v_storage_type, v_storage_domain_type, v_storage_domain_format_type, v_last_time_used_as_master, + v_free_space_low, v_free_space_critical_low); END; $procedure$ LANGUAGE plpgsql; @@ -449,7 +453,9 @@ v_storage_type INTEGER, v_storage_domain_type INTEGER, v_storage_domain_format_type INTEGER, - v_last_time_used_as_master BIGINT) + v_last_time_used_as_master BIGINT, + v_free_space_low INTEGER, + v_free_space_critical_low INTEGER) RETURNS VOID --The [storage_domain_static] table doesn't have a timestamp column. Optimistic concurrency logic cannot be generated @@ -460,7 +466,8 @@ storage_domain_type = v_storage_domain_type, _update_date = LOCALTIMESTAMP, storage_domain_format_type = v_storage_domain_format_type, last_time_used_as_master = v_last_time_used_as_master, - storage_description = v_storage_description, storage_comment = v_storage_comment + storage_description = v_storage_description, storage_comment = v_storage_comment, + free_space_low = v_free_space_low, free_space_critical_low = v_free_space_critical_low WHERE id = v_id; END; $procedure$ LANGUAGE plpgsql; diff --git a/packaging/dbscripts/upgrade/03_06_0540_add_thresholds_to_storage_domain_static.sql b/packaging/dbscripts/upgrade/03_06_0540_add_thresholds_to_storage_domain_static.sql new file mode 100644 index 0000000..9158150 --- /dev/null +++ b/packaging/dbscripts/upgrade/03_06_0540_add_thresholds_to_storage_domain_static.sql @@ -0,0 +1,12 @@ +select fn_db_add_column('storage_domain_static', 'free_space_low', 'INTEGER NOT NULL DEFAULT 0'); +select fn_db_add_column('storage_domain_static', 'free_space_critical_low', 'INTEGER NOT NULL DEFAULT 0'); + +UPDATE storage_domain_Static + SET free_space_low=cast(( + SELECT option_value + FROM vdc_options + WHERE option_name='FreeSpaceLow') AS INTEGER), + free_space_critical_low=cast(( + SELECT option_value + FROM vdc_options + WHERE option_name='FreeSpaceCriticalLowInGB') AS INTEGER); -- To view, visit http://gerrit.ovirt.org/35277 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I19621dfc770c69003d731a7593d037d7d4040a82 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Vered Volansky <vvola...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches