if (dockerImage.getStatusCode() != DockerResponse.StatusCode.OK) {
// user does not have a image, create one
dockerImage = dockerServer.createDockerUserBaseImage(user);
if (dockerImage.getStatusCode() != DockerResponse.StatusCode.CREATED) {
return statusHandler.handleRequest(request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_BAD_REQUEST, dockerImage.getStatusMessage(), null));
}
if (logger.isInfoEnabled()) {
logger.info("Created Docker Image " + userBase + " for user " + user);
}
}
// get the volume (workspace root) for the user
String volume = getDockerVolume(user);
// get the container for the user
DockerContainer dockerContainer = dockerServer.getDockerContainer(user);
if (dockerContainer.getStatusCode() != DockerResponse.StatusCode.OK) {
// user does not have a container, create one
dockerContainer = dockerServer.createDockerContainer(userBase, user, volume);
if (dockerContainer.getStatusCode() != DockerResponse.StatusCode.CREATED) {
return statusHandler.handleRequest(request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_BAD_REQUEST, dockerContainer.getStatusMessage(), null));
}
if (logger.isInfoEnabled()) {
logger.info("Created Docker Container " + dockerContainer.getIdShort() + " for user " + user);
}
// if the user does not have a bashrc, create one
createBashrc(user);
}
// get the exposed ports from the docker image
List<String> portNumbers = new ArrayList<String>();
for (String port : dockerImage.getPorts()) {
if (port.contains("/tcp")) {
port = port.substring(0, port.indexOf("/tcp"));
}
portNumbers.add(port);
}
// start the container for the user
dockerContainer = dockerServer.startDockerContainer(user, volume, portNumbers);
if (dockerContainer.getStatusCode() == DockerResponse.StatusCode.STARTED) {
if (logger.isInfoEnabled()) {
logger.info("Started Docker Container " + dockerContainer.getIdShort() + " for user " + user);
}
} else if (dockerContainer.getStatusCode() == DockerResponse.StatusCode.RUNNING) {
if (logger.isInfoEnabled()) {
logger.info("Docker Container " + dockerContainer.getIdShort() + " for user " + user + " is already running");
}
} else {
return statusHandler.handleRequest(request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_BAD_REQUEST, dockerContainer.getStatusMessage(), null));
}
// attach to the container for the user
String originURL = request.getRequestURL().toString();
DockerResponse dockerResponse = dockerServer.attachDockerContainer(user, originURL);
if (dockerResponse.getStatusCode() != DockerResponse.StatusCode.ATTACHED) {
return statusHandler.handleRequest(request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_BAD_REQUEST, dockerContainer.getStatusMessage(), null));
}
if (logger.isInfoEnabled()) {
logger.info("Attach Docker Container " + dockerContainer.getIdShort() + " for user " + user + " successful");
}
JSONObject jsonObject = new JSONObject();
jsonObject.put(DockerContainer.ATTACH_WS, dockerResponse.getStatusMessage());
OrionServlet.writeJSONResponse(request, response, jsonObject);
return true;
} catch (IOException e) {
return statusHandler.handleRequest(request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_BAD_REQUEST, "IOException with request", e));
} catch (JSONException e) {
return statusHandler.handleRequest(request, response, new ServerStatus(IStatus.ERROR, HttpServletResponse.SC_BAD_REQUEST, "JSONException with request", e));
}
}