Daniel Erez has uploaded a new change for review.

Change subject: core,restapi: attach detach storage connections
......................................................................

core,restapi: attach detach storage connections

Change-Id: I319bc9f51c81e2df0c7ed3b3338fcd7b4783fe84
Signed-off-by: Daniel Erez <de...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetLunsByVgIdQuery.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AttachStorageConnectionToStorageDomainCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageConnectionFromStorageDomainCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/StorageConnectionValidator.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AttachDetachStorageConnectionParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainServerConnectionsResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainsResource.java
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainServerConnectionsResource.java
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
M 
frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
M 
frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties
14 files changed, 415 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/64/17864/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetLunsByVgIdQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetLunsByVgIdQuery.java
index 901a548..3cacf5d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetLunsByVgIdQuery.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetLunsByVgIdQuery.java
@@ -5,6 +5,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.ovirt.engine.core.common.AttachDetachStorageConnectionParameters;
 import 
org.ovirt.engine.core.common.businessentities.LUN_storage_server_connection_map;
 import org.ovirt.engine.core.common.businessentities.LUNs;
 import org.ovirt.engine.core.common.businessentities.StorageType;
@@ -26,10 +27,17 @@
     @Override
     protected void executeQueryCommand() {
         List<LUNs> luns = getLunsForVgId(getVgId());
+        List<LUNs> nonDummyLuns = new ArrayList<LUNs>();
         StorageType storageType = getStorageType(luns);
         Map<String, LUNs> lunsFromDeviceMap = 
getLunsFromDeviceMap(storageType);
 
         for (LUNs lun : luns) {
+            // Filter dummy luns
+            if 
(lun.getLUN_id().startsWith(AttachDetachStorageConnectionParameters.DUMMY_LUN_ID_PREFIX))
 {
+                continue;
+            }
+            nonDummyLuns.add(lun);
+
             // Update LUN's connections
             for (LUN_storage_server_connection_map map : 
getLunConnections(lun.getLUN_id())) {
                 addConnection(lun, 
getConnection(map.getstorage_server_connection()));
@@ -42,7 +50,7 @@
             }
         }
 
-        setReturnValue(luns);
+        setReturnValue(nonDummyLuns);
     }
 
     private StorageType getStorageType(List<LUNs> luns) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AttachStorageConnectionToStorageDomainCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AttachStorageConnectionToStorageDomainCommand.java
new file mode 100644
index 0000000..613a20a
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/AttachStorageConnectionToStorageDomainCommand.java
@@ -0,0 +1,95 @@
+package org.ovirt.engine.core.bll.storage;
+
+import java.util.List;
+
+import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
+import org.ovirt.engine.core.bll.validator.StorageConnectionValidator;
+import org.ovirt.engine.core.common.AttachDetachStorageConnectionParameters;
+import 
org.ovirt.engine.core.common.businessentities.LUN_storage_server_connection_map;
+import org.ovirt.engine.core.common.businessentities.LUNs;
+import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.utils.transaction.TransactionMethod;
+import org.ovirt.engine.core.utils.transaction.TransactionSupport;
+
+@NonTransactiveCommandAttribute(forceCompensation = true)
+public class AttachStorageConnectionToStorageDomainCommand<T extends 
AttachDetachStorageConnectionParameters>
+        extends StorageDomainCommandBase<T> {
+
+    public AttachStorageConnectionToStorageDomainCommand(T parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        StorageConnectionValidator storageConnectionValidator = 
createStorageConnectionValidator();
+        LUN_storage_server_connection_map connectionMapRecord = new 
LUN_storage_server_connection_map(
+                AttachDetachStorageConnectionParameters.DUMMY_LUN_ID_PREFIX + 
getStorageDomain().getId(),
+                getParameters().getStorageConnectionId());
+
+        if (!validate(storageConnectionValidator.isConnectionExists())
+                || 
!validate(storageConnectionValidator.isDomainOfConnectionExistsAndNonActive(getStorageDomain()))
+                || 
!validate(storageConnectionValidator.isScsiConnectionAndDomain(getStorageDomain()))
+                || 
!validate(storageConnectionValidator.isConnectionForDomainAlreadyExists(connectionMapRecord)))
 {
+            return false;
+        }
+
+        return true;
+    }
+
+    protected StorageConnectionValidator createStorageConnectionValidator() {
+        String connectionId = getParameters().getStorageConnectionId();
+        StorageServerConnections connection = 
getStorageServerConnectionDAO().get(connectionId);
+
+        return new StorageConnectionValidator(connection);
+    }
+
+    @Override
+    protected void executeCommand() {
+        // Create a dummy lun
+        final LUNs dummyLun = new LUNs();
+        
dummyLun.setLUN_id(AttachDetachStorageConnectionParameters.DUMMY_LUN_ID_PREFIX 
+ getStorageDomainId());
+        dummyLun.setvolume_group_id(getStorageDomain().getStorage());
+
+        // Create storage server connection mapping
+        final LUN_storage_server_connection_map connectionMapRecord =
+                new LUN_storage_server_connection_map(dummyLun.getLUN_id(), 
getParameters().getStorageConnectionId());
+
+        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+            @Override
+            public Void runInTransaction() {
+                List<StorageServerConnections> connectionsForDomain = null;
+
+                if (getLunDao().get(dummyLun.getLUN_id()) == null) {
+                    getLunDao().save(dummyLun);
+
+                    // Save connection maps when creating the dummy lun for 
the first time
+                    connectionsForDomain = 
getStorageServerConnectionDAO().getAllForDomain(getStorageDomainId());
+                    for (StorageServerConnections connection : 
connectionsForDomain) {
+                        saveConnection(new 
LUN_storage_server_connection_map(dummyLun.getLUN_id(), connection.getid()));
+                    }
+                }
+
+                // Save new connection map
+                saveConnection(connectionMapRecord);
+
+                return null;
+            }
+
+            private void saveConnection(LUN_storage_server_connection_map 
connectionMapRecord) {
+                if 
(getDbFacade().getStorageServerConnectionLunMapDao().get(connectionMapRecord.getId())
 == null) {
+                    
getDbFacade().getStorageServerConnectionLunMapDao().save(connectionMapRecord);
+                }
+            }
+        });
+
+        setSucceeded(true);
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__ATTACH_ACTION_TO);
+        addCanDoActionMessage(VdcBllMessages.VAR__TYPE__STORAGE__CONNECTION);
+    }
+
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageConnectionFromStorageDomainCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageConnectionFromStorageDomainCommand.java
new file mode 100644
index 0000000..6b38b61
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DetachStorageConnectionFromStorageDomainCommand.java
@@ -0,0 +1,80 @@
+package org.ovirt.engine.core.bll.storage;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
+import org.ovirt.engine.core.bll.validator.StorageConnectionValidator;
+import org.ovirt.engine.core.common.AttachDetachStorageConnectionParameters;
+import 
org.ovirt.engine.core.common.businessentities.LUN_storage_server_connection_map;
+import org.ovirt.engine.core.common.businessentities.LUNs;
+import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.utils.transaction.TransactionMethod;
+import org.ovirt.engine.core.utils.transaction.TransactionSupport;
+
+@NonTransactiveCommandAttribute(forceCompensation = true)
+public class DetachStorageConnectionFromStorageDomainCommand<T extends 
AttachDetachStorageConnectionParameters>
+        extends StorageDomainCommandBase<T> {
+
+    public DetachStorageConnectionFromStorageDomainCommand(T parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        StorageConnectionValidator storageConnectionValidator = 
createStorageConnectionValidator();
+        List<StorageServerConnections> connectionsForDomain =
+                
getStorageServerConnectionDAO().getAllForDomain(getStorageDomainId());
+        LUN_storage_server_connection_map connectionMapRecord = new 
LUN_storage_server_connection_map(
+                AttachDetachStorageConnectionParameters.DUMMY_LUN_ID_PREFIX + 
getStorageDomain().getId(),
+                getParameters().getStorageConnectionId());
+
+        if (!validate(storageConnectionValidator.isConnectionExists())
+                || 
!validate(storageConnectionValidator.isDomainOfConnectionExistsAndNonActive(getStorageDomain()))
+                || 
!validate(storageConnectionValidator.isScsiConnectionAndDomain(getStorageDomain()))
+                || 
!validate(storageConnectionValidator.isConnectionForDomainNotExists(connectionsForDomain)))
 {
+            return false;
+        }
+
+        return true;
+    }
+
+    protected StorageConnectionValidator createStorageConnectionValidator() {
+        String connectionId = getParameters().getStorageConnectionId();
+        StorageServerConnections connection = 
getStorageServerConnectionDAO().get(connectionId);
+
+        return new StorageConnectionValidator(connection);
+    }
+
+    @Override
+    protected void executeCommand() {
+        String connectionId = getParameters().getStorageConnectionId();
+        List<LUNs> lunsForConnection = 
getLunDao().getAllForStorageServerConnection(connectionId);
+        List<LUNs> lunsForVG = 
getLunDao().getAllForVolumeGroup(getStorageDomain().getStorage());
+        final Collection<LUNs> lunsToRemove =
+                (Collection<LUNs>) 
CollectionUtils.intersection(lunsForConnection, lunsForVG);
+
+        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+            @Override
+            public Void runInTransaction() {
+                for (LUNs lun : lunsToRemove) {
+                    if (getLunDao().get(lun.getLUN_id()) != null) {
+                        getLunDao().remove(lun.getLUN_id());
+                    }
+                }
+                return null;
+            }
+        });
+
+        setSucceeded(true);
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__DETACH);
+        addCanDoActionMessage(VdcBllMessages.VAR__TYPE__STORAGE__CONNECTION);
+    }
+
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/StorageConnectionValidator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/StorageConnectionValidator.java
new file mode 100644
index 0000000..fabe789
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/StorageConnectionValidator.java
@@ -0,0 +1,76 @@
+package org.ovirt.engine.core.bll.validator;
+
+import java.util.List;
+
+import org.ovirt.engine.core.bll.ValidationResult;
+import 
org.ovirt.engine.core.common.businessentities.LUN_storage_server_connection_map;
+import org.ovirt.engine.core.common.businessentities.StorageDomain;
+import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
+import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
+import org.ovirt.engine.core.common.businessentities.StorageType;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+
+public class StorageConnectionValidator {
+    protected static final String STORAGE_DOMAIN_NAME_REPLACEMENT = 
"$domainNames %1$s";
+
+    private StorageServerConnections connection;
+
+    public StorageConnectionValidator(StorageServerConnections connection) {
+        this.connection = connection;
+    }
+
+    public ValidationResult isConnectionExists() {
+        if (connection == null) {
+            return new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_NOT_EXIST);
+        }
+
+        return ValidationResult.VALID;
+    }
+
+    public ValidationResult isScsiConnectionAndDomain(StorageDomain 
storageDomain) {
+        StorageType connectionStorageType = connection.getstorage_type();
+        StorageType storageDomainType = storageDomain.getStorageType();
+
+        if (!connectionStorageType.equals(StorageType.ISCSI) || 
!storageDomainType.equals(StorageType.ISCSI)) {
+            return new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_STORAGE_TYPE);
+        }
+
+        return ValidationResult.VALID;
+    }
+
+    public ValidationResult 
isDomainOfConnectionExistsAndNonActive(StorageDomain storageDomain) {
+        if (storageDomain == null) {
+            return new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_EXIST);
+        }
+        if (storageDomain.getStatus() != StorageDomainStatus.Maintenance
+                && storageDomain.getStatus() != 
StorageDomainStatus.Unattached) {
+            return new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_DOMAINS_MAINTENANCE,
+                    String.format(STORAGE_DOMAIN_NAME_REPLACEMENT, 
storageDomain.getStorageName()));
+        }
+
+        return ValidationResult.VALID;
+    }
+
+    public ValidationResult 
isConnectionForDomainAlreadyExists(LUN_storage_server_connection_map 
connectionMapRecord) {
+        if (connectionMapRecord != null) {
+            return new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_ALREADY_EXISTS);
+        }
+
+        return ValidationResult.VALID;
+    }
+
+    public ValidationResult 
isConnectionForDomainNotExists(List<StorageServerConnections> 
connectionsForDomain) {
+        boolean isConnectionForDomainExists = false;
+        for (StorageServerConnections connectionForDomain : 
connectionsForDomain) {
+            if (connectionForDomain.getid().equals(connection.getid())) {
+                isConnectionForDomainExists = true;
+                break;
+            }
+        }
+        if (!isConnectionForDomainExists) {
+            return new 
ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_NOT_EXIST);
+        }
+
+        return ValidationResult.VALID;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AttachDetachStorageConnectionParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AttachDetachStorageConnectionParameters.java
new file mode 100644
index 0000000..f13509c
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AttachDetachStorageConnectionParameters.java
@@ -0,0 +1,27 @@
+package org.ovirt.engine.core.common;
+
+import org.ovirt.engine.core.common.action.StorageDomainParametersBase;
+import org.ovirt.engine.core.compat.Guid;
+
+public class AttachDetachStorageConnectionParameters extends 
StorageDomainParametersBase {
+
+    public final static String DUMMY_LUN_ID_PREFIX = "DUMMY_LUN_";
+
+    private String storageConnectionId;
+
+    public String getStorageConnectionId() {
+        return storageConnectionId;
+    }
+
+    public void setStorageConnectionId(String storageConnectionId) {
+        this.storageConnectionId = storageConnectionId;
+    }
+
+    public AttachDetachStorageConnectionParameters() {
+    }
+
+    public AttachDetachStorageConnectionParameters(Guid storageDomainId, 
String storageConnectionId) {
+        super(storageDomainId);
+        setStorageConnectionId(storageConnectionId);
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
index b0e17c1..08e686d 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
@@ -228,6 +228,8 @@
     ExtendImageSize(1013, false, QuotaDependency.STORAGE),
     ImportRepoImage(1014, ActionGroup.CREATE_DISK, QuotaDependency.STORAGE),
     ExportRepoImage(1015, QuotaDependency.NONE),
+    AttachStorageConnectionToStorageDomain(1016, 
ActionGroup.MANIPULATE_STORAGE_DOMAIN, QuotaDependency.NONE),
+    DetachStorageConnectionFromStorageDomain(1017, 
ActionGroup.MANIPULATE_STORAGE_DOMAIN, QuotaDependency.NONE),
 
     // Event Notification
     AddEventSubscription(1100, false, QuotaDependency.NONE),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
index 0af16d8..5572499 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
@@ -454,7 +454,9 @@
     ACTION_TYPE_FAILED_STORAGE_POOL_NOT_EXIST(ErrorType.BAD_PARAMETERS),
     ACTION_TYPE_FAILED_STORAGE_DOMAIN_NOT_EXIST(ErrorType.BAD_PARAMETERS),
     ACTION_TYPE_FAILED_STORAGE_CONNECTION_NOT_EXIST(ErrorType.BAD_PARAMETERS),
+    
ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_NOT_EXIST(ErrorType.BAD_PARAMETERS),
     
ACTION_TYPE_FAILED_STORAGE_CONNECTION_ALREADY_EXISTS(ErrorType.BAD_PARAMETERS),
+    
ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_ALREADY_EXISTS(ErrorType.BAD_PARAMETERS),
     
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_STORAGE_TYPE(ErrorType.NOT_SUPPORTED),
     
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_DOMAINS_MAINTENANCE(ErrorType.NOT_SUPPORTED),
     
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_RUNNING_VMS_AND_DOMAINS_MAINTENANCE(ErrorType.NOT_SUPPORTED),
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 b04220a..119f794 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -369,9 +369,11 @@
 ACTION_TYPE_FAILED_NAME_ALREADY_USED=Cannot ${action} ${type}. The ${type} 
name is already in use, please choose a unique name and try again.
 ACTION_TYPE_FAILED_URL_INVALID=Cannot ${action} ${type}. The URL is not valid, 
please enter a valid URL and try again.
 ACTION_TYPE_FAILED_STORAGE_CONNECTION_NOT_EXIST=Cannot ${action} ${type}. 
Storage connection doesn't exist.
+ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_NOT_EXIST=Cannot ${action} 
${type}. Storage connection is not attached to the specified domain.
 ACTION_TYPE_FAILED_STORAGE_CONNECTION_ID_EMPTY=Cannot ${action} ${type}. 
Storage connection id is empty.
 ACTION_TYPE_FAILED_STORAGE_CONNECTION_ID_NOT_EMPTY=Cannot ${action} ${type}. 
Storage connection id is not empty.
 ACTION_TYPE_FAILED_STORAGE_CONNECTION_ALREADY_EXISTS=Cannot ${action} ${type}. 
Storage connection already exists.
+ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_ALREADY_EXISTS=Cannot 
${action} ${type}. Storage connection is already attached to the specified 
domain.
 
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_STORAGE_TYPE=Cannot
 ${action} ${type}. Storage connection parameters can be edited only for NFS, 
Posix, local or iSCSI data domains.
 
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_DOMAINS_MAINTENANCE=Cannot
 ${action} ${type}. The data domains ${domainNames} should be in maintenance.
 
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_RUNNING_VMS_AND_DOMAINS_MAINTENANCE=Cannot
 ${action} ${type}. The data domains ${domainNames} should be in maintenance, 
and VMs ${vmNames} should be down..
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainServerConnectionsResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainServerConnectionsResource.java
new file mode 100644
index 0000000..e511d9d
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/StorageDomainServerConnectionsResource.java
@@ -0,0 +1,33 @@
+package org.ovirt.engine.api.resource;
+
+import org.jboss.resteasy.annotations.providers.jaxb.Formatted;
+import org.ovirt.engine.api.model.StorageConnection;
+import org.ovirt.engine.api.model.StorageConnections;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+
+@Produces({ ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML })
+public interface StorageDomainServerConnectionsResource {
+    @GET
+    @Formatted
+    public StorageConnections list();
+
+    @POST
+    @Formatted
+    @Consumes({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+    public Response add(StorageConnection storageConnection);
+
+    @DELETE
+    @Path("{id}")
+    public Response remove(@PathParam("id") String id);
+
+    @Path("{id}")
+    public StorageDomainServerConnectionResource 
getStorageDomainServerConnectionSubResource(@PathParam("id") String id);
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainsResource.java
index 1e6c1ae..2074fdf 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainsResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendAttachedStorageDomainsResource.java
@@ -52,7 +52,8 @@
     }
 
     @Override
-    public Response add(StorageDomain storageDomain) {
+    public Response
+    add(StorageDomain storageDomain) {
         validateParameters(storageDomain, "id|name");
 
         Guid storageDomainId;
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainServerConnectionsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainServerConnectionsResource.java
new file mode 100644
index 0000000..56ed881
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageDomainServerConnectionsResource.java
@@ -0,0 +1,77 @@
+package org.ovirt.engine.api.restapi.resource;
+
+import org.ovirt.engine.api.model.StorageConnection;
+import org.ovirt.engine.api.model.StorageConnections;
+import org.ovirt.engine.api.resource.StorageDomainServerConnectionResource;
+import org.ovirt.engine.api.resource.StorageDomainServerConnectionsResource;
+import org.ovirt.engine.core.common.AttachDetachStorageConnectionParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryType;
+import org.ovirt.engine.core.compat.Guid;
+
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+public class BackendStorageDomainServerConnectionsResource extends 
AbstractBackendCollectionResource<StorageConnection, StorageServerConnections> 
implements StorageDomainServerConnectionsResource {
+
+    Guid storageDomainId = null;
+
+    public BackendStorageDomainServerConnectionsResource(Guid storageDomainId) 
{
+        super(StorageConnection.class, StorageServerConnections.class);
+        this.storageDomainId = storageDomainId;
+    }
+
+    @Override
+    public StorageConnections list() {
+        List<StorageServerConnections> connections = getConnections();
+        return mapCollection(connections);
+    }
+
+    protected List<StorageServerConnections> getConnections() {
+        return getEntity(List.class,
+                VdcQueryType.GetStorageServerConnectionsForDomain,
+                new IdQueryParameters(storageDomainId),
+                "storage domain: id=" + storageDomainId);
+    }
+
+    @Override
+    protected StorageConnection doPopulate(StorageConnection model, 
StorageServerConnections entity) {
+        return model;
+    }
+
+    private StorageConnections mapCollection(List<StorageServerConnections> 
entities) {
+        StorageConnections collection = new StorageConnections();
+        for (StorageServerConnections entity : entities) {
+            StorageConnection connection = map(entity);
+            if (connection != null) {
+                
collection.getStorageConnections().add(addLinks(populate(connection, entity)));
+            }
+        }
+        return collection;
+    }
+
+    @Override
+    public Response add(StorageConnection storageConnection) {
+        validateParameters(storageConnection, "id");
+
+        return 
performAction(VdcActionType.AttachStorageConnectionToStorageDomain,
+                new AttachDetachStorageConnectionParameters(storageDomainId, 
storageConnection.getId()));
+    }
+
+    @Override
+    public Response performRemove(String id) {
+        AttachDetachStorageConnectionParameters params =
+                new AttachDetachStorageConnectionParameters(storageDomainId, 
id);
+
+        return 
performAction(VdcActionType.DetachStorageConnectionFromStorageDomain, params);
+    }
+
+    @Override
+    @SingleEntityResource
+    public StorageDomainServerConnectionResource 
getStorageDomainServerConnectionSubResource(@PathParam("id") String id) {
+        return inject(new BackendStorageDomainServerConnectionResource(id, 
this));
+    }
+}
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 4d498fe..e285444 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
@@ -1021,6 +1021,9 @@
     @DefaultStringValue("Cannot ${action} ${type}. Storage connection doesn't 
exist.")
     String ACTION_TYPE_FAILED_STORAGE_CONNECTION_NOT_EXIST();
 
+    @DefaultStringValue("Cannot ${action} ${type}. Storage connection is not 
attached to the specified domain.")
+    String ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_NOT_EXIST();
+
     @DefaultStringValue("Cannot ${action} ${type}. No active data Storage 
Domain with enough storage was found in the Data Center.")
     String ACTION_TYPE_FAILED_NO_SUITABLE_DOMAIN_FOUND();
 
@@ -1030,6 +1033,9 @@
     @DefaultStringValue("Cannot ${action} ${type}. Storage connection already 
exists.")
     String ACTION_TYPE_FAILED_STORAGE_CONNECTION_ALREADY_EXISTS();
 
+    @DefaultStringValue("Cannot ${action} ${type}. Storage connection is 
already attached to the specified domain.")
+    String ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_ALREADY_EXISTS();
+
     @DefaultStringValue("Cannot ${action} ${type}. Storage connection 
parameters can be edited only for NFS, Posix, local or iSCSI data domains.")
     String 
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_STORAGE_TYPE();
 
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 faa0147..b594e4b 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
@@ -349,9 +349,11 @@
 VALIDATION_VDS_CONSOLEADDRESSS_HOSTNAME_OR_IP=Console address must be a FQDN 
or a valid IP address
 ACTION_TYPE_FAILED_URL_INVALID=Cannot ${action} ${type}. The URL is not valid, 
please enter a valid URL and try again.
 ACTION_TYPE_FAILED_STORAGE_CONNECTION_NOT_EXIST=Cannot ${action} ${type}. 
Storage connection doesn't exist.
+ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_NOT_EXIST=Cannot ${action} 
${type}. Storage connection is not attached to the specified domain.
 ACTION_TYPE_FAILED_STORAGE_CONNECTION_ID_EMPTY=Cannot ${action} ${type}. 
Storage connection id is empty.
 ACTION_TYPE_FAILED_STORAGE_CONNECTION_ID_NOT_EMPTY=Cannot ${action} ${type}. 
Storage connection id is not empty.
 ACTION_TYPE_FAILED_STORAGE_CONNECTION_ALREADY_EXISTS=Cannot ${action} ${type}. 
Storage connection already exists.
+ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_ALREADY_EXISTS=Cannot 
${action} ${type}. Storage connection is already attached to the specified 
domain.
 
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_STORAGE_TYPE=Cannot
 ${action} ${type}. Storage connection parameters can be edited only for NFS, 
Posix, local or iSCSI data domains.
 
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_DOMAINS_MAINTENANCE=Cannot
 ${action} ${type}. The data domains ${domainNames} should be in maintenance.
 
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_RUNNING_VMS_AND_DOMAINS_MAINTENANCE=Cannot
 ${action} ${type}. The data domains ${domainNames} should be in maintenance, 
and VMs ${vmNames} should be down.
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 031d8b2..3310345 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
@@ -373,9 +373,11 @@
 VALIDATION_VDS_CONSOLEADDRESSS_HOSTNAME_OR_IP=Console address must be a FQDN 
or a valid IP address
 ACTION_TYPE_FAILED_URL_INVALID=Cannot ${action} ${type}. The URL is not valid, 
please enter a valid URL and try again.
 ACTION_TYPE_FAILED_STORAGE_CONNECTION_NOT_EXIST=Cannot ${action} ${type}. 
Storage connection doesn't exist.
+ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_NOT_EXIST=Cannot ${action} 
${type}. Storage connection is not attached to the specified domain.
 ACTION_TYPE_FAILED_STORAGE_CONNECTION_ID_EMPTY=Cannot ${action} ${type}. 
Storage connection id is empty.
 ACTION_TYPE_FAILED_STORAGE_CONNECTION_ID_NOT_EMPTY=Cannot ${action} ${type}. 
Storage connection id is not empty.
 ACTION_TYPE_FAILED_STORAGE_CONNECTION_ALREADY_EXISTS=Cannot ${action} ${type}. 
Storage connection already exists.
+ACTION_TYPE_FAILED_STORAGE_CONNECTION_FOR_DOMAIN_ALREADY_EXISTS=Cannot 
${action} ${type}. Storage connection is already attached to the specified 
domain.
 
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_STORAGE_TYPE=Cannot
 ${action} ${type}. Storage connection parameters can be edited only for NFS, 
Posix, local or iSCSI data domains.
 
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_DOMAINS_MAINTENANCE=Cannot
 ${action} ${type}. The data domains ${domainNames} should be in maintenance.
 
ACTION_TYPE_FAILED_STORAGE_CONNECTION_UNSUPPORTED_ACTION_FOR_RUNNING_VMS=Cannot 
${action} ${type}. VMs ${vmNames} should be down.


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I319bc9f51c81e2df0c7ed3b3338fcd7b4783fe84
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Daniel Erez <de...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to