Skip to content

Commit

Permalink
Nc/102 poc webhook (#108)
Browse files Browse the repository at this point in the history
* updating gitignore

* adding new POC app

* updating host

* Proxy OpenWhisk Integration

* Updated with feedback

* Holding back locales package from being updated during image creation. Was causing issues with initdb.
  • Loading branch information
kevinlai authored and boopt2 committed Jun 9, 2017
1 parent ccb3a8b commit 9c841e6
Show file tree
Hide file tree
Showing 7 changed files with 118 additions and 2 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ target/
/vertx/public/dataviewer/ui/*.png
/vertx/public/dataviewer/ui/*.gif
/vertx/public/dataviewer/lib/csync/node_modules
/openwhisk/node_modules
3 changes: 2 additions & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ lazy val server = (project in file("."))
.aggregate(core)
.settings(
mappings in Universal ++= directory("vertx/public"),
mappings in Universal ++= directory("openwhisk"),
aggregate in Docker := false,
NativePackagerKeys.maintainer in Docker := "CSync",
NativePackagerKeys.dockerExposedPorts in Docker := Seq(P9000, P9443),
Expand All @@ -75,7 +76,7 @@ lazy val server = (project in file("."))
Cmd("RUN", "sed -i.foo 's/.*PASS_MAX_DAYS.*$/PASS_MAX_DAYS 90/' /etc/login.defs"),
Cmd("RUN", "echo 'password requisite pam_cracklib.so retry=3 minlen=8' >> /etc/pam.d/common-password"),
Cmd("RUN", "sed -i.foo 's/.*PASS_MIN_DAYS.*$/PASS_MIN_DAYS 1/' /etc/login.defs"),
Cmd("RUN", "apt-mark hold postgresql-common && apt-key update && apt-get update && apt-get -y install apt-utils && apt-get -y upgrade && apt-get clean && rm -rf /var/lib/apt/lists/*"),
Cmd("RUN", "apt-mark hold postgresql-common && apt-mark hold locales && apt-key update && apt-get update && apt-get -y install apt-utils && apt-get -y upgrade && apt-get clean && rm -rf /var/lib/apt/lists/*"),
ExecCmd("ENTRYPOINT", "/csync.sh")))

lazy val vertx = project.dependsOn(core)
Expand Down
5 changes: 4 additions & 1 deletion docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ RUN mkdir /docker-entrypoint-initdb.d
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8

ENV PG_MAJOR 9.6
ENV PG_VERSION 9.6.2-1.pgdg80+1
ENV PG_VERSION 9.6.3-1.pgdg80+1

RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main' $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list

Expand All @@ -117,6 +117,9 @@ ENV PATH /usr/lib/postgresql/$PG_MAJOR/bin:$PATH
ENV PGDATA /var/lib/postgresql/data
VOLUME /var/lib/postgresql/data

RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - \
&& apt-get install -y nodejs

COPY docker-entrypoint-postgres.sh /

EXPOSE 5432
Expand Down
5 changes: 5 additions & 0 deletions docker/csync.sh
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,13 @@ rm -f /opt/docker/RUNNING_PID

sed -i "s/YOUR_GOOGLE_CLIENT_ID_HERE/"$CSYNC_GOOGLE_CLIENT_IDS"/" /opt/docker/public/dataviewer/ui/bundle.js

echo "Starting OpenWhisk Integration"
nohup sleep 60 && node /opt/docker/openwhisk/app.js &

echo "Starting CSync"
export USER=postgres
export VCAP_APPLICATION="{\"space_id\":\"$space_id\", \"application_id\":\"$uuid\"}"
su -m postgres -c /opt/docker/bin/csync



63 changes: 63 additions & 0 deletions openwhisk/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
'use strict';
var express = require('express');
var bodyParser = require('body-parser');
var csync = require('csync');
var request = require('request');

// create a new express server
var app = express();
app.use(bodyParser.json()); // for parsing application/json

// CSync
var csyncApp = csync({ host: "localhost", port: 6005, useSSL: false });
var keys = {};
csyncApp.authenticate("demo", "demoToken");


// render index page
app.put('/webhooks', function (req, res) {
console.log("Put Request: ", req.body);
var url = req.body.url;
var csyncKey = csyncApp.key(req.body.key);
keys[req.body.key] = csyncKey;
csyncKey.listen(function (error, value) {
if (error) {
// handle error
console.log("Error: ", error);
res.sendStatus(404);
} else {
value["state"] = req.body.state;
request({
method: "POST",
uri: url,
body: value,
headers: {
"Authorization": "Basic YzU1YWZjMDUtOTc3My00ODk0LTgyMWQtMGI4NjBjYTU1MjRmOjB5QXRaZm51dGJMY2U3TzRoTnNYNmFBWVJVM25zRXNNam1SbFBTcE9xeUNsUHZtN3JLVzQ4b0owZ3Z4ZWZGbDI=",
"Content-Type": "application/json"
},
json: true
},
function (error, response, body) {
console.log("Response Body: ", body);
});
}
});
res.sendStatus(200);
});

app.delete('/webhooks', function (req, res) {
console.log("Delete Request: ", req.body);
var url = req.body.url;
var csyncKey = keys[req.body.key];
if (!csyncKey) {
res.sendStatus(404);
}
csyncKey.unlisten();
delete keys[req.body.key];
res.sendStatus(200);
});

// start server on the specified port and binding host
app.listen(6004, '0.0.0.0', function () {
console.log("server started");
});
11 changes: 11 additions & 0 deletions openwhisk/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"name": "openwhisk",
"version": "0.0.1",
"private": true,
"dependencies": {
"body-parser": "^1.17.1",
"csync": "^1.4.0",
"express": "^4.15.2",
"request": "^2.81.0"
}
}
32 changes: 32 additions & 0 deletions vertx/src/main/scala/com/ibm/csync/vertx/Main.scala
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import com.rabbitmq.client.Connection
import com.typesafe.scalalogging.LazyLogging
import com.zaxxer.hikari.{HikariConfig, HikariDataSource}
import io.vertx.core._
import io.vertx.core.buffer.Buffer
import io.vertx.core.http._
import io.vertx.core.http.RequestOptions
import io.vertx.core.net.PemKeyCertOptions
Expand Down Expand Up @@ -312,6 +313,7 @@ object Main extends LazyLogging {
}
}

//scalastyle:off
private def deploy(vertx: Vertx, ds: DataSource, rabbitConnection: Connection,
serverOptions: HttpServerOptions): Future[HttpServer] = {
val out = Promise[HttpServer]
Expand All @@ -320,6 +322,10 @@ object Main extends LazyLogging {
override def start(): Unit = {
val ctx = VertxContext(vertx.getOrCreateContext())
val server = vertx.createHttpServer(serverOptions)
val httpClientOptions = new HttpClientOptions()
httpClientOptions.setDefaultPort(6004).setDefaultHost("localhost")
val client = vertx.createHttpClient(httpClientOptions)

val disableDataviewer = sys.env.getOrElse("DISABLE_DATAVIEWER", "false")

server.requestHandler { request =>
Expand Down Expand Up @@ -353,6 +359,31 @@ object Main extends LazyLogging {
} else if (request.method().equals(HttpMethod.GET)) {
handleRestCalls(ctx, request, ds, rabbitConnection, "")
} else Future.successful(None)
case "/webhooks" =>
Future {
val cReq: HttpClientRequest = client.request(request.method(), request.uri(), new Handler[HttpClientResponse] {
override def handle(cRes: HttpClientResponse): Unit = {
println("Proxying response: " + cRes.statusCode())
request.response().setStatusCode(cRes.statusCode())
request.response().headers().setAll(cRes.headers())
request.response().setChunked(true)
cRes.handler({ data: Buffer =>
request.response().write(data)
})
cRes.endHandler(new Handler[Void] {
override def handle(event: Void): Unit =
request.response().end()
})
}
})
cReq.headers().setAll(request.headers())
cReq.setChunked(true)
request.handler({ data: Buffer =>
println("Proxying request body:" + data)
cReq.write(data)
cReq.end()
})
}
case "/" => send("index.html")

// TODO: think about security
Expand All @@ -371,4 +402,5 @@ object Main extends LazyLogging {

out.future
}
//scalastyle:on
}

0 comments on commit 9c841e6

Please sign in to comment.