Juan Hernandez has posted comments on this change.

Change subject: restapi: Phase 5: Add graphics console representation
......................................................................


Patch Set 8:

(16 comments)

https://gerrit.ovirt.org/#/c/39057/8/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmGraphicsConsoleResource.java
File 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmGraphicsConsoleResource.java:

Line 8: 
Line 9: public interface VmGraphicsConsoleResource {
Line 10: 
Line 11:     @Path("{action: (generate_descriptor)}")
Line 12:     public ActionResource getActionSubresource(@PathParam("action") 
String action);
There shouldn't be a "generate_descriptor" action, just an additional content 
type supported by a different GET method.
Line 13: 
Line 14:     @GET
Line 15:     @Produces({ ApiMediaType.APPLICATION_XML, 
ApiMediaType.APPLICATION_JSON,
Line 16:             ApiMediaType.APPLICATION_X_YAML})


Line 17:     public GraphicsConsole get();
Line 18: 
Line 19:     @GET
Line 20:     @Produces({ApiMediaType.APPLICATION_X_VIRT_VIEWER})
Line 21:     @Path("generate_descriptor")
This @Path annotation shouldn't be here, as this should be another @GET method, 
selected by JAX-RS according to the content type requested by the caller.
Line 22:     public String generateDescriptor();


Line 18: 
Line 19:     @GET
Line 20:     @Produces({ApiMediaType.APPLICATION_X_VIRT_VIEWER})
Line 21:     @Path("generate_descriptor")
Line 22:     public String generateDescriptor();
String is a poor implementation for potentially large data. Consider returning 
a "Response" object, and populate it inside the method implementation with an 
array of bytes.


https://gerrit.ovirt.org/#/c/39057/8/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
File 
backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml:

Line 468:           action.ticket.value: xs:string
Line 469:         description: Create a ticket for connecting to the VM using 
the display protocol.
Line 470: - name: /vms/{vm:id}/graphicsconsoles|rel=get
Line 471:   description: Get active graphics consoles of a VM.
Line 472:   request:
Remove this empty request description, it is automatically added to the RSDL 
document.
Line 473:     body:
Line 474:       parameterType: null
Line 475:       signatures: []
Line 476:     headers: {}


Line 476:     headers: {}
Line 477: - name: /vms/{vm:id}/graphicsconsoles/{graphicsconsole:id}|rel=get
Line 478:   description: Get active graphics console of a VM.
Line 479:   request:
Line 480:     body:
Remove the body description, if it is empty.
Line 481:       parameterType: null
Line 482:       signatures: []
Line 483:     headers: {}
Line 484: - name: 
/vms/{vm:id}/graphicsconsoles/{graphicsconsole:id}|rel=generate_descriptor


Line 479:   request:
Line 480:     body:
Line 481:       parameterType: null
Line 482:       signatures: []
Line 483:     headers: {}
The "Content-Type" header indicating the "application/x-virt-viewer" type 
should go here, as it is the same GET method that can return XML, JSON or 
virt-viewer configuration:

  headers:
    Content-Type:
      value: application/xml|json|x-virt-viewer
      required: false
Line 484: - name: 
/vms/{vm:id}/graphicsconsoles/{graphicsconsole:id}|rel=generate_descriptor
Line 485:   description: Generates text filled filled with console data. This 
file can be used to initiate console session using remote-viewer application.
Line 486:   request:
Line 487:     body:


Line 480:     body:
Line 481:       parameterType: null
Line 482:       signatures: []
Line 483:     headers: {}
Line 484: - name: 
/vms/{vm:id}/graphicsconsoles/{graphicsconsole:id}|rel=generate_descriptor
There shouldn't be an additional link, just an additional content-type in the 
description of the previous link.
Line 485:   description: Generates text filled filled with console data. This 
file can be used to initiate console session using remote-viewer application.
Line 486:   request:
Line 487:     body:
Line 488:       parameterType: null


https://gerrit.ovirt.org/#/c/39057/8/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmGraphicsConsoleResource.java
File 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmGraphicsConsoleResource.java:

Line 52: 
Line 53:         Fault fault = new Fault();
Line 54:         fault.setReason("Unsupported console ID");
Line 55:         fault.setDetail("Supported console IDs are: " + 
StringUtils.join(supportedIds, ", "));
Line 56:         throw new 
WebApplicationException(Response.status(Response.Status.BAD_REQUEST).entity(fault).build());
This should just return 404 HTTP error code (not found).
Line 57:     }
Line 58: 
Line 59:     @Override
Line 60:     public String generateDescriptor() {


Line 56:         throw new 
WebApplicationException(Response.status(Response.Status.BAD_REQUEST).entity(fault).build());
Line 57:     }
Line 58: 
Line 59:     @Override
Line 60:     public String generateDescriptor() {
Consider changing this so that it returns byte[] instead of String, it is more 
efficient and it represents better the fact that it is opaque data for the 
RESTAPI.
Line 61:         String consoleString = HexUtils.hex2string(consoleId);
Line 62: 
Line 63:         GraphicsConsole console = new GraphicsConsole();
Line 64:         console.setProtocol(consoleString);


Line 73:         ConsoleOptions configuredOptions = 
runQuery(VdcQueryType.ConfigureConsoleOptions,
Line 74:                 new ConfigureConsoleOptionsParams(consoleOptions, 
true)).getReturnValue();
Line 75: 
Line 76:         return runQuery(VdcQueryType.GetConsoleDescriptorFile, new 
ConsoleOptionsParams(configuredOptions))
Line 77:                 .getReturnValue();
The backend should also return byte[], in my opinion.
Line 78:     }


https://gerrit.ovirt.org/#/c/39057/8/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmGraphicsConsolesResource.java
File 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmGraphicsConsolesResource.java:

Line 7: import org.ovirt.engine.api.resource.VmGraphicsConsolesResource;
Line 8: import org.ovirt.engine.api.restapi.types.VmMapper;
Line 9: import org.ovirt.engine.core.common.businessentities.GraphicsInfo;
Line 10: import org.ovirt.engine.core.common.businessentities.GraphicsType;
Line 11: import org.ovirt.engine.core.common.businessentities.VM;
When there are conflicts with the names of the classes try to import the 
restapi.model class and use fully qualified names of the backend classes.
Line 12: import org.ovirt.engine.core.common.queries.IdQueryParameters;
Line 13: import org.ovirt.engine.core.common.queries.VdcQueryType;
Line 14: import org.ovirt.engine.core.compat.Guid;
Line 15: 


Line 51:     protected Response performRemove(String id) {
Line 52:         Fault fault = new Fault();
Line 53:         fault.setReason("Unsupported Operation");
Line 54:         fault.setDetail("Remove is not supported");
Line 55:         throw new 
WebApplicationException(Response.status(Response.Status.BAD_REQUEST).entity(fault).build());
The "remove" method is not part of the interface, so the client will never be 
able to invoke it, so there is no need to prepare a nice response for the user. 
Just throw an exception:

  throw new UnsupportedOperationException();
Line 56:     }
Line 57: 
Line 58:     @Override
Line 59:     protected GraphicsConsole doPopulate(GraphicsConsole model, VM 
entity) {


https://gerrit.ovirt.org/#/c/39057/8/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/vv/VirtViewerMessageBodyWriter.java
File 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/vv/VirtViewerMessageBodyWriter.java:

Line 15: import java.lang.reflect.Type;
Line 16: 
Line 17: @Provider
Line 18: @Produces(ApiMediaType.APPLICATION_X_VIRT_VIEWER)
Line 19: public class VirtViewerMessageBodyWriter extends DefaultTextPlain {
I think this isn't needed, as JAX-RS already has a message body writer for 
strings (and for byte[]).
Line 20: 
Line 21:     @Override
Line 22:     public void writeTo(Object o, Class type, Type genericType, 
Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, 
OutputStream entityStream) throws IOException, WebApplicationException {
Line 23:         if (o instanceof Fault) {


https://gerrit.ovirt.org/#/c/39057/8/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java
File 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java:

Line 565: 
Line 566:         return params;
Line 567:     }
Line 568: 
Line 569:     @Mapping(from = 
org.ovirt.engine.core.common.businessentities.VM.class, to = 
GraphicsConsole.class)
The "from" part should match type of the first parameter, thus it should be 
Map.Entry.class. That or change the first parameter to be the backend VM.
Line 570:     public static GraphicsConsole map(Map.Entry<GraphicsType, 
GraphicsInfo> graphicsInfo, GraphicsConsole template) {
Line 571:         GraphicsConsole model = template != null ? template : new 
GraphicsConsole();
Line 572: 
Line 573:         String graphicsTypeString = map(graphicsInfo.getKey(), null);


Line 582: 
Line 583:         return model;
Line 584:     }
Line 585: 
Line 586:     @Mapping(from = org.ovirt.engine.api.model.GraphicsType.class, to 
= GraphicsType.class)
When there are conflicts try to import the model class and use the fully 
qualified name of the backend class.
Line 587:     public static GraphicsType 
map(org.ovirt.engine.api.model.GraphicsType graphicsType, GraphicsType 
template) {
Line 588:         if (graphicsType != null) {
Line 589:             switch (graphicsType) {
Line 590:                 case SPICE:


Line 597:         return null;
Line 598:     }
Line 599: 
Line 600:     @Mapping(from = GraphicsType.class, to = String.class)
Line 601:     public static String map(GraphicsType graphicsType, String 
template) {
This mapper should return instances of the RESTAPI GraphicsType enum, not 
strings. Conversion to string should then use GraphicsType.toString().
Line 602:         if (graphicsType != null) {
Line 603:             switch (graphicsType) {
Line 604:                 case SPICE:
Line 605:                     return SPICE_STRING;


-- 
To view, visit https://gerrit.ovirt.org/39057
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I7dbc63ac49bfba5637c38b84b373d78f348c7872
Gerrit-PatchSet: 8
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Frank Kobzik <fkob...@redhat.com>
Gerrit-Reviewer: Frank Kobzik <fkob...@redhat.com>
Gerrit-Reviewer: Jenkins CI
Gerrit-Reviewer: Juan Hernandez <juan.hernan...@redhat.com>
Gerrit-Reviewer: Tomas Jelinek <tjeli...@redhat.com>
Gerrit-Reviewer: automat...@ovirt.org
Gerrit-HasComments: Yes
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to