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