Code files
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
.git
|
||||
.gitignore
|
||||
node_modules
|
||||
npm-debug.log
|
||||
@@ -0,0 +1,7 @@
|
||||
FROM node:slim
|
||||
RUN mkdir -p /home/node/service
|
||||
WORKDIR /home/node/service
|
||||
COPY package.json /home/node/service
|
||||
RUN npm install
|
||||
COPY . /home/node/service
|
||||
CMD [ "node", "index.js" ]
|
||||
@@ -0,0 +1,32 @@
|
||||
pipeline {
|
||||
agent any
|
||||
|
||||
stages {
|
||||
stage('Checkout') {
|
||||
steps {
|
||||
checkout scm
|
||||
}
|
||||
}
|
||||
stage('Build') {
|
||||
steps {
|
||||
sh 'source ~/.bashrc && cd eventservice && npm install'
|
||||
}
|
||||
}
|
||||
stage('Test'){
|
||||
steps {
|
||||
sh 'source ~/.bashrc && cd eventservice && npm test'
|
||||
}
|
||||
}
|
||||
stage('Container'){
|
||||
steps {
|
||||
sh 'source ~/.bashrc && cd eventservice && sh build.sh container'
|
||||
}
|
||||
}
|
||||
stage('Deploy'){
|
||||
steps {
|
||||
sh 'source ~/.bashrc && cd eventservice && sh build.sh deploy'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
source ~/.bashrc
|
||||
|
||||
GITSHA=$(git rev-parse --short HEAD)
|
||||
|
||||
case "$1" in
|
||||
container)
|
||||
sudo -u pelger docker build -t eventservice:$GITSHA .
|
||||
sudo -u pelger docker tag eventservice:$GITSHA pelger/eventservice:$GITSHA
|
||||
sudo -i -u pelger docker push pelger/eventservice:$GITSHA
|
||||
;;
|
||||
deploy)
|
||||
sed -e s/_NAME_/eventservice/ -e s/_PORT_/8082/ < ../deployment/service-template.yml > svc.yml
|
||||
sed -e s/_NAME_/eventservice/ -e s/_PORT_/8082/ -e s/_IMAGE_/pelger\\/eventservice:$GITSHA/ < ../deployment/deployment-template.yml > dep.yml
|
||||
sudo -i -u pelger kubectl apply -f $(pwd)/svc.yml
|
||||
sudo -i -u pelger kubectl apply -f $(pwd)/dep.yml
|
||||
;;
|
||||
*)
|
||||
echo 'invalid build command'
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
'use strict'
|
||||
|
||||
const wiring = require('./wiring')
|
||||
const service = require('./service')()
|
||||
wiring(service)
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "event-service",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"no test specified\" && exit 0"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "Peter Elger <peter.elger@nearform.com>",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"concordant": "^0.2.1",
|
||||
"mongodb": "^2.2.25",
|
||||
"redis": "^2.6.5"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
'use strict'
|
||||
|
||||
const { MongoClient } = require('mongodb')
|
||||
const { dns } = require('concordant')()
|
||||
|
||||
module.exports = service
|
||||
|
||||
function service () {
|
||||
var db
|
||||
|
||||
setup()
|
||||
|
||||
function setup () {
|
||||
const mongo = '_main._tcp.mongo.micro.svc.cluster.local'
|
||||
|
||||
dns.resolve(mongo, (err, locs) => {
|
||||
if (err) {
|
||||
console.error(err)
|
||||
return
|
||||
}
|
||||
const { host, port } = locs[0]
|
||||
const url = `mongodb://${host}:${port}/events`
|
||||
MongoClient.connect(url, (err, client) => {
|
||||
if (err) {
|
||||
console.log('failed to connect to MongoDB retrying in 100ms')
|
||||
setTimeout(setup, 100)
|
||||
return
|
||||
}
|
||||
db = client
|
||||
db.on('close', () => db = null)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function record (args, cb) {
|
||||
if (!db) {
|
||||
cb(Error('No database connection'))
|
||||
return
|
||||
}
|
||||
const events = db.collection('events')
|
||||
const data = {
|
||||
ts: Date.now(),
|
||||
eventType: args.type,
|
||||
url: args.url
|
||||
}
|
||||
events.insert(data, (err, result) => {
|
||||
if (err) {
|
||||
cb(err)
|
||||
return
|
||||
}
|
||||
cb(null, result)
|
||||
})
|
||||
}
|
||||
|
||||
function summary (args, cb) {
|
||||
if (!db) {
|
||||
cb(Error('No database connection'))
|
||||
return
|
||||
}
|
||||
const summary = {}
|
||||
const events = db.collection('events')
|
||||
events.find({}).toArray( (err, docs) => {
|
||||
if (err) return cb(err)
|
||||
|
||||
docs.forEach(function (doc) {
|
||||
if (!(summary[doc.url])) {
|
||||
summary[doc.url] = 1
|
||||
} else {
|
||||
summary[doc.url]++
|
||||
}
|
||||
})
|
||||
cb(null, summary)
|
||||
})
|
||||
}
|
||||
|
||||
return {
|
||||
record: record,
|
||||
summary: summary
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
'use strict'
|
||||
|
||||
const { dns } = require('concordant')()
|
||||
const redis = require('redis')
|
||||
const QNAME = 'eventservice'
|
||||
|
||||
module.exports = wiring
|
||||
|
||||
function wiring (service) {
|
||||
|
||||
const endpoint = '_main._tcp.redis.micro.svc.cluster.local'
|
||||
|
||||
dns.resolve(endpoint, (err, locs) => {
|
||||
if (err) {
|
||||
console.log(err)
|
||||
return
|
||||
}
|
||||
const { port, host } = locs[0]
|
||||
pullFromQueue(redis.createClient(port, host))
|
||||
})
|
||||
|
||||
function pullFromQueue (client) {
|
||||
client.brpop(QNAME, 5, function (err, data) {
|
||||
if (err) console.error(err)
|
||||
if (err || !data) {
|
||||
pullFromQueue(client)
|
||||
return
|
||||
}
|
||||
const msg = JSON.parse(data[1])
|
||||
const { action, returnPath } = msg
|
||||
const cmd = service[action]
|
||||
if (typeof cmd !== 'function') {
|
||||
pullFromQueue(client)
|
||||
return
|
||||
}
|
||||
cmd(msg, (err, result) => {
|
||||
if (err) {
|
||||
console.error(err)
|
||||
pullFromQueue(client)
|
||||
return
|
||||
}
|
||||
if (!returnPath) {
|
||||
pullFromQueue(client)
|
||||
return
|
||||
}
|
||||
client.lpush(returnPath, JSON.stringify(result), (err) => {
|
||||
if (err) console.error(err)
|
||||
pullFromQueue(client)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user