Frank Kobzik has uploaded a new change for review. Change subject: restapi: [WIP!] Phase 5: REST part for console descriptor generator ......................................................................
restapi: [WIP!] Phase 5: REST part for console descriptor generator Added - virt viewer media type - vv() resource (todo rename) - helper for translating between options to backend entity (todo discuss) Change-Id: I08814006b413a7f213561e1884166af4d0d6c8ae Signed-off-by: Frantisek Kobzik <fkob...@redhat.com> Bug-Url: https://bugzilla.redhat.com/1128763 --- A backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/ConsoleOptionsHelper.java A backend/manager/modules/restapi/interface/common/jaxrs/src/test/java/org/ovirt/engine/api/common/util/ConsoleOptionsHelperTest.java M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ApiMediaType.java M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmResource.java M backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java 6 files changed, 111 insertions(+), 2 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/76/37976/1 diff --git a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/ConsoleOptionsHelper.java b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/ConsoleOptionsHelper.java new file mode 100644 index 0000000..cc01d1b --- /dev/null +++ b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/ConsoleOptionsHelper.java @@ -0,0 +1,40 @@ +package org.ovirt.engine.api.common.util; + +import java.util.List; +import java.util.Map; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.PathSegment; +import javax.ws.rs.core.UriInfo; +import org.ovirt.engine.core.common.console.ConsoleOptions; +import org.ovirt.engine.core.common.utils.Pair; + +public class ConsoleOptionsHelper { + + public static ConsoleOptions getConsoleOptions(UriInfo uri) { + ConsoleOptions options = new ConsoleOptions(); + + try { + List<PathSegment> pathSegments = uri.getPathSegments(); + PathSegment lastSegment = pathSegments.get(pathSegments.size() - 1); + MultivaluedMap<String, String> consoleOptions = lastSegment.getMatrixParameters(); + for (Map.Entry<String, List<String>> entry : consoleOptions.entrySet()) { + updateOptions(options, new Pair<>(entry.getKey(), entry.getValue().get(0))); + } + } catch (Exception e) { } + + return options; + } + + private static void updateOptions(ConsoleOptions options, Pair<String, String> keyVal) { + String val = keyVal.getSecond(); + switch (keyVal.getFirst()) { + case "fullscreen": + options.setFullScreen("1".equals(val)); + break; + case "release-cursor": + options.setReleaseCursorHotKey(val); + break; + // enough for the demo lol; todo switch (~16 cases) for filling actual console options + } + } +} diff --git a/backend/manager/modules/restapi/interface/common/jaxrs/src/test/java/org/ovirt/engine/api/common/util/ConsoleOptionsHelperTest.java b/backend/manager/modules/restapi/interface/common/jaxrs/src/test/java/org/ovirt/engine/api/common/util/ConsoleOptionsHelperTest.java new file mode 100644 index 0000000..fa66017 --- /dev/null +++ b/backend/manager/modules/restapi/interface/common/jaxrs/src/test/java/org/ovirt/engine/api/common/util/ConsoleOptionsHelperTest.java @@ -0,0 +1,30 @@ +package org.ovirt.engine.api.common.util; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; +import javax.ws.rs.core.PathSegment; +import javax.ws.rs.core.UriInfo; +import org.jboss.resteasy.specimpl.PathSegmentImpl; +import org.jboss.resteasy.specimpl.UriInfoImpl; +import org.junit.Test; +import org.ovirt.engine.core.common.console.ConsoleOptions; + + +import static org.junit.Assert.assertEquals; + +public class ConsoleOptionsHelperTest { + + @Test + public void getOptionsHappyTest() throws URISyntaxException { + List<PathSegment> pathSegments = new ArrayList<>(); + pathSegments.add(new PathSegmentImpl(";fullscreen=1;release-cursor=shift+f20", true)); + URI absolutePath = new URI("http://engine.test/lol"); + UriInfo uriInfo = new UriInfoImpl(absolutePath, null, absolutePath.toString(), null, pathSegments); + ConsoleOptions consoleOptions = ConsoleOptionsHelper.getConsoleOptions(uriInfo); + + assertEquals(true, consoleOptions.isFullScreen()); + } + +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ApiMediaType.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ApiMediaType.java index 6e524f7..1bb2096 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ApiMediaType.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ApiMediaType.java @@ -17,9 +17,17 @@ package org.ovirt.engine.api.resource; +import javax.ws.rs.core.MediaType; + public class ApiMediaType extends javax.ws.rs.core.MediaType { + private final static String APPLICATION = "application"; // todo externalize all string or use old approach for VV + private final static String X_VIRT_VIEWER = "x-virt-viewer"; + + private final static String SLASH = "/"; + public final static String APPLICATION_X_YAML = "application/x-yaml"; - public final static javax.ws.rs.core.MediaType APPLICATION_X_YAML_TYPE = - new javax.ws.rs.core.MediaType("application", "x-yaml"); + public final static MediaType APPLICATION_X_YAML_TYPE = new MediaType("application", "x-yaml"); public final static String APPLICATION_PDF = "application/pdf"; + public final static String APPLICATION_X_VIRT_VIEWER = APPLICATION + SLASH + X_VIRT_VIEWER; + public static final MediaType APPLICATION_X_VIRT_VIEWER_TYPE = new MediaType(APPLICATION, X_VIRT_VIEWER); } diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmResource.java index 32787b5..9ae1a27 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmResource.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/VmResource.java @@ -17,6 +17,7 @@ package org.ovirt.engine.api.resource; import javax.ws.rs.Consumes; +import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; @@ -96,6 +97,12 @@ @Path("ticket") public Response ticket(Action action); + @GET + @Actionable + @Produces({ApiMediaType.APPLICATION_X_VIRT_VIEWER}) + @Path("vv") + public Response vv(); + @POST @Consumes({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, ApiMediaType.APPLICATION_X_YAML}) @Actionable diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml index 52e90a9..80e2f19 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml @@ -535,6 +535,16 @@ urlparams: {} headers: Correlation-Id: {value: 'any string', required: false} +- name: /vms/{vm:id}/vv|rel=get + description: get vv file with newly generated ticket + request: + body: + parameterType: null + signatures: [] + urlparams: {} + headers: + Content-Type: {value: application/x-virt-viewer, required: true} + Filter: {value: true|false, required: false} - name: /vms/{vm:id}/logon|rel=logon description: Perform automatic logon on the VM using the guest agent. request: diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java index 0f53f82..db61fac 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java @@ -8,6 +8,7 @@ import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; +import org.ovirt.engine.api.common.util.ConsoleOptionsHelper; import org.ovirt.engine.api.common.util.DetailHelper; import org.ovirt.engine.api.common.util.QueryHelper; import org.ovirt.engine.api.model.Action; @@ -24,6 +25,7 @@ import org.ovirt.engine.api.model.Ticket; import org.ovirt.engine.api.model.VM; import org.ovirt.engine.api.resource.ActionResource; +import org.ovirt.engine.api.resource.ApiMediaType; import org.ovirt.engine.api.resource.AssignedPermissionsResource; import org.ovirt.engine.api.resource.AssignedTagsResource; import org.ovirt.engine.api.resource.CreationResource; @@ -72,6 +74,8 @@ import org.ovirt.engine.core.common.businessentities.VmInit; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmTemplate; +import org.ovirt.engine.core.common.console.ConsoleOptions; +import org.ovirt.engine.core.common.queries.ConsoleOptionsParams; import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters; import org.ovirt.engine.core.common.queries.GetVmTemplateParameters; import org.ovirt.engine.core.common.queries.IdQueryParameters; @@ -449,6 +453,16 @@ return response; } + @Override + public Response vv() { + ConsoleOptions consoleOptions = ConsoleOptionsHelper.getConsoleOptions(uriInfo); + ConsoleOptionsParams queryParams = new ConsoleOptionsParams(consoleOptions); + VdcQueryReturnValue result = runQuery(VdcQueryType.GetConsoleDescriptorFile, queryParams); + String descriptor = result.getReturnValue(); + Response.ResponseBuilder builder = Response.ok(descriptor, ApiMediaType.APPLICATION_X_VIRT_VIEWER_TYPE); + return builder.build(); + } + private GraphicsType deriveGraphicsType() { org.ovirt.engine.core.common.businessentities.VM vm = getEntity(org.ovirt.engine.core.common.businessentities.VM.class, VdcQueryType.GetVmByVmId, new IdQueryParameters(guid), "GetVmByVmId"); -- To view, visit http://gerrit.ovirt.org/37976 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I08814006b413a7f213561e1884166af4d0d6c8ae Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Frank Kobzik <fkob...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches