/** * Non-blocking, not thread-safe * * @return Next Available remote control. Null if none is available. */ protected RemoteControlProxy findNextAvailableRemoteControl() { for (RemoteControlProxy remoteControl : remoteControls) { if (remoteControl.canHandleNewSession()) { return remoteControl; } } return null; }
public String remoteControlPingURL() { return remoteControlURLFor("heartbeat"); }
public void unregisterSession() { if (!sessionInProgress) { throw new IllegalStateException("Unregistering session on an idle remote control : " + toString()); } sessionInProgress = false; }
response = httpClient.get(remoteControlPingURL()); } catch (Exception e) { LOGGER.warn("Remote Control at " + host + ":" + port + " is unresponsive"); if (this.sessionInProgress() && (failedHeartbeatCount < MAX_FAILED_HEARTBEATS)) { LOGGER.warn(String.format("... attempt %d of %d -- trying again.", failedHeartbeatCount + 1, MAX_FAILED_HEARTBEATS)); return unreliable(); LOGGER.warn("Remote Control at " + host + ":" + port + " did not respond correctly"); if (this.sessionInProgress() && (failedHeartbeatCount < MAX_FAILED_HEARTBEATS)) { LOGGER.warn(String.format("... attempt %d of %d -- trying again.", failedHeartbeatCount + 1, MAX_FAILED_HEARTBEATS)); return unreliable();
public boolean unregister(RemoteControlProxy remoteControl) { final boolean status; synchronized(provisionersByEnvironment) { synchronized (remoteControlsBySessionIds) { status = getProvisioner(remoteControl.environment()).remove(remoteControl); for (RemoteControlSession session : remoteControlsBySessionIds.values()) { if (session.remoteControl().equals(remoteControl)) { removeFromSessionMap(session); } } } } return status; }
public RemoteControlProxy reserve() { RemoteControlProxy remoteControl; try { remoteControlListLock.lock(); if (remoteControls.isEmpty()) { return null; } remoteControl = blockUntilARemoteControlIsAvailable(); while (remoteControl.unreliable()) { LOGGER.warn("Reserved RC " + remoteControl + " is detected as unreliable, unregistering it and reserving a new one..."); tearDownExistingRemoteControl(remoteControl); if (remoteControls.isEmpty()) { return null; } remoteControl = blockUntilARemoteControlIsAvailable(); } remoteControl.registerNewSession(); LOGGER.info("Reserved remote control" + remoteControl); return remoteControl; } finally { remoteControlListLock.unlock(); } }
public void register(RemoteControlProxy newRemoteControl) { final RemoteControlProvisioner provisioner; synchronized(provisionersByEnvironment) { if (null == getProvisioner(newRemoteControl.environment())) { createNewProvisionerForEnvironment(newRemoteControl.environment()); } provisioner = getProvisioner(newRemoteControl.environment()); provisioner.add(newRemoteControl); } }
public void terminateSession(String sessionId) { try { Map<String, String[]> params = new HashMap<String, String[]>(); params.put("cmd", new String[] { "testComplete" }); params.put("sessionId", new String[] { sessionId }); forward(new HttpParameters(params)); } catch (IOException e) { LOGGER.warn("Exception telling remote control to kill its session:" + e.getMessage()); } }
public void releaseForSession(String sessionId) { LOGGER.info("Releasing pool for session id='" + sessionId + "'"); final RemoteControlProxy remoteControl; remoteControl = getRemoteControlForSession(sessionId); synchronized (remoteControlsBySessionIds) { remoteControlsBySessionIds.remove(sessionId); } remoteControl.terminateSession(sessionId); getProvisioner(remoteControl.environment()).release(remoteControl); }
protected boolean registeredRemoteControl(String host, String port) { final RemoteControlProxy remoteControl; try { remoteControl = new RemoteControlProxy(host, Integer.parseInt(port), "dummy", null); } catch(NumberFormatException e) { return false; } return remoteControlPool().isRegistered(remoteControl); }
public Response forward(HttpParameters parameters) throws IOException { return httpClient.post(remoteControlDriverURL(), parameters); }
public boolean unreliable() { final Response response; try { LOGGER.debug("Polling Remote Control at " + host + ":" + port); response = httpClient.get(remoteControlPingURL()); } catch (Exception e) { LOGGER.warn("Remote Control at " + host + ":" + port + " is unresponsive"); return true; } if (response.statusCode() != 200) { LOGGER.warn("Remote Control at " + host + ":" + port + " did not respond correctly"); return true; } return false; }
public boolean unregister(RemoteControlProxy remoteControl) { final boolean status; synchronized(provisionersByEnvironment) { synchronized (remoteControlsBySessionIds) { Set<RemoteControlSession> sessionsToRemove = new HashSet<RemoteControlSession>(); status = getProvisioner(remoteControl.environment()).remove(remoteControl); for (RemoteControlSession session : remoteControlsBySessionIds.values()) { if (session.remoteControl().equals(remoteControl)) { sessionsToRemove.add(session); } } // Remove the session separately from the loop where we found it to avoid issues with concurrent modification. for (RemoteControlSession session : sessionsToRemove) { removeFromSessionMap(session); } } } return status; }
while (remoteControl.unreliable()) { LOGGER.warn("Reserved RC " + remoteControl + " is detected as unreliable, unregistering it and reserving a new one..."); tearDownExistingRemoteControl(remoteControl); remoteControl.registerNewSession(); LOGGER.info("Reserved remote control" + remoteControl); return remoteControl;
public void register(RemoteControlProxy newRemoteControl) { final RemoteControlProvisioner provisioner; synchronized(provisionersByEnvironment) { if (null == getProvisioner(newRemoteControl.environment())) { createNewProvisionerForEnvironment(newRemoteControl.environment()); } provisioner = getProvisioner(newRemoteControl.environment()); provisioner.add(newRemoteControl); } }
public Response execute(RemoteControlPool pool) throws IOException { final RemoteControlProxy remoteControl; final Response response; if (null == sessionId) { return new Response("Selenium Driver error: No sessionId provided for command '" + parameters.toString() + "'"); } remoteControl = pool.retrieve(sessionId()); pool.updateSessionLastActiveAt(sessionId); response = remoteControl.forward(parameters()); pool.updateSessionLastActiveAt(sessionId); return response; }
protected boolean registeredRemoteControl(String host, String port) { final RemoteControlProxy remoteControl; try { remoteControl = new RemoteControlProxy(host, Integer.parseInt(port), "dummy", null); } catch(NumberFormatException e) { return false; } return remoteControlPool().isRegistered(remoteControl); }
public Response forward(HttpParameters parameters) throws IOException { return httpClient.post(remoteControlDriverURL(), parameters); }
public void associateWithSession(RemoteControlProxy remoteControl, String sessionId) { LOGGER.info("Associating session id='" + sessionId + "' =>" + remoteControl + " for environment " + remoteControl.environment()); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Asssociating " + sessionId + " => " + remoteControl); } synchronized (remoteControlsBySessionIds) { if (remoteControlsBySessionIds.containsKey(sessionId)) { throw new IllegalStateException( "Session '" + sessionId + "' is already asssociated with " + remoteControlsBySessionIds.get(sessionId)); } synchronized (remoteControlsBySessionIds) { final RemoteControlSession newSession; newSession = new RemoteControlSession(sessionId, remoteControl); remoteControlsBySessionIds.put(sessionId, newSession); } } if (LOGGER.isDebugEnabled()) { logSessionMap(); } }
public Response execute(RemoteControlPool pool) throws IOException { final RemoteControlProxy remoteControl; final Response response; if (null == sessionId) { return new Response("Selenium Driver error: No sessionId provided for command '" + parameters.toString() + "'"); } remoteControl = pool.retrieve(sessionId()); pool.updateSessionLastActiveAt(sessionId); response = remoteControl.forward(parameters()); pool.updateSessionLastActiveAt(sessionId); return response; }