use of eu.openanalytics.shinyproxy.ShinyProxyException in project shinyproxy by openanalytics.
the class ProxyService method waitForLaunchingProxy.
private void waitForLaunchingProxy(String userName, String appName) {
int totalWaitMs = Integer.parseInt(environment.getProperty("shiny.proxy.container-wait-time", "20000"));
int waitMs = Math.min(2000, totalWaitMs);
int maxTries = totalWaitMs / waitMs;
boolean mayProceed = Utils.retry(i -> {
return getProxies(p -> p.getStatus() == ContainerProxyStatus.Starting && isUserProxy(p, userName, appName)).isEmpty();
}, maxTries, waitMs);
if (!mayProceed)
throw new ShinyProxyException("Cannot proceed: waiting for proxy to launch");
}
use of eu.openanalytics.shinyproxy.ShinyProxyException in project shinyproxy by openanalytics.
the class AbstractContainerBackend method startProxy.
@Override
public void startProxy(IContainerProxy p) throws ShinyProxyException {
T proxy = getProxyCast(p);
proxy.setStatus(ContainerProxyStatus.Starting);
try {
doStartProxy(proxy);
calculateTargetURL(proxy);
} catch (Throwable t) {
disposeProxy(proxy);
throw new ShinyProxyException("Failed to start container", t);
}
if (!testProxy(proxy)) {
stopProxy(proxy);
throw new ShinyProxyException("Container did not respond in time");
}
proxy.setStartupTimestamp(System.currentTimeMillis());
proxy.setStatus(ContainerProxyStatus.Up);
}
use of eu.openanalytics.shinyproxy.ShinyProxyException in project shinyproxy by openanalytics.
the class AbstractContainerBackend method stopProxy.
@Override
public void stopProxy(IContainerProxy p) throws ShinyProxyException {
T proxy = getProxyCast(p);
try {
proxy.setStatus(ContainerProxyStatus.Stopping);
disposeProxy(proxy);
doStopProxy(proxy);
proxy.setStatus(ContainerProxyStatus.Stopped);
} catch (Exception e) {
throw new ShinyProxyException("Failed to stop container", e);
}
}
use of eu.openanalytics.shinyproxy.ShinyProxyException in project shinyproxy by openanalytics.
the class AbstractContainerBackend method createProxy.
@Override
public IContainerProxy createProxy(ContainerProxyRequest request) throws ShinyProxyException {
T proxy = instantiateProxy();
proxy.setStatus(ContainerProxyStatus.New);
proxy.setUserId(request.userId);
proxy.setApp(request.app);
if (!useInternalNetwork)
proxy.setPort(allocatePort());
try {
prepareProxy(proxy, request);
} catch (Exception e) {
disposeProxy(proxy);
if (e instanceof ShinyProxyException)
throw (ShinyProxyException) e;
throw new ShinyProxyException("Failed to create container", e);
}
return proxy;
}
use of eu.openanalytics.shinyproxy.ShinyProxyException in project shinyproxy by openanalytics.
the class ProxyService method startProxy.
private IContainerProxy startProxy(String userName, String appName) {
ShinyApp app = appService.getApp(appName);
if (app == null) {
throw new ShinyProxyException("Cannot start container: unknown application: " + appName);
}
if (findProxy(userName, appName) != null) {
throw new ShinyProxyException("Cannot start container: user " + userName + " already has an active proxy for " + appName);
}
ContainerProxyRequest request = new ContainerProxyRequest();
request.userId = userName;
request.app = app;
IContainerProxy proxy = backend.createProxy(request);
activeProxies.add(proxy);
try {
backend.startProxy(proxy);
} finally {
if (proxy.getStatus() != ContainerProxyStatus.Up)
activeProxies.remove(proxy);
}
try {
URI target = new URI(proxy.getTarget());
synchronized (mappingListeners) {
for (MappingListener listener : mappingListeners) {
listener.mappingAdded(proxy.getName(), target);
}
}
} catch (URISyntaxException ignore) {
}
if (logService.isContainerLoggingEnabled()) {
BiConsumer<File, File> outputAttacher = backend.getOutputAttacher(proxy);
if (outputAttacher == null) {
log.warn("Cannot log container output: " + backend.getClass() + " does not support output attaching.");
} else {
logService.attachToOutput(proxy, outputAttacher);
}
}
log.info(String.format("Proxy activated [user: %s] [app: %s]", userName, appName));
eventService.post(EventType.AppStart.toString(), userName, appName);
return proxy;
}
Aggregations