Michael Pasternak has posted comments on this change.
Change subject: restapi: add storage server connections resource
......................................................................
Patch Set 25: I would prefer that you didn't submit this
(10 inline comments)
few comments inline, but overall well done Alissa!
....................................................
File
backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/LinkHelper.java
Line 271: map = new ParentToCollectionMap(SnapshotResource.class,
SnapshotsResource.class, VM.class);
Line 272: TYPES.put(Snapshot.class, map);
Line 273:
Line 274: map = new
ParentToCollectionMap(StorageServerConnectionResource.class,
StorageServerConnectionsResource.class);
Line 275: map.add(StorageResource.class, HostStorageResource.class,
Host.class);
why do you replace a old one instead of adding the new relation?
Line 276: TYPES.put(Storage.class, map);
Line 277:
Line 278: map = new ParentToCollectionMap(StorageDomainResource.class,
StorageDomainsResource.class);
Line 279: map.add(AttachedStorageDomainResource.class,
AttachedStorageDomainsResource.class, DataCenter.class);
....................................................
File
backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
Line 1974: <xs:complexType name="Storage">
Line 1975: <xs:complexContent>
Line 1976: <xs:extension base="BaseResource">
Line 1977: <xs:sequence>
Line 1978: <xs:group ref="BaseStorageConnection"/>
if it's relevant for all connections, worth doing:
1. BaseStorageConnection::BaseResource
2. Storage::BaseStorageConnection
Line 1979: <xs:choice>
Line 1980: <xs:group ref="NfsStorage"/>
Line 1981: <xs:group ref="IscsiStorage"/>
Line 1982: <xs:group ref="IscsiStorageConnection"/>
....................................................
File
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageServerConnectionResource.java
Line 23: }
Line 24:
Line 25: @Override
Line 26: public Storage get() {
Line 27: return performGet(VdcQueryType.GetStorageServerConnectionById,
new StorageServerConnectionQueryParametersBase(guid.toString()));
not sure StorageServerConnectionQueryParametersBase should accept string rather
than UUID, if you don't have any use case, please consider replacing it with
UUID
Line 28: }
Line 29:
Line 30: @Override
Line 31: public Storage update(Storage connection) {
Line 28: }
Line 29:
Line 30: @Override
Line 31: public Storage update(Storage connection) {
Line 32: validateParameters(connection, "address", "type", "host");
why update require these fields? it should not have any restrictions at all.
just think of someone want to update 'description', he will have to supply
"address", "type", "host" as well ...
in api we using 'PATCH over PUT' concept for update, i.e on update pass only
what you need to change, all other data reside on the server side and can be
completed at runtime (this why you have in all mapper methods 'entity' and
'template' arguments)
Line 33: validateEnums(Storage.class, connection);
Line 34: return performUpdate(connection,
Line 35: new
QueryIdResolver<String>(VdcQueryType.GetStorageServerConnectionById,
StorageServerConnectionQueryParametersBase.class),
Line 36:
VdcActionType.UpdateStorageServerConnection,
Line 56: return new
StorageServerConnectionParametersBase(connection,hostId);
Line 57: }
Line 58:
Line 59: private Guid getHostId(Host host) {
Line 60: // presence of host ID or name already validated
1. as mentioned, do not demand it, but fetch from the existent
StorageServerConnections (if not specified in the 'incoming')
2. also AFAIR AbstractBackendActionableResource has same method,
worth finding a way to share it between all consumers
Line 61: return host.isSetId()
Line 62: ? new Guid(host.getId())
Line 63: : host.isSetName()
Line 64: ? getEntity(VDS.class,
....................................................
File
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendStorageServerConnectionsResource.java
Line 45: StorageConnections collection = new StorageConnections();
Line 46: for
(org.ovirt.engine.core.common.businessentities.StorageServerConnections entity
: entities) {
Line 47: Storage connection = map(entity);
Line 48: if (connection != null) {
Line 49: collection.getStorageConnections().add(connection);
you should be calling 'addLinks(populate(' on the entity you're adding,
otherwise it won't have any links and won't call doPopulate() when All-Content
header on the request path.
Line 50: }
Line 51: }
Line 52: return collection;
Line 53: }
Line 53: }
Line 54:
Line 55: @Override
Line 56: public Response add(Storage storage) {
Line 57: validateParameters(storage, "address", "type", "host");
1. you should be checking not just host existence, but id or name specified,
i.e "host.id|name"
2. does "address" relevant for all storage types? ...
Line 58: // map to backend object
Line 59: StorageServerConnections storageConnection =
Line 60: getMapper(Storage.class,
StorageServerConnections.class).map(storage, null);
Line 61: Guid hostId = getHostId(storage.getHost());
Line 57: validateParameters(storage, "address", "type", "host");
Line 58: // map to backend object
Line 59: StorageServerConnections storageConnection =
Line 60: getMapper(Storage.class,
StorageServerConnections.class).map(storage, null);
Line 61: Guid hostId = getHostId(storage.getHost());
in the way it implemented right now, if no id/name in the host specified, will
be triggered ""Hosts: name=" + storageDomain.getHost().getName()" i.e will be
listed all hosts in the system and as result will be taken first host in the
list instead of host being specified by the user
Line 62: switch (storageConnection.getstorage_type()) {
Line 63: case ISCSI:
Line 64: validateParameters(storage, "iqn", "port");
Line 65: break;
Line 78: getAddParams(storageConnection, hostId),
Line 79: ENTITY_RETRIEVER);
Line 80: }
Line 81:
Line 82: private Guid getHostId(Host host) {
same comment as in BackendStorageServerConnectionResource
Line 83: // presence of host ID or name already validated
Line 84: return host.isSetId()
Line 85: ? new Guid(host.getId())
Line 86: : host.isSetName()
....................................................
File
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendStorageServerConnectionResourceTest.java
Line 101: protected void update(boolean canDo, boolean
executeCommandResult, int getConnectionExecTimes) throws Exception {
Line 102: // the below method is called several times because
Line 103: // the mocked behavior must be recorded twice
Line 104: // since the getConnectionById query is executed
Line 105: // twice during a successful update operation.
the reasons for it to be called twice are:
1. combine PATH over PUT missing params from existent entity
2. fetch updated resource for return
Line 106: // not calling it twice causes the test to fail with NPE.
Line 107: for (int i = 0; i < getConnectionExecTimes; i++) {
Line 108: setUpGetEntityExpectations();
Line 109: }
--
To view, visit http://gerrit.ovirt.org/16617
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: comment
Gerrit-Change-Id: If6bc32ead098390723825872f6fb292097d52835
Gerrit-PatchSet: 25
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Alissa Bonas <[email protected]>
Gerrit-Reviewer: Alissa Bonas <[email protected]>
Gerrit-Reviewer: Allon Mureinik <[email protected]>
Gerrit-Reviewer: Daniel Erez <[email protected]>
Gerrit-Reviewer: Michael Pasternak <[email protected]>
Gerrit-Reviewer: Ori Liel <[email protected]>
Gerrit-Reviewer: Tal Nisan <[email protected]>
Gerrit-Reviewer: oVirt Jenkins CI Server
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches