From ba66a5beb9e0297ff7f00fea5c0911cb8728d406 Mon Sep 17 00:00:00 2001 From: qxo <49526356@qq.com> Date: Mon, 5 Mar 2018 23:00:14 +0800 Subject: [PATCH] videoOn and _videoOff feature: auto add "videoOn"="true" capability for VideoProxy enabled node so with "capabilityMatcher"="com.aimmac23.hub.proxy.VideoOnCapabilityMatcher" Grid could select suitable node and when request with capability ( "_videoOff":"true" ) on VideoProxy enabled node , video recording will not start origin commit: 8d72f4e2eb0849cc166e63a8245f7d8ad8c72f88 --- .../proxy/RegistrationRequestCorrector.java | 1 + .../hub/proxy/VideoOnCapabilityMatcher.java | 37 +++++++++++++++++ .../com/aimmac23/hub/proxy/VideoProxy.java | 41 +++++++++++++++---- 3 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/aimmac23/hub/proxy/VideoOnCapabilityMatcher.java diff --git a/src/main/java/com/aimmac23/hub/proxy/RegistrationRequestCorrector.java b/src/main/java/com/aimmac23/hub/proxy/RegistrationRequestCorrector.java index 558ec23..e68c0fa 100644 --- a/src/main/java/com/aimmac23/hub/proxy/RegistrationRequestCorrector.java +++ b/src/main/java/com/aimmac23/hub/proxy/RegistrationRequestCorrector.java @@ -97,6 +97,7 @@ private static void correctCapabilities(Collection capabili for(MutableCapabilities caps : capabilities) { Object maxInstances = caps.getCapability(RegistrationRequest.MAX_INSTANCES); caps.setCapability(RegistrationRequest.MAX_INSTANCES, "1"); + caps.setCapability(VideoOnCapabilityMatcher.KEY, "true"); if(maxInstances != null && !"1".equals(maxInstances)) { log.warning("Reducing " + RegistrationRequest.MAX_INSTANCES + " for browser " + caps.getBrowserName() + " to 1: Video node does not support concurrent sessions"); diff --git a/src/main/java/com/aimmac23/hub/proxy/VideoOnCapabilityMatcher.java b/src/main/java/com/aimmac23/hub/proxy/VideoOnCapabilityMatcher.java new file mode 100644 index 0000000..705ca6c --- /dev/null +++ b/src/main/java/com/aimmac23/hub/proxy/VideoOnCapabilityMatcher.java @@ -0,0 +1,37 @@ +package com.aimmac23.hub.proxy; + +import java.util.Map; + +import org.openqa.grid.internal.utils.DefaultCapabilityMatcher; + +/** + * extend DefaultCapabilityMatcher and support select video node + * and make videoOn=false work(switch video off) + * + */ +public class VideoOnCapabilityMatcher extends DefaultCapabilityMatcher { + + public static final String KEY="videoOn"; + + public static final String VIDEO_OFF_KEY ="_videoOff"; + + public VideoOnCapabilityMatcher() { + super(); + this.addToConsider(KEY); + } + + /** + * if requestedCapability( videoOn=false ) , then remove videoOn and add _videoOff=true + */ + @Override + public boolean matches(Map nodeCapability, Map requestedCapability) { + Object o = requestedCapability.get(KEY); + if( o != null && ( "false".equals(o) + || ( o instanceof Boolean && !Boolean.TRUE.equals(o) ) ) ){ + requestedCapability.remove(KEY); + requestedCapability.put(VIDEO_OFF_KEY, "true"); + } + return super.matches(nodeCapability, requestedCapability); + } + +} diff --git a/src/main/java/com/aimmac23/hub/proxy/VideoProxy.java b/src/main/java/com/aimmac23/hub/proxy/VideoProxy.java index 1fe796b..9c2d3bd 100644 --- a/src/main/java/com/aimmac23/hub/proxy/VideoProxy.java +++ b/src/main/java/com/aimmac23/hub/proxy/VideoProxy.java @@ -1,11 +1,14 @@ package com.aimmac23.hub.proxy; +import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; @@ -19,11 +22,9 @@ import org.openqa.grid.web.servlet.handler.RequestType; import org.openqa.grid.web.servlet.handler.SeleniumBasedRequest; import org.openqa.selenium.remote.internal.HttpClientFactory; -import org.openqa.selenium.remote.server.jmx.ManagedService; import com.aimmac23.hub.HubVideoRegistry; -@ManagedService(description = "Selenium Grid Hub Video-Capable TestSlot") public class VideoProxy extends DefaultRemoteProxy { private static final Logger log = Logger.getLogger(VideoProxy.class.getName()); @@ -31,12 +32,15 @@ public class VideoProxy extends DefaultRemoteProxy { private String serviceUrl; boolean isCurrentlyRecording = false; private HttpClient client; - + private HttpHost remoteHost; + public VideoProxy(RegistrationRequest request, GridRegistry registry) { super(RegistrationRequestCorrector.correctRegistrationRequest(request), registry); serviceUrl = getRemoteHost() + "/extra/VideoRecordingControlServlet"; + remoteHost = new HttpHost(getRemoteHost().getHost(), + getRemoteHost().getPort()); HttpClientFactory httpClientFactory = new HttpClientFactory(); client = httpClientFactory.getHttpClient(); @@ -68,11 +72,14 @@ public VideoProxy(RegistrationRequest request, GridRegistry registry) { @Override public void beforeSession(TestSession arg0) { super.beforeSession(arg0); - + final boolean disabled = isVideoOff(arg0); + if(disabled){ + return; + } HttpPost r = new HttpPost(serviceUrl + "?command=start"); try { - HttpResponse response = client.execute(r); + HttpResponse response = client.execute(remoteHost, r); if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { log.warning("Could not start video reporting: " + EntityUtils.toString(response.getEntity())); return; @@ -91,11 +98,28 @@ public void beforeSession(TestSession arg0) { r.releaseConnection(); } } + + private boolean isVideoOff(TestSession testSession) { + Map requestedCapabilities = testSession.getRequestedCapabilities(); + final Object videoDisabled = requestedCapabilities.get("_videoOff"); + boolean disabled ; + if( videoDisabled == null || StringUtils.isBlank(videoDisabled.toString())){ + disabled = Boolean.getBoolean("seleniumVideoDefaultOff"); + }else{ + disabled = videoDisabled instanceof Boolean ? Boolean.TRUE.equals(videoDisabled) + : "true".equals(videoDisabled.toString()); + } + return disabled; + } @Override public void beforeCommand(TestSession session, HttpServletRequest request, HttpServletResponse response) { super.beforeCommand(session, request, response); + final boolean disabled = isVideoOff(session); + if(disabled){ + return; + } SeleniumBasedRequest seleniumRequest = SeleniumBasedRequest.createFromRequest(request, getRegistry()); @@ -115,7 +139,10 @@ public void beforeCommand(TestSession session, HttpServletRequest request, public void afterCommand(TestSession session, HttpServletRequest request, HttpServletResponse response) { super.afterCommand(session, request, response); - + final boolean disabled = isVideoOff(session); + if(disabled){ + return; + } // its a shame we have to extract this again SeleniumBasedRequest seleniumRequest = SeleniumBasedRequest.createFromRequest(request, getRegistry()); @@ -149,7 +176,7 @@ void stopRecording(TestSession session) { HttpPost r = new HttpPost(serviceUrl + "?command=stop"); try { - HttpResponse response = client.execute(r); + HttpResponse response = client.execute(remoteHost, r); if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { log.warning("Could not stop video reporting: " + EntityUtils.toString(response.getEntity())); }