You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2019/07/09 08:24:12 UTC

[sling-whiteboard] 02/03: Start + cleanup test container

This is an automated email from the ASF dual-hosted git repository.

bdelacretaz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git

commit 0284a7257fc2d77af4bc59c5feb49e593f2e2395
Author: Bertrand Delacretaz <bd...@apache.org>
AuthorDate: Tue Jul 9 10:21:14 2019 +0200

    Start + cleanup test container
---
 graalvm/time-to-first-request/index.js | 50 +++++++++++++++++++++++++++++-----
 1 file changed, 43 insertions(+), 7 deletions(-)

diff --git a/graalvm/time-to-first-request/index.js b/graalvm/time-to-first-request/index.js
index 1db88bb..987e304 100644
--- a/graalvm/time-to-first-request/index.js
+++ b/graalvm/time-to-first-request/index.js
@@ -46,22 +46,58 @@ const waitOpts = {
 };
 
 const docker = new Docker();
+const actions = {};
 
-var server = http.createServer(function(req, res) {
+const getContainer = (async imageName => {
+  const containers = await docker.listContainers();
+  return containers.find(container => {
+    return container.Image == imageName;
+  });
+});
+
+var server = http.createServer(async (req, res) => {
   const et = elapsedTime.new().start();
-  // TODO detect if container is already running, instead of blind catch
-  // (maybe use node-docker-api instead)
+  existingContainer = await getContainer(dockerImage);
+
+  if(existingContainer) {
+    console.log(`Container is already running: ${dockerImage}(${et.getValue()})`);
+  } else {
+    actions.startedContainer = true;
+    console.log(`Starting container: ${dockerImage}(${et.getValue()})`);
+    docker.run(dockerImage, null, null, dockerStartOptions);
+  }
 
-  console.log(`Starting container ${dockerImage}(${et.getValue()})`);
-  docker.run(dockerImage, null, process.stderr, dockerStartOptions);
+  // No need to wait for async call, just wait for our URL
   console.log(`Waiting on ${waitOpts.resources[0]} (${et.getValue()})`);
   waitOn(waitOpts).then(() =>{
-    console.log(`Time to first request to ${waitUrl}: (${et.getValue()})`);
+    console.log(`Time to wait for ${waitUrl}: (${et.getValue()})`);
     console.log(`Proxying ${req.url} (${et.getValue()})`);
     proxy.web(req, res, { target: targetUrl });
     console.log(`Done proxying (${et.getValue()})`);
   });  
 });
 
+const cleanup = async () => {
+  if(!actions.startedContainer) {
+    console.log('Did not start container, nothing to cleanup');
+  } else {
+    const runningContainer = await getContainer(dockerImage);
+    if(runningContainer) {
+      console.log(`cleanup: killing container ${dockerImage}/${runningContainer.Id.substring(0,12)} ...`);
+      const container = await docker.getContainer(runningContainer.Id);
+      await container.kill();
+      console.log('killed');
+    }
+  }
+  process.exit();
+} 
+
+[
+  'SIGINT',
+  'SIGTERM',
+].forEach(signal => {
+  process.on(signal, cleanup);
+})
+
 console.log(`listening on port ${listenPort}, proxying to ${targetUrl}`);
-server.listen(listenPort);
\ No newline at end of file
+server.listen(listenPort)
\ No newline at end of file