Hello Idan Shaby,

I'd like you to do a code review.  Please visit

    http://gerrit.ovirt.org/29809

to review the following change.

Change subject: core: UpdateStorageDomain's CDA early return
......................................................................

core: UpdateStorageDomain's CDA early return

Changed UpdateStorageDomainCommand.canDoAction() to use the early return
pattern in order to solve several NullPointerExceptions and enhance
readability.

Tests were added to all the canDoAction() flows to make sure these
changes did not break any functionality.

Change-Id: Iea10984090a759ef07da1fe572c4fdc323ede0e5
Signed-off-by: Allon Mureinik <[email protected]>
Signed-off-by: Idan Shaby <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageDomainCommand.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/UpdateStorageDomainCommandTest.java
2 files changed, 97 insertions(+), 18 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/09/29809/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 8b5b049..6ecb36e 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
@@ -27,15 +27,15 @@
 
     @Override
     protected boolean canDoAction() {
-        boolean returnValue = super.canDoAction() && checkStorageDomain()
-                && checkStorageDomainStatus(StorageDomainStatus.Active) && 
checkStorageDomainNameLengthValid();
-        oldDomain = 
getStorageDomainStaticDAO().get(getStorageDomain().getId());
+        if (!super.canDoAction() || !checkStorageDomain()
+                || !checkStorageDomainStatus(StorageDomainStatus.Active) || 
!checkStorageDomainNameLengthValid()) {
+            return false;
+        }
 
         // Only after validating the existing of the storage domain in DB, we 
set the field lastTimeUsedAsMaster in the
         // storage domain which is about to be updated.
-        if (returnValue) {
-            
getStorageDomain().setLastTimeUsedAsMaster(oldDomain.getLastTimeUsedAsMaster());
-        }
+        oldDomain = 
getStorageDomainStaticDAO().get(getStorageDomain().getId());
+        
getStorageDomain().setLastTimeUsedAsMaster(oldDomain.getLastTimeUsedAsMaster());
 
         // Collect changed fields to update in a list.
         List<String> props = ObjectIdentityChecker.GetChangedFields(oldDomain, 
getStorageDomain()
@@ -45,26 +45,25 @@
         props.remove("storageName");
         props.remove("description");
         props.remove("comment");
-        if (returnValue && props.size() > 0) {
+        if (!props.isEmpty()) {
             log.warnFormat("There was an attempt to update the following 
fields although they are not allowed to be updated: {0}",
                     StringUtils.join(props, ","));
-            
addCanDoActionMessage(VdcBllMessages.ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS);
-            returnValue = false;
+            return 
failCanDoAction(VdcBllMessages.ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS);
         }
+
         _storageDomainNameChanged =
                 !StringUtils.equals(oldDomain.getStorageName(), 
getStorageDomain().getStorageName());
         // if domain is part of pool, and name changed, check that pool is up 
in
         // order to change description in spm
-        if (returnValue
-                && _storageDomainNameChanged
-                && !validate(new 
StoragePoolValidator(getStoragePool()).isUp())) {
-            returnValue = false;
+        if (_storageDomainNameChanged && !validate(new 
StoragePoolValidator(getStoragePool()).isUp())) {
+            return false;
         }
-        if (returnValue && _storageDomainNameChanged && 
isStorageWithSameNameExists()) {
-            
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NAME_ALREADY_EXIST);
-            returnValue = false;
+
+        if (_storageDomainNameChanged && isStorageWithSameNameExists()) {
+            return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NAME_ALREADY_EXIST);
         }
-        return returnValue;
+
+        return true;
     }
 
     @Override
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/UpdateStorageDomainCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/UpdateStorageDomainCommandTest.java
index 2adc932..a8b3bfe 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/UpdateStorageDomainCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/UpdateStorageDomainCommandTest.java
@@ -7,6 +7,7 @@
 import static org.ovirt.engine.core.utils.MockConfigRule.mockConfig;
 
 import java.util.List;
+import org.apache.commons.lang.StringUtils;
 import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
@@ -20,6 +21,8 @@
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
 import org.ovirt.engine.core.common.businessentities.StorageDomainType;
 import org.ovirt.engine.core.common.businessentities.StorageFormatType;
+import org.ovirt.engine.core.common.businessentities.StoragePool;
+import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
 import org.ovirt.engine.core.common.businessentities.StorageType;
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
@@ -34,13 +37,16 @@
 public class UpdateStorageDomainCommandTest {
     private Guid sdId;
     private StorageDomain sd;
+    private StoragePool sp;
     private StorageDomainStatic oldSdStatic;
     private StorageDomainStatic newSdStatic;
     private UpdateStorageDomainCommand<StorageDomainManagementParameter> cmd;
 
+    private static final int STORAGE_DOMAIN_NAME_LENGTH_LIMIT = 100;
+
     @ClassRule
     public static MockConfigRule mcr =
-            new 
MockConfigRule(mockConfig(ConfigValues.StorageDomainNameSizeLimit, 100));
+            new 
MockConfigRule(mockConfig(ConfigValues.StorageDomainNameSizeLimit, 
STORAGE_DOMAIN_NAME_LENGTH_LIMIT));
 
     @Mock
     private StorageDomainStaticDAO sdsDao;
@@ -50,13 +56,21 @@
         sdId = Guid.newGuid();
         oldSdStatic = createStorageDomain();
         newSdStatic = createStorageDomain();
+        Guid spId = Guid.newGuid();
 
         sd = new StorageDomain();
         sd.setStorageStaticData(newSdStatic);
         sd.setStatus(StorageDomainStatus.Active);
+        sd.setStoragePoolId(spId);
+
+        sp = new StoragePool();
+        sp.setId(spId);
+        sp.setStatus(StoragePoolStatus.Up);
+        sp.setIsLocal(false);
 
         cmd = spy(new UpdateStorageDomainCommand<>(new 
StorageDomainManagementParameter(newSdStatic)));
         doReturn(sd).when(cmd).getStorageDomain();
+        doReturn(sp).when(cmd).getStoragePool();
         doReturn(sdsDao).when(cmd).getStorageDomainStaticDAO();
 
         when(sdsDao.get(sdId)).thenReturn(oldSdStatic);
@@ -88,4 +102,70 @@
         assertTrue("redundant messages " + messages, messages.isEmpty());
     }
 
+    @Test
+    public void canDoActionNoDomain() {
+        doReturn(null).when(cmd).getStorageDomain();
+        CanDoActionTestUtils.runAndAssertCanDoActionFailure(cmd,
+                VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_EXIST);
+    }
+
+    @Test
+    public void canDoActionWrongStatus() {
+        sd.setStatus(StorageDomainStatus.Maintenance);
+        CanDoActionTestUtils.runAndAssertCanDoActionFailure(cmd,
+                
VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL2);
+    }
+
+    @Test
+    public void canDoChangeDescription() {
+        sd.setDescription(StringUtils.reverse(sd.getDescription()));
+        CanDoActionTestUtils.runAndAssertCanDoActionSuccess(cmd);
+    }
+
+    @Test
+    public void canDoChangeComment() {
+        sd.setComment(StringUtils.reverse(sd.getComment()));
+        CanDoActionTestUtils.runAndAssertCanDoActionSuccess(cmd);
+    }
+
+    @Test
+    public void canDoChangeForbiddenField() {
+        sd.setStorageType(StorageType.UNKNOWN);
+        CanDoActionTestUtils.runAndAssertCanDoActionFailure(cmd,
+                VdcBllMessages.ERROR_CANNOT_CHANGE_STORAGE_DOMAIN_FIELDS);
+    }
+
+    @Test
+    public void canDoActionName() {
+        sd.setStorageName(StringUtils.reverse(sd.getStorageName()));
+        CanDoActionTestUtils.runAndAssertCanDoActionSuccess(cmd);
+    }
+
+    @Test
+    public void canDoActionLongName() {
+        // Generate a really long name
+        String longName = StringUtils.leftPad("name", 
STORAGE_DOMAIN_NAME_LENGTH_LIMIT * 2, 'X');
+        sd.setStorageName(longName);
+        CanDoActionTestUtils.runAndAssertCanDoActionFailure(cmd,
+                VdcBllMessages.ACTION_TYPE_FAILED_NAME_LENGTH_IS_TOO_LONG);
+    }
+
+    @Test
+    public void canDoChangeNamePoolNotUp() {
+        sd.setStorageName(StringUtils.reverse(sd.getStorageName()));
+        sp.setStatus(StoragePoolStatus.Maintenance);
+
+        CanDoActionTestUtils.runAndAssertCanDoActionFailure(cmd,
+                VdcBllMessages.ACTION_TYPE_FAILED_IMAGE_REPOSITORY_NOT_FOUND);
+    }
+
+    @Test
+    public void canDoChangeNameExists() {
+        String newName = StringUtils.reverse(sd.getStorageName());
+        sd.setStorageName(newName);
+
+        doReturn(new StorageDomainStatic()).when(sdsDao).getByName(newName);
+        CanDoActionTestUtils.runAndAssertCanDoActionFailure(cmd,
+                
VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NAME_ALREADY_EXIST);
+    }
 }


-- 
To view, visit http://gerrit.ovirt.org/29809
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iea10984090a759ef07da1fe572c4fdc323ede0e5
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Allon Mureinik <[email protected]>
Gerrit-Reviewer: Idan Shaby <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to