Alissa Bonas has uploaded a new change for review. Change subject: core: add validation to AddStorageServerConnection ......................................................................
core: add validation to AddStorageServerConnection Work in progress... Prevent addition of a new connection if another one with same connection details already exists. Added more unitests for the AddStorageServerConnection command. Also added VAR__TYPE__STORAGE__CONNECTION to VdcBllMessages, so the connection related commands will return a proper message with correct entity type (instead of returning var type storage domain). AppErrors files already contain this var type, so no need to add it there. Change-Id: If9bcef8a413589654d36db8d878c844550ae6066 Signed-off-by: Alissa Bonas <abo...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStorageServerConnectionCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommandTest.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/StorageListModel.java 6 files changed, 112 insertions(+), 36 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/88/15388/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommand.java index e38cfb8..fe0d701 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommand.java @@ -20,7 +20,6 @@ import org.ovirt.engine.core.common.validation.group.CreateEntity; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.VdcBllMessages; -import org.ovirt.engine.core.dal.dbbroker.DbFacade; @LockIdNameAttribute @InternalCommandAttribute @@ -32,18 +31,22 @@ @Override protected void executeCommand() { - StorageServerConnections currConnection = getConnection(); + StorageServerConnections connection = getParameters().getStorageServerConnection(); boolean isValidConnection = true; - Pair<Boolean, Integer> result = connect(getVds().getId()); + Pair<Boolean, Integer> result = connectToStorage(); isValidConnection = result.getFirst(); - // Add storage Connection to the database. - if (isValidConnection && (StringUtils.isNotEmpty(currConnection.getid()) - || getDbFacade().getStorageServerConnectionDao().get(currConnection.getid()) == null)) { - currConnection.setid(Guid.NewGuid().toString()); - getDbFacade().getStorageServerConnectionDao().save(currConnection); - getReturnValue().setActionReturnValue(getConnection().getid()); - setSucceeded(true); + // Add storage connection to the database. + if (isValidConnection) { + //if there was no id sent by client, or if there was sent id, but this id already exists in db - allocate a new id. + //since canDoAction already checks if there is a same connection in db (same by content, not by id), + // we can assume here that if the id received is already taken - it can be overriden by a new one + if(StringUtils.isEmpty(connection.getid()) || getConnectionFromDbById(connection.getid()) !=null) { + connection.setid(Guid.NewGuid().toString()); + } + saveConnection(connection); + getReturnValue().setActionReturnValue(getConnection().getid()); + setSucceeded(true); } else { VdcFault fault = new VdcFault(); @@ -53,22 +56,32 @@ } } - @Override - protected StorageServerConnections getConnection() { - if (StringUtils.isEmpty(getParameters().getStorageServerConnection().getid())) { - List<StorageServerConnections> connections; - if ((connections = DbFacade.getInstance().getStorageServerConnectionDao().getAllForStorage( - getParameters().getStorageServerConnection().getconnection())).size() != 0) { - getParameters().setStorageServerConnection(connections.get(0)); - } + protected StorageServerConnections getConnectionFromDbById(String connectionId) { + return getDbFacade().getStorageServerConnectionDao().get(connectionId); + } + + protected Pair<Boolean, Integer> connectToStorage() { + Guid vdsId = getVds().getId(); + Pair<Boolean, Integer> result = connect(vdsId); + return result; + } + + protected void saveConnection(StorageServerConnections connection) { + getDbFacade().getStorageServerConnectionDao().save(connection); + } + + protected boolean isConnWithSameDetailsExists() { + String connection = getParameters().getStorageServerConnection().getconnection(); + if ((getDbFacade().getStorageServerConnectionDao().getAllForStorage(connection)).size() != 0) { + return true; } - return (getParameters()).getStorageServerConnection(); + return false; } @Override protected boolean canDoAction() { boolean returnValue = true; - StorageServerConnections paramConnection = getParameters().getStorageServerConnection(); + StorageServerConnections paramConnection = getConnection(); if (paramConnection.getstorage_type() == StorageType.NFS && !new NfsMountPointConstraint().isValid(paramConnection.getconnection(), null)) { returnValue = false; @@ -76,6 +89,9 @@ } if (paramConnection.getstorage_type() == StorageType.POSIXFS && (StringUtils.isEmpty(paramConnection.getVfsType()))) { return failCanDoAction(VdcBllMessages.VALIDATION_STORAGE_CONNECTION_EMPTY_VFSTYPE); + } + if(isConnWithSameDetailsExists()) { + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_ALREADY_EXISTS); } if (getParameters().getVdsId().equals(Guid.Empty)) { @@ -105,4 +121,10 @@ LockMessagesMatchUtil.makeLockingPair(LockingGroup.STORAGE_CONNECTION, VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED)); } + + @Override + protected void setActionMessageParameters() { + addCanDoActionMessage(VdcBllMessages.VAR__ACTION__ADD); + addCanDoActionMessage(VdcBllMessages.VAR__TYPE__STORAGE__CONNECTION); + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStorageServerConnectionCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStorageServerConnectionCommand.java index da052fe..a9ed4e1 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStorageServerConnectionCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStorageServerConnectionCommand.java @@ -154,6 +154,6 @@ @Override protected void setActionMessageParameters() { addCanDoActionMessage(VdcBllMessages.VAR__ACTION__REMOVE); - addCanDoActionMessage(VdcBllMessages.VAR__TYPE__STORAGE__DOMAIN); + addCanDoActionMessage(VdcBllMessages.VAR__TYPE__STORAGE__CONNECTION); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java index 7646d96..c780460 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/UpdateStorageServerConnectionCommand.java @@ -267,6 +267,6 @@ @Override protected void setActionMessageParameters() { addCanDoActionMessage(VdcBllMessages.VAR__ACTION__UPDATE); - addCanDoActionMessage(VdcBllMessages.VAR__TYPE__STORAGE__DOMAIN); + addCanDoActionMessage(VdcBllMessages.VAR__TYPE__STORAGE__CONNECTION); } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommandTest.java index 0027f3f..24b26de 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/AddStorageServerConnectionCommandTest.java @@ -1,20 +1,23 @@ package org.ovirt.engine.core.bll.storage; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; import org.ovirt.engine.core.bll.CanDoActionTestUtils; +import org.ovirt.engine.core.bll.CommandAssertUtils; import org.ovirt.engine.core.common.action.StorageServerConnectionParametersBase; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; import org.ovirt.engine.core.common.businessentities.StorageType; +import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.utils.MockEJBStrategyRule; - -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; @RunWith(MockitoJUnitRunner.class) public class AddStorageServerConnectionCommandTest { @@ -27,13 +30,16 @@ @Before public void prepareParams() { - parameters = new StorageServerConnectionParametersBase(); - parameters.setVdsId(Guid.NewGuid()); - parameters.setStoragePoolId(Guid.NewGuid()); - command = spy(new AddStorageServerConnectionCommand<StorageServerConnectionParametersBase>(parameters)); + parameters = new StorageServerConnectionParametersBase(); + parameters.setVdsId(Guid.NewGuid()); + parameters.setStoragePoolId(Guid.NewGuid()); + command = spy(new AddStorageServerConnectionCommand<StorageServerConnectionParametersBase>(parameters)); } - private StorageServerConnections createPosixConnection(String connection, StorageType type, String vfsType, String mountOptions) { + private StorageServerConnections createPosixConnection(String connection, + StorageType type, + String vfsType, + String mountOptions) { Guid id = Guid.NewGuid(); StorageServerConnections connectionDetails = populateBasicConnectionDetails(id, connection, type); connectionDetails.setVfsType(vfsType); @@ -49,22 +55,64 @@ return connectionDetails; } - @Test - public void updatePosixEmptyVFSType() { - StorageServerConnections newPosixConnection = createPosixConnection("multipass.my.domain.tlv.company.com:/export/allstorage/data1", StorageType.POSIXFS, null , "timeo=30"); + @Test + public void addPosixEmptyVFSType() { + StorageServerConnections newPosixConnection = + createPosixConnection("multipass.my.domain.tlv.company.com:/export/allstorage/data1", + StorageType.POSIXFS, + null, + "timeo=30"); parameters.setStorageServerConnection(newPosixConnection); CanDoActionTestUtils.runAndAssertCanDoActionFailure(command, VdcBllMessages.VALIDATION_STORAGE_CONNECTION_EMPTY_VFSTYPE); } @Test - public void updatePosixNonEmptyVFSType() { - StorageServerConnections newPosixConnection = createPosixConnection("multipass.my.domain.tlv.company.com:/export/allstorage/data1", StorageType.POSIXFS, "nfs" , "timeo=30"); + public void addPosixNonEmptyVFSType() { + StorageServerConnections newPosixConnection = + createPosixConnection("multipass.my.domain.tlv.company.com:/export/allstorage/data1", + StorageType.POSIXFS, + "nfs", + "timeo=30"); parameters.setStorageServerConnection(newPosixConnection); parameters.setVdsId(Guid.Empty); doReturn(true).when(command).InitializeVds(); + doReturn(false).when(command).isConnWithSameDetailsExists(); CanDoActionTestUtils.runAndAssertCanDoActionSuccess(command); } + @Test + public void addExistingConnection() { + StorageServerConnections newPosixConnection = + createPosixConnection("multipass.my.domain.tlv.company.com:/export/allstorage/data1", + StorageType.POSIXFS, + "nfs", + "timeo=30"); + parameters.setStorageServerConnection(newPosixConnection); + parameters.setVdsId(Guid.Empty); + doReturn(true).when(command).InitializeVds(); + doReturn(true).when(command).isConnWithSameDetailsExists(); + CanDoActionTestUtils.runAndAssertCanDoActionFailure(command, + VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_ALREADY_EXISTS); + } + @Test + public void addNewConnection() { + StorageServerConnections newPosixConnection = + createPosixConnection("multipass.my.domain.tlv.company.com:/export/allstorage/data1", + StorageType.POSIXFS, + "nfs", + "timeo=30"); + newPosixConnection.setid(""); + parameters.setStorageServerConnection(newPosixConnection); + parameters.setVdsId(Guid.Empty); + doReturn(true).when(command).InitializeVds(); + doReturn(false).when(command).isConnWithSameDetailsExists(); + Pair<Boolean, Integer> connectResult = new Pair(true,0); + doReturn(connectResult).when(command).connectToStorage(); + doReturn(null).when(command).getConnectionFromDbById(newPosixConnection.getid()); + doNothing().when(command).saveConnection(newPosixConnection); + command.executeCommand(); + CommandAssertUtils.checkSucceeded(command, true); + } } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java index d695e14..02c756b 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/VdcBllMessages.java @@ -507,6 +507,7 @@ ACTION_TYPE_FAILED_UP_VDSS_IN_CLUSTER, VAR__TYPE__STORAGE__POOL, VAR__TYPE__STORAGE__DOMAIN, + VAR__TYPE__STORAGE__CONNECTION, VAR__ACTION__ATTACH, VAR__ACTION__DETACH, VAR__ACTION__ACTIVATE, 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 45a7034..51fbe65 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 @@ -778,8 +778,13 @@ } private void cleanConnection(StorageServerConnections connection, Guid hostId) { - Frontend.RunAction(VdcActionType.RemoveStorageServerConnection, new StorageServerConnectionParametersBase(connection, hostId), + //if create connection command was the one to fail and didn't create a connection + //then the id of connection will be empty, and there's nothing to delete. + if(connection.getid()!=null && !connection.getid().equalsIgnoreCase("")) { + Frontend.RunAction(VdcActionType.RemoveStorageServerConnection, new StorageServerConnectionParametersBase(connection, hostId), null, this); + } + } private void remove() -- To view, visit http://gerrit.ovirt.org/15388 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: If9bcef8a413589654d36db8d878c844550ae6066 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Alissa Bonas <abo...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches