Merge pull request #121 from overleaf/spd-idletimeout

Add support for configuring idle timeout and bind IP via settings
This commit is contained in:
Simon Detheridge 2021-06-24 17:43:17 +01:00 committed by GitHub
commit d816a0f02d
8 changed files with 71 additions and 28 deletions

View file

@ -1,30 +1,32 @@
{ {
"port": ${GIT_BRIDGE_PORT:-8000}, "port": ${GIT_BRIDGE_PORT:-8000},
"rootGitDirectory": "${GIT_BRIDGE_ROOT_DIR:-/tmp/wlgb}", "bindIp": "${GIT_BRIDGE_BIND_IP:-0.0.0.0}",
"apiBaseUrl": "${GIT_BRIDGE_API_BASE_URL:-https://localhost/api/v0}", "idleTimeout": "${GIT_BRIDGE_IDLE_TIMEOUT:-600000",
"postbackBaseUrl": "${GIT_BRIDGE_POSTBACK_BASE_URL:-https://localhost}", "rootGitDirectory": "${GIT_BRIDGE_ROOT_DIR:-/tmp/wlgb}",
"serviceName": "${GIT_BRIDGE_SERVICE_NAME:-Overleaf}", "apiBaseUrl": "${GIT_BRIDGE_API_BASE_URL:-https://localhost/api/v0}",
"oauth2": { "postbackBaseUrl": "${GIT_BRIDGE_POSTBACK_BASE_URL:-https://localhost}",
"oauth2ClientID": "${GIT_BRIDGE_OAUTH2_CLIENT_ID}", "serviceName": "${GIT_BRIDGE_SERVICE_NAME:-Overleaf}",
"oauth2ClientSecret": "${GIT_BRIDGE_OAUTH2_CLIENT_SECRET}", "oauth2": {
"oauth2Server": "${GIT_BRIDGE_OAUTH2_SERVER:-https://localhost}" "oauth2ClientID": "${GIT_BRIDGE_OAUTH2_CLIENT_ID}",
}, "oauth2ClientSecret": "${GIT_BRIDGE_OAUTH2_CLIENT_SECRET}",
"repoStore": { "oauth2Server": "${GIT_BRIDGE_OAUTH2_SERVER:-https://localhost}"
"maxFileNum": ${GIT_BRIDGE_REPOSTORE_MAX_FILE_NUM:-2000}, },
"maxFileSize": ${GIT_BRIDGE_REPOSTORE_MAX_FILE_SIZE:-52428800} "repoStore": {
}, "maxFileNum": ${GIT_BRIDGE_REPOSTORE_MAX_FILE_NUM:-2000},
"swapStore": { "maxFileSize": ${GIT_BRIDGE_REPOSTORE_MAX_FILE_SIZE:-52428800}
"type": "${GIT_BRIDGE_SWAPSTORE_TYPE:-noop}", },
"awsAccessKey": "${GIT_BRIDGE_SWAPSTORE_AWS_ACCESS_KEY}", "swapStore": {
"awsSecret": "${GIT_BRIDGE_SWAPSTORE_AWS_SECRET}", "type": "${GIT_BRIDGE_SWAPSTORE_TYPE:-noop}",
"s3BucketName": "${GIT_BRIDGE_SWAPSTORE_S3_BUCKET_NAME}", "awsAccessKey": "${GIT_BRIDGE_SWAPSTORE_AWS_ACCESS_KEY}",
"awsRegion": "${GIT_BRIDGE_SWAPSTORE_AWS_REGION:-us-east-1}" "awsSecret": "${GIT_BRIDGE_SWAPSTORE_AWS_SECRET}",
}, "s3BucketName": "${GIT_BRIDGE_SWAPSTORE_S3_BUCKET_NAME}",
"swapJob": { "awsRegion": "${GIT_BRIDGE_SWAPSTORE_AWS_REGION:-us-east-1}"
"minProjects": ${GIT_BRIDGE_SWAPJOB_MIN_PROJECTS:-50}, },
"lowGiB": ${GIT_BRIDGE_SWAPJOB_LOW_GIB:-128}, "swapJob": {
"highGiB": ${GIT_BRIDGE_SWAPJOB_HIGH_GIB:-256}, "minProjects": ${GIT_BRIDGE_SWAPJOB_MIN_PROJECTS:-50},
"intervalMillis": ${GIT_BRIDGE_SWAPJOB_INTERVAL_MILLIS:-3600000}, "lowGiB": ${GIT_BRIDGE_SWAPJOB_LOW_GIB:-128},
"compressionMethod": "${GIT_BRIDGE_SWAPJOB_COMPRESSION_METHOD:-gzip}" "highGiB": ${GIT_BRIDGE_SWAPJOB_HIGH_GIB:-256},
} "intervalMillis": ${GIT_BRIDGE_SWAPJOB_INTERVAL_MILLIS:-3600000},
"compressionMethod": "${GIT_BRIDGE_SWAPJOB_COMPRESSION_METHOD:-gzip}"
}
} }

View file

@ -1,5 +1,7 @@
{ {
"port": 8080, "port": 8080,
"bindIp": "127.0.0.1",
"idleTimeout": 60000,
"rootGitDirectory": "/tmp/wlgb", "rootGitDirectory": "/tmp/wlgb",
"apiBaseUrl": "https://localhost/api/v0", "apiBaseUrl": "https://localhost/api/v0",
"postbackBaseUrl": "https://localhost", "postbackBaseUrl": "https://localhost",

View file

@ -1,5 +1,7 @@
{ {
"port": 8000, "port": 8000,
"bindIp": "0.0.0.0",
"idleTimeout": 600000,
"rootGitDirectory": "/tmp/wlgb", "rootGitDirectory": "/tmp/wlgb",
"apiBaseUrl": "http://v2.overleaf.test:4000/api/v0", "apiBaseUrl": "http://v2.overleaf.test:4000/api/v0",
"postbackBaseUrl": "http://git-bridge:8000", "postbackBaseUrl": "http://git-bridge:8000",

View file

@ -24,6 +24,8 @@ public class Config implements JSONSource {
static Config asSanitised(Config config) { static Config asSanitised(Config config) {
return new Config( return new Config(
config.port, config.port,
config.bindIp,
config.idleTimeout,
config.rootGitDirectory, config.rootGitDirectory,
config.apiBaseURL, config.apiBaseURL,
config.postbackURL, config.postbackURL,
@ -36,6 +38,8 @@ public class Config implements JSONSource {
} }
private int port; private int port;
private String bindIp;
private int idleTimeout;
private String rootGitDirectory; private String rootGitDirectory;
private String apiBaseURL; private String apiBaseURL;
private String postbackURL; private String postbackURL;
@ -62,6 +66,8 @@ public class Config implements JSONSource {
public Config( public Config(
int port, int port,
String bindIp,
int idleTimeout,
String rootGitDirectory, String rootGitDirectory,
String apiBaseURL, String apiBaseURL,
String postbackURL, String postbackURL,
@ -72,6 +78,8 @@ public class Config implements JSONSource {
SwapJobConfig swapJob SwapJobConfig swapJob
) { ) {
this.port = port; this.port = port;
this.bindIp = bindIp;
this.idleTimeout = idleTimeout;
this.rootGitDirectory = rootGitDirectory; this.rootGitDirectory = rootGitDirectory;
this.apiBaseURL = apiBaseURL; this.apiBaseURL = apiBaseURL;
this.postbackURL = postbackURL; this.postbackURL = postbackURL;
@ -86,6 +94,8 @@ public class Config implements JSONSource {
public void fromJSON(JsonElement json) { public void fromJSON(JsonElement json) {
JsonObject configObject = json.getAsJsonObject(); JsonObject configObject = json.getAsJsonObject();
port = getElement(configObject, "port").getAsInt(); port = getElement(configObject, "port").getAsInt();
bindIp = getElement(configObject, "bindIp").getAsString();
idleTimeout = getElement(configObject, "idleTimeout").getAsInt();
rootGitDirectory = getElement( rootGitDirectory = getElement(
configObject, configObject,
"rootGitDirectory" "rootGitDirectory"
@ -124,6 +134,14 @@ public class Config implements JSONSource {
return port; return port;
} }
public String getBindIp() {
return bindIp;
}
public int getIdleTimeout() {
return idleTimeout;
}
public String getRootGitDirectory() { public String getRootGitDirectory() {
return rootGitDirectory; return rootGitDirectory;
} }

View file

@ -2,6 +2,7 @@ package uk.ac.ic.wlgitbridge.server;
import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.*; import org.eclipse.jetty.server.handler.*;
import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
@ -71,7 +72,7 @@ public class GitBridgeServer {
swapStore, swapStore,
snapshotApi snapshotApi
); );
jettyServer = new Server(port); jettyServer = new Server();
configureJettyServer(config, repoStore, snapshotApi); configureJettyServer(config, repoStore, snapshotApi);
apiBaseURL = config.getAPIBaseURL(); apiBaseURL = config.getAPIBaseURL();
SnapshotAPIRequest.setBaseURL(apiBaseURL); SnapshotAPIRequest.setBaseURL(apiBaseURL);
@ -113,6 +114,12 @@ public class GitBridgeServer {
RepoStore repoStore, RepoStore repoStore,
SnapshotApi snapshotApi SnapshotApi snapshotApi
) throws ServletException { ) throws ServletException {
ServerConnector connector = new ServerConnector(this.jettyServer);
connector.setPort(config.getPort());
connector.setHost(config.getBindIp());
connector.setIdleTimeout(config.getIdleTimeout());
this.jettyServer.addConnector(connector);
HandlerCollection handlers = new HandlerList(); HandlerCollection handlers = new HandlerList();
handlers.addHandler(initApiHandler()); handlers.addHandler(initApiHandler());
handlers.addHandler(initBaseHandler()); handlers.addHandler(initBaseHandler());

View file

@ -1063,6 +1063,8 @@ public class WLGitBridgeIntegrationTest {
String cfgStr = String cfgStr =
"{\n" + "{\n" +
" \"port\": " + port + ",\n" + " \"port\": " + port + ",\n" +
" \"bindIp\": \"127.0.0.1\",\n" +
" \"idleTimeout\": 30000,\n" +
" \"rootGitDirectory\": \"" + " \"rootGitDirectory\": \"" +
wlgb.getAbsolutePath() + wlgb.getAbsolutePath() +
"\",\n" + "\",\n" +

View file

@ -16,6 +16,8 @@ public class ConfigTest {
public void testConstructWithOauth() { public void testConstructWithOauth() {
Reader reader = new StringReader("{\n" + Reader reader = new StringReader("{\n" +
" \"port\": 80,\n" + " \"port\": 80,\n" +
" \"bindIp\": \"127.0.0.1\",\n" +
" \"idleTimeout\": 30000,\n" +
" \"rootGitDirectory\": \"/var/wlgb/git\",\n" + " \"rootGitDirectory\": \"/var/wlgb/git\",\n" +
" \"apiBaseUrl\": \"http://127.0.0.1:60000/api/v0\",\n" + " \"apiBaseUrl\": \"http://127.0.0.1:60000/api/v0\",\n" +
" \"postbackBaseUrl\": \"http://127.0.0.1\",\n" + " \"postbackBaseUrl\": \"http://127.0.0.1\",\n" +
@ -42,6 +44,8 @@ public class ConfigTest {
public void testConstructWithoutOauth() { public void testConstructWithoutOauth() {
Reader reader = new StringReader("{\n" + Reader reader = new StringReader("{\n" +
" \"port\": 80,\n" + " \"port\": 80,\n" +
" \"bindIp\": \"127.0.0.1\",\n" +
" \"idleTimeout\": 30000,\n" +
" \"rootGitDirectory\": \"/var/wlgb/git\",\n" + " \"rootGitDirectory\": \"/var/wlgb/git\",\n" +
" \"apiBaseUrl\": \"http://127.0.0.1:60000/api/v0\",\n" + " \"apiBaseUrl\": \"http://127.0.0.1:60000/api/v0\",\n" +
" \"postbackBaseUrl\": \"http://127.0.0.1\",\n" + " \"postbackBaseUrl\": \"http://127.0.0.1\",\n" +
@ -62,6 +66,8 @@ public class ConfigTest {
public void asSanitised() throws Exception { public void asSanitised() throws Exception {
Reader reader = new StringReader("{\n" + Reader reader = new StringReader("{\n" +
" \"port\": 80,\n" + " \"port\": 80,\n" +
" \"bindIp\": \"127.0.0.1\",\n" +
" \"idleTimeout\": 30000,\n" +
" \"rootGitDirectory\": \"/var/wlgb/git\",\n" + " \"rootGitDirectory\": \"/var/wlgb/git\",\n" +
" \"apiBaseUrl\": \"http://127.0.0.1:60000/api/v0\",\n" + " \"apiBaseUrl\": \"http://127.0.0.1:60000/api/v0\",\n" +
" \"postbackBaseUrl\": \"http://127.0.0.1\",\n" + " \"postbackBaseUrl\": \"http://127.0.0.1\",\n" +
@ -75,6 +81,8 @@ public class ConfigTest {
Config config = new Config(reader); Config config = new Config(reader);
String expected = "{\n" + String expected = "{\n" +
" \"port\": 80,\n" + " \"port\": 80,\n" +
" \"bindIp\": \"127.0.0.1\",\n" +
" \"idleTimeout\": 30000,\n" +
" \"rootGitDirectory\": \"/var/wlgb/git\",\n" + " \"rootGitDirectory\": \"/var/wlgb/git\",\n" +
" \"apiBaseURL\": \"http://127.0.0.1:60000/api/v0/\",\n" + " \"apiBaseURL\": \"http://127.0.0.1:60000/api/v0/\",\n" +
" \"postbackURL\": \"http://127.0.0.1/\",\n" + " \"postbackURL\": \"http://127.0.0.1/\",\n" +

View file

@ -53,6 +53,8 @@ public class BridgeTest {
gcJob = mock(GcJob.class); gcJob = mock(GcJob.class);
bridge = new Bridge( bridge = new Bridge(
new Config( new Config(
0,
"",
0, 0,
"", "",
"", "",