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

Reply via email to