Objectives

Build a version of the pacemaker-service API in node.js. Install a version of the node application in Docker. Run this docker module in a vagrant managed VM

Setup

Install the latest version of node.js:

If install successful, node should be available on the command line:

$ node --version
v0.10.26
$

Create a folder called pacemaker-node - this will contain the node.js application.

Change into this folder and enter the following command:

$ npm init

This will ask series of questions, which will result in the creation of a node module in this folder. We can accept the default for almost all questions as shown below:

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sane defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (pacemaker-node)
version: (0.0.0)
description: A sample node.js implementation of the Pacemaker Service
entry point: (index.js)
test command:
git repository: (https://edel020@bitbucket.org/edel020/pacemaker-node.git)
keywords:
author:
license: (ISC)
About to write to /Users/edeleastar/repos/modules/active/patterns/prj/pacemaker-node/package.json:

{
  "name": "pacemaker-node",
  "version": "0.0.0",
  "description": "A sample node.js implementation of the Pacemaker Service",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "https://edel020@bitbucket.org/edel020/pacemaker-node.git"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes) yes

(You may not have a git repository in your example).

Modules

We will need 4 node modules to fulfill the role of the frameworks and libraries in the play application. These are:

Sequelize

A node compatible ORM library:

Sqlite3

A database provider:

Express

A web application framework for node

Body Parser

We also need a parser for recovering the Json content from the HTTP requests:

Install Procedure

The most direct way of installing these modules is to combine the download of the packages with an update of the 'package.json' module descriptor as documented by the npm init commmand:

Use npm install <pkg> --save afterwards to install a package and save it as a dependency in the package.json file.

Here is the sequence of commands:

npm install sequelize --save
npm install sqlite3 --save
npm install express --save
npm install body-parser --save

If successful, the package.json should be extended to include these dependencies:

{
  "name": "pacemaker-node",
  "version": "0.0.0",
  "description": "A sample node.js implementation of the Pacemaker Service",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "https://edel020@bitbucket.org/edel020/pacemaker-node.git"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "sequelize": "^2.0.0-dev11",
    "sqlite3": "^2.2.3",
    "express": "^4.1.0",
    "body-parser": "^1.0.2"
  }
}

In addition, the node_modules folder in the project should be populated with the module sources. The pacemaker-node folder will resemble the following:

├── package.json
├── node_modules
│   ├── body-parser ...
│   ├── express ...
│   ├── sequelize ...
│   └── sqlite3 ...

Model

In the pacemaker-node folder, create another folder called 'models', which will contain an analog of the models we created in the play-service application.

Incorporate the following two javascript files:

users.js

/**
 * Created by tomwalsh on 18/04/2014.
 */
var S = require('sequelize');

var users = function (){};
var userDAO = {};

var _userDAO = {
  id: {type: S.INTEGER, unique: true, primaryKey: true, autoIncrement: true},
  email: {type: S.STRING, unique: true},
  firstName: S.STRING,
  lastName: S.STRING,
  password: S.STRING
};

module.exports = function (){
  return new users ();
};

function _cleanData (data)
{
  if (!data || !data.dataValues)
    return null;

  return data.dataValues;
}

users.prototype.init = function init (sequelize) {
  userDAO = sequelize.define ('users', _userDAO, {tableName: 'users', timestamps: false});
};

users.prototype.loadData = function loadData (data) {
  data.forEach (function (datum) {
    userDAO.findOrCreate(datum, datum).success (function (dataOut, created) {
      if (created)
        console.log (dataOut.dataValues);
    });
  });
}

users.prototype.readAll = function readAll (result) {
  userDAO.findAll ().success (function (dataOut) {
    var ret = [];
    for (var i = 0, len = dataOut.length; i < len; i++) {
      ret.push (dataOut[i].dataValues);
    }

    result (ret);
  });
};

users.prototype.read = function read (userId, result) {
  userDAO.find ({where: {id: userId}}).success (function (dataOut) {
    result (_cleanData (dataOut));
  });
};

users.prototype.create = function create (dataIn, result) {
  userDAO.build (user_data).save ().success (function (dataOut) {
    result (_cleanData (dataOut));
  });
};

users.prototype.update = function update (userId, dataIn, result) {
  userDAO.update (dataIn, {id: userId}).success (function (dataOut) {
    result (_cleanData (dataOut));
  });
};

users.prototype.delete = function del (userId, result) {
  userDAO.destroy ({id: userId}).success (function (dataOut) {
    result (_cleanData (dataOut));
  });
};

activities.js

/**
 * Created by tomwalsh on 18/04/2014.
 */
var S = require('sequelize');

var activities = function (){};
var activitiesDAO = {};

var _activitiesDAO = {
  id: {type: S.INTEGER, unique: true, primaryKey: true, autoIncrement: true},
  userId: S.INTEGER,
  kind: S.STRING,
  location: S.STRING,
  distance: S.FLOAT
};


module.exports = function () {
  return new activities ();
};

function _cleanData (data)
{
  if (!data || !data.dataValues)
    return null;

  return data.dataValues;
}

activities.prototype.init = function init (sequelize) {
  activitiesDAO = sequelize.define('activities', _activitiesDAO, {tableName: 'activities', timestamps: false});
};

activities.prototype.readAll = function readAll (usrId, result) {
  activitiesDAO.findAll ({where: {userId: usrId}}).success (function (dataOut) {
    var ret = [];
    for (var i = 0, len = dataOut.length; i < len; i++) {
      ret.push (dataOut[i].dataValues);
    }
    result (ret);
  });
};

activities.prototype.create = function create (usrId, dataIn, result) {
  dataIn.userId = usrId;
  activitiesDAO.build (dataIn).save ().success (function (dataOut) {
    result (_cleanData (dataOut));
  });
};

activities.prototype.read = function read (usrId, activityId, result) {
  activitiesDAO.find ({where: {id: activityId, userId: usrId}}).success (function (dataOut) {
    result (_cleanData (dataOut));
  });
};

activities.prototype.update = function update (usrId, activityId, dataIn, result) {
  activitiesDAO.update (dataIn, {id: activityId, userId: usrId}).success (function (dataOut) {
    result (_cleanData (dataOut));
  });
};

activities.prototype.delete = function del (usrId, activityId, result) {
  activitiesDAO.destroy ({id: activityId, userId: usrId}).success (function (dataOut) {
    result (_cleanData (dataOut));
  });
};

userdata.js

/**
 * Created by tomwalsh on 25/04/2014.
 */

module.exports = [
  {
    email: 'homer@simpson.com',
    firstName: 'homer',
    lastName: 'simpson',
    password: 'secret'
  },
  {
    email: 'bart@simpson.com',
    firstName: 'bart',
    lastName: 'simpson',
    password: 'secret'
  },
  {
    email: 'marge@simpson.com',
    firstName: 'marge',
    lastName: 'simpson',
    password: 'secret'
  },
  {
    email: 'lisae@simpson.com',
    firstName: 'lisa',
    lastName: 'simpson',
    password: 'secret'
  }
]

Controllers

Create a folder called 'controllers', and introduce these files:

users.js

var router = require('express').Router();

/* GET users listing. */
router.get('/', function(req, res) {
  var userDb = req.app.get('userDb');

  userDb.readAll (function (data) {
    res.send(data);
  });
});

router.post('/', function(req, res) {
  var userDb = req.app.get('userDb');

  userDb.create(req.body, function (data) {
    res.send(data);
  });
});

router.get('/:userId', function(req, res) {
  var userDb = req.app.get('userDb');

  userDb.read (req.params.userId, function (user_data) {
    activitiesDb = req.app.get('activitiesDb');

    activitiesDb.readAll (req.params.userId, function (activ_data) {
      user_data.activities = [];
      for (var i=0,  tot=activ_data.length; i < tot; i++) {
        user_data.activities.push(activ_data[i]);
      }

      res.send(user_data);
    });
  });
});

router.put('/:userId', function(req, res) {
  var userDb = req.app.get('userDb');

  userDb.update (req.params.userId, req.body, function (data) {
    res.send(data);
  });
});

router.delete('/:userId', function(req, res) {
  var userDb = req.app.get('userDb');

  userDb.delete (req.params.userId, function (data) {
    res.send(data);
  });
});

module.exports = router;

activities.js

/**
 * Created by tomwalsh on 18/04/2014.
 */
var router = require('express').Router();

router.get('/', function(req, res) {
  var activitiesDb = req.app.get('activitiesDb');
  var uId = req.app.get('activityUserId');

  activitiesDb.readAll (uId, function (data) {
    res.send(data);
  });
});

router.post('/', function(req, res) {
  var activitiesDb = req.app.get('activitiesDb');
  var uId = req.app.get('activityUserId');

  activitiesDb.create(uId, req.body, function (data) {
    res.send(data);
  });
});

router.get('/:activityId', function(req, res) {
  var activitiesDb = req.app.get('activitiesDb');
  var uId = req.app.get('activityUserId');

  activitiesDb.read (uId, req.params.activityId, function (data) {
    res.send(data);
  });
});

router.put('/:activityId', function(req, res) {
  var activitiesDb = req.app.get('activitiesDb');
  var uId = req.app.get('activityUserId');

  activitiesDb.update (uId, req.params.activityId, req.body, function (data) {
    res.send(data);
  });
});

router.delete('/:activityId', function(req, res) {
  var activitiesDb = req.app.get('activitiesDb');
  var uId = req.app.get('activityUserId');

  activitiesDb.delete (uId, req.params.activityId, function (data) {
    res.send(data);
  });
});

module.exports = router;

Application

In the project folder - pacemaker-node - introduce the main application program:

app.js

var express = require('express');
var path = require('path');
var Sequelize = require('sequelize');
var bodyParser = require('body-parser');

var userDb = require('./models/users')();
var activitiesDb = require('./models/activities')();

var sequelize = new Sequelize('masters_testdb', 'root', 'root', {
  dialect: "sqlite", // or 'sqlite', 'postgres', 'mariadb'
  port:    3306 // or 5432 (for postgres)
});

sequelize.authenticate().complete(function(err) {
  if (!!err) {
    console.log ('Unable to connect to the database:', err);
  } else {
    console.log ('Database connection has been established successfully.');

    userDb.init (sequelize);
    activitiesDb.init(sequelize);

    sequelize.sync ({ force: false }).complete (function (err) {
      if (!!err) {
        console.log ('An error occurred syncing tables:', err);
      } else {
        console.log ('tables synced!');

        // add default data
        var sample_data = require('./models/userdata.js');
        userDb.loadData (sample_data);
      }
    });
  }
});

var app = express ();

app.use(bodyParser());

app.use('/assets', express.static('public'));

var users = require('./controllers/users');
var activities = require('./controllers/activities');

// hacky shortcut to get the userid for the activity route
app.use('/api/users/:userId/activities', function (req,res,next) {
  req.app.set('activityUserId', req.params.userId);
  next ();
});
app.use('/api/users/:userId/activities', activities);

app.use('/api/users', users);

app.use('/', function (req, res){
  res.sendfile('./public/pacemaker.html');
});

app.set('userDb', userDb);
app.set('activitiesDb', activitiesDb);

app.listen(8080);
console.log ("pacemaker-node app is listening on port 8080");

The application structure will now be laid out as follows:

├── app.js
├── controllers
│   ├── activities.js
│   └── users.js
├── models
│   ├── activities.js
│   ├── userdata.js
│   └── users.js
├── node_modules
│   ├── body-parser ...
│   ├── express ...
│   ├── sequelize ...
│   └── sqlite3 ...
├── package.json

Test the API

The app can be launched now:

$ node app.js

Which should display some initialisation activity:

pacemaker-node app is listening on port 8080
Executing (default): SELECT 1+1 AS result
Database connection has been established successfully.
tables synced!
Executing (default): SELECT * FROM `users` AS `users` WHERE `users`.`email`='homer@simpson.com' AND `users`.`firstName`='homer' AND `users`.`lastName`='simpson' AND `users`.`password`='secret' LIMIT 1;
Executing (default): SELECT * FROM `users` AS `users` WHERE `users`.`email`='bart@simpson.com' AND `users`.`firstName`='bart' AND `users`.`lastName`='simpson' AND `users`.`password`='secret' LIMIT 1;
Executing (default): SELECT * FROM `users` AS `users` WHERE `users`.`email`='marge@simpson.com' AND `users`.`firstName`='marge' AND `users`.`lastName`='simpson' AND `users`.`password`='secret' LIMIT 1;
Executing (default): SELECT * FROM `users` AS `users` WHERE `users`.`email`='lisae@simpson.com' AND `users`.`firstName`='lisa' AND `users`.`lastName`='simpson' AND `users`.`password`='secret' LIMIT 1;
Executing (default): INSERT INTO `users` (`id`,`email`,`firstName`,`lastName`,`password`) VALUES (NULL,'homer@simpson.com','homer','simpson','secret');
{ id: null,
  email: 'homer@simpson.com',
  firstName: 'homer',
  lastName: 'simpson',
  password: 'secret' }
Executing (default): INSERT INTO `users` (`id`,`email`,`firstName`,`lastName`,`password`) VALUES (NULL,'bart@simpson.com','bart','simpson','secret');
{ id: null,
  email: 'bart@simpson.com',
  firstName: 'bart',
  lastName: 'simpson',
  password: 'secret' }
Executing (default): INSERT INTO `users` (`id`,`email`,`firstName`,`lastName`,`password`) VALUES (NULL,'marge@simpson.com','marge','simpson','secret');
Executing (default): INSERT INTO `users` (`id`,`email`,`firstName`,`lastName`,`password`) VALUES (NULL,'lisae@simpson.com','lisa','simpson','secret');
{ id: null,
  email: 'marge@simpson.com',
  firstName: 'marge',
  lastName: 'simpson',
  password: 'secret' }
{ id: null,
  email: 'lisae@simpson.com',
  firstName: 'lisa',
  lastName: 'simpson',
  password: 'secret' }

In a browser, we can request the users list via a simple request:

which should respond with:

[{"id":1,"email":"homer@simpson.com","firstName":"homer","lastName":"simpson","password":"secret"},
{"id":2,"email":"bart@simpson.com", "firstName":"bart","lastName":"simpson","password":"secret"},
{"id":3,"email":"marge@simpson.com", "firstName":"marge","lastName":"simpson","password":"secret"},
{"id":4,"email":"lisae@simpson.com", "firstName":"lisa","lastName":"simpson","password":"secret"}]

pacemaker-android

The abdroid application as we have left in the last lab:

should inter-operate with pacemaker-node with just one modification to the android app:

Rest.java

public class Rest
{
  private static DefaultHttpClient httpClient = null;
 // private static final String URL = "http://10.0.2.2:9000";
  private static final String URL = "http://10.0.2.2:8080";

(the node app is listenting on 8080).

Log in as 'homer@simpson.com', 'secret'.

All features of the pacemaker-android should work as expected, including creating and listing activities.

Vagrant

Install virtual box on your system:

Then, install Vagrant:

Inside the pacemaker-node directory, create the following file:

vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise64"
  config.vm.network :forwarded_port, host: 8080, guest: 8080
  config.vm.provision "docker"
end

In the console/terminal, enter:

vagrant up

This will install a clean, headless, linux VM on you workstation. THe VM will be managed by virtualbox. It may take some time to run, and should respond something like this:

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'hashicorp/precise64' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'hashicorp/precise64'
    default: URL: https://vagrantcloud.com/hashicorp/precise64
==> default: Adding box 'hashicorp/precise64' (v1.1.0) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/hashicorp/precise64/version/2/provider/virtualbox.box
==> default: Successfully added box 'hashicorp/precise64' (v1.1.0) for 'virtualbox'!
==> default: Importing base box 'hashicorp/precise64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'hashicorp/precise64' is up to date...
==> default: Setting the name of the VM: pacemaker-node_default_1398923983349_61608
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 8080 => 8080 (adapter 1)
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => /Users/edeleastar/repos/modules/active/patterns/prj/pacemaker-node
==> default: Running provisioner: docker...
    default: Installing Docker (latest) onto machine...
    default: Configuring Docker to autostart containers...

You can log in to this machine using ssh:

vagrant ssh

Which will deliver an authenticated shell:

Welcome to your Vagrant-built virtual machine.
Last login: Fri Sep 14 06:23:18 2012 from 10.0.2.2
vagrant@precise64:~$

Enter 'exit' to log out of this again (we will log in again in the next step)

logout
Connection to 127.0.0.1 closed.
localhost:pacemaker-node $

Docker

Also in the pacemaker-node folder, create the following file:

Dockerfile

# DOCKER-VERSION 0.3.4
FROM ubuntu

RUN echo "deb http://archive.ubuntu.com/ubuntu precise universe" >> /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y software-properties-common
RUN apt-get install -y python-software-properties python g++ make
RUN add-apt-repository -y ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get install -y nodejs

ADD . /pacemaker-node-app
WORKDIR /pacemaker-node-app
RUN npm rebuild
EXPOSE 8080
CMD node app

Now, log in to the VM again:

vagrant ssh

And enter the following command:

docker build -t "pacemaker-app" /vagrant

This will take 10-15 minutes to build the docker module (success transcript at the end of this page)

If successful (and still logged in to the VM), we can run the app:

docker run -i -t -p 8080:8080 pacemaker-app

The app should now be running:

pacemaker-node app is listening on port 8080
Executing (default): SELECT 1+1 AS result
Database connection has been established successfully.
tables synced!
Executing (default): SELECT * FROM `users` WHERE `users`.`email`='homer@simpson.com' AND `users`.`firstName`='homer' AND `users`.`lastName`='simpson' AND `users`.`password`='secret' LIMIT 1;
Executing (default): SELECT * FROM `users` WHERE `users`.`email`='bart@simpson.com' AND `users`.`firstName`='bart' AND `users`.`lastName`='simpson' AND `users`.`password`='secret' LIMIT 1;
Executing (default): SELECT * FROM `users` WHERE `users`.`email`='marge@simpson.com' AND `users`.`firstName`='marge' AND `users`.`lastName`='simpson' AND `users`.`password`='secret' LIMIT 1;
Executing (default): SELECT * FROM `users` WHERE `users`.`email`='lisae@simpson.com' AND `users`.`firstName`='lisa' AND `users`.`lastName`='simpson' AND `users`.`password`='secret' LIMIT 1;
Executing (default): INSERT INTO `users` (`id`,`email`,`firstName`,`lastName`,`password`) VALUES (NULL,'homer@simpson.com','homer','simpson','secret');
{ email: 'homer@simpson.com',
  firstName: 'homer',
  lastName: 'simpson',
  password: 'secret',
  id: null }
Executing (default): INSERT INTO `users` (`id`,`email`,`firstName`,`lastName`,`password`) VALUES (NULL,'bart@simpson.com','bart','simpson','secret');
Executing (default): INSERT INTO `users` (`id`,`email`,`firstName`,`lastName`,`password`) VALUES (NULL,'marge@simpson.com','marge','simpson','secret');
{ email: 'bart@simpson.com',
  firstName: 'bart',
  lastName: 'simpson',
  password: 'secret',
  id: null }
{ email: 'marge@simpson.com',
  firstName: 'marge',
  lastName: 'simpson',
  password: 'secret',
  id: null }
Executing (default): INSERT INTO `users` (`id`,`email`,`firstName`,`lastName`,`password`) VALUES (NULL,'lisae@simpson.com','lisa','simpson','secret');
{ email: 'lisae@simpson.com',
  firstName: 'lisa',
  lastName: 'simpson',
  password: 'secret',
  id: null }

Back on our host, browse to

and the API should respond as expected.

Sucessful Docker build response

Uploading context 4.647 MB
Uploading context
Step 0 : FROM ubuntu
Pulling repository ubuntu
74fe38d11401: Download complete
3db9c44f4520: Download complete
316b678ddf48: Download complete
a7cf8ae4e998: Download complete
99ec81b80c55: Download complete
5e019ab7bf6d: Download complete
511136ea3c5a: Download complete
02dae1c13f51: Download complete
e7206bfc66aa: Download complete
cb12405ee8fa: Download complete
ef519c9ee91a: Download complete
5e66087f3ffe: Download complete
f10ebce2c0e1: Download complete
e2aa6665d371: Download complete
6cfa4d1f33fb: Download complete
07302703becc: Download complete
cf8dc907452c: Download complete
82cdea7ab5b5: Download complete
5dbd9cb5a02f: Download complete
f0ee64c4df74: Download complete
2209cbf9dcd3: Download complete
4d26dd3ebc1c: Download complete
d4010efcfd86: Download complete
 ---> 99ec81b80c55
Step 1 : RUN echo "deb http://archive.ubuntu.com/ubuntu precise universe" >> /etc/apt/sources.list
 ---> Running in 092c66d960f7
 ---> 89e6b335230a
Step 2 : RUN apt-get update
 ---> Running in 07e1ff30fda5
Ign http://archive.ubuntu.com trusty InRelease
Ign http://archive.ubuntu.com trusty-updates InRelease
Ign http://archive.ubuntu.com trusty-security InRelease
Ign http://archive.ubuntu.com precise InRelease
Hit http://archive.ubuntu.com trusty Release.gpg
Get:1 http://archive.ubuntu.com trusty-updates Release.gpg [933 B]
Get:2 http://archive.ubuntu.com trusty-security Release.gpg [933 B]
Get:3 http://archive.ubuntu.com precise Release.gpg [198 B]
Hit http://archive.ubuntu.com trusty Release
Get:4 http://archive.ubuntu.com trusty-updates Release [58.5 kB]
Get:5 http://archive.ubuntu.com trusty-security Release [58.5 kB]
Get:6 http://archive.ubuntu.com precise Release [49.6 kB]
Hit http://archive.ubuntu.com trusty/main Sources
Hit http://archive.ubuntu.com trusty/restricted Sources
Hit http://archive.ubuntu.com trusty/universe Sources
Hit http://archive.ubuntu.com trusty/main amd64 Packages
Hit http://archive.ubuntu.com trusty/restricted amd64 Packages
Hit http://archive.ubuntu.com trusty/universe amd64 Packages
Get:7 http://archive.ubuntu.com trusty-updates/main Sources [14.0 kB]
Get:8 http://archive.ubuntu.com trusty-updates/restricted Sources [14 B]
Get:9 http://archive.ubuntu.com trusty-updates/universe Sources [5845 B]
Get:10 http://archive.ubuntu.com trusty-updates/main amd64 Packages [44.7 kB]
Get:11 http://archive.ubuntu.com trusty-updates/restricted amd64 Packages [14 B]
Get:12 http://archive.ubuntu.com trusty-updates/universe amd64 Packages [15.5 kB]
Get:13 http://archive.ubuntu.com trusty-security/main Sources [8405 B]
Get:14 http://archive.ubuntu.com trusty-security/restricted Sources [14 B]
Get:15 http://archive.ubuntu.com trusty-security/universe Sources [14 B]
Get:16 http://archive.ubuntu.com trusty-security/main amd64 Packages [31.6 kB]
Get:17 http://archive.ubuntu.com trusty-security/restricted amd64 Packages [14 B]
Get:18 http://archive.ubuntu.com trusty-security/universe amd64 Packages [5855 B]
Get:19 http://archive.ubuntu.com precise/universe amd64 Packages [4786 kB]
Fetched 5081 kB in 23s (216 kB/s)
Reading package lists...
 ---> b527fa2a426e
Step 3 : RUN apt-get install -y software-properties-common
 ---> Running in adfae8b10a00
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  ca-certificates gir1.2-glib-2.0 iso-codes krb5-locales libasn1-8-heimdal
  libcurl3-gnutls libdbus-glib-1-2 libgirepository-1.0-1 libglib2.0-0
  libglib2.0-data libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal
  libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal libidn11
  libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3 libkrb5support0
  libldap-2.4-2 libroken18-heimdal librtmp0 libsasl2-2 libsasl2-modules
  libsasl2-modules-db libwind0-heimdal libxml2 openssl python-apt-common
  python3-apt python3-dbus python3-gi python3-pycurl
  python3-software-properties sgml-base shared-mime-info unattended-upgrades
  xml-core xz-utils
Suggested packages:
  isoquery krb5-doc krb5-user libsasl2-modules-otp libsasl2-modules-ldap
  libsasl2-modules-sql libsasl2-modules-gssapi-mit
  libsasl2-modules-gssapi-heimdal python3-apt-dbg python-apt-doc
  python-dbus-doc python3-dbus-dbg libcurl4-gnutls-dev python3-pycurl-dbg
  sgml-base-doc bsd-mailx mail-transport-agent debhelper
The following NEW packages will be installed:
  ca-certificates gir1.2-glib-2.0 iso-codes krb5-locales libasn1-8-heimdal
  libcurl3-gnutls libdbus-glib-1-2 libgirepository-1.0-1 libglib2.0-0
  libglib2.0-data libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal
  libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal libidn11
  libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3 libkrb5support0
  libldap-2.4-2 libroken18-heimdal librtmp0 libsasl2-2 libsasl2-modules
  libsasl2-modules-db libwind0-heimdal libxml2 openssl python-apt-common
  python3-apt python3-dbus python3-gi python3-pycurl
  python3-software-properties sgml-base shared-mime-info
  software-properties-common unattended-upgrades xml-core xz-utils
0 upgraded, 43 newly installed, 0 to remove and 2 not upgraded.
Need to get 7661 kB of archives.
After this operation, 42.0 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/main libroken18-heimdal amd64 1.6~git20131207+dfsg-1ubuntu1 [40.0 kB]
Get:2 http://archive.ubuntu.com/ubuntu/ trusty/main libasn1-8-heimdal amd64 1.6~git20131207+dfsg-1ubuntu1 [160 kB]
Get:3 http://archive.ubuntu.com/ubuntu/ trusty/main libkrb5support0 amd64 1.12+dfsg-2ubuntu4 [29.5 kB]
Get:4 http://archive.ubuntu.com/ubuntu/ trusty/main libk5crypto3 amd64 1.12+dfsg-2ubuntu4 [79.5 kB]
Get:5 http://archive.ubuntu.com/ubuntu/ trusty/main libkeyutils1 amd64 1.5.6-1 [7318 B]
Get:6 http://archive.ubuntu.com/ubuntu/ trusty/main libkrb5-3 amd64 1.12+dfsg-2ubuntu4 [262 kB]
Get:7 http://archive.ubuntu.com/ubuntu/ trusty/main libgssapi-krb5-2 amd64 1.12+dfsg-2ubuntu4 [113 kB]
Get:8 http://archive.ubuntu.com/ubuntu/ trusty/main libidn11 amd64 1.28-1ubuntu2 [93.0 kB]
Get:9 http://archive.ubuntu.com/ubuntu/ trusty/main libhcrypto4-heimdal amd64 1.6~git20131207+dfsg-1ubuntu1 [84.0 kB]
Get:10 http://archive.ubuntu.com/ubuntu/ trusty/main libheimbase1-heimdal amd64 1.6~git20131207+dfsg-1ubuntu1 [29.0 kB]
Get:11 http://archive.ubuntu.com/ubuntu/ trusty/main libwind0-heimdal amd64 1.6~git20131207+dfsg-1ubuntu1 [47.8 kB]
Get:12 http://archive.ubuntu.com/ubuntu/ trusty/main libhx509-5-heimdal amd64 1.6~git20131207+dfsg-1ubuntu1 [104 kB]
Get:13 http://archive.ubuntu.com/ubuntu/ trusty/main libkrb5-26-heimdal amd64 1.6~git20131207+dfsg-1ubuntu1 [197 kB]
Get:14 http://archive.ubuntu.com/ubuntu/ trusty/main libheimntlm0-heimdal amd64 1.6~git20131207+dfsg-1ubuntu1 [15.2 kB]
Get:15 http://archive.ubuntu.com/ubuntu/ trusty/main libgssapi3-heimdal amd64 1.6~git20131207+dfsg-1ubuntu1 [90.1 kB]
Get:16 http://archive.ubuntu.com/ubuntu/ trusty/main libsasl2-modules-db amd64 2.1.25.dfsg1-17build1 [14.9 kB]
Get:17 http://archive.ubuntu.com/ubuntu/ trusty/main libsasl2-2 amd64 2.1.25.dfsg1-17build1 [56.5 kB]
Get:18 http://archive.ubuntu.com/ubuntu/ trusty/main libldap-2.4-2 amd64 2.4.31-1+nmu2ubuntu8 [154 kB]
Get:19 http://archive.ubuntu.com/ubuntu/ trusty/main librtmp0 amd64 2.4+20121230.gitdf6c518-1 [57.5 kB]
Get:20 http://archive.ubuntu.com/ubuntu/ trusty/main libcurl3-gnutls amd64 7.35.0-1ubuntu2 [165 kB]
Get:21 http://archive.ubuntu.com/ubuntu/ trusty/main libglib2.0-0 amd64 2.40.0-2 [1057 kB]
Get:22 http://archive.ubuntu.com/ubuntu/ trusty/main libdbus-glib-1-2 amd64 0.100.2-1 [74.1 kB]
Get:23 http://archive.ubuntu.com/ubuntu/ trusty/main libxml2 amd64 2.9.1+dfsg1-3ubuntu4 [571 kB]
Get:24 http://archive.ubuntu.com/ubuntu/ trusty/main sgml-base all 1.26+nmu4ubuntu1 [12.5 kB]
Get:25 http://archive.ubuntu.com/ubuntu/ trusty/main openssl amd64 1.0.1f-1ubuntu2 [489 kB]
Get:26 http://archive.ubuntu.com/ubuntu/ trusty/main ca-certificates all 20130906ubuntu2 [175 kB]
Get:27 http://archive.ubuntu.com/ubuntu/ trusty/main libgirepository-1.0-1 amd64 1.40.0-1 [85.7 kB]
Get:28 http://archive.ubuntu.com/ubuntu/ trusty/main gir1.2-glib-2.0 amd64 1.40.0-1 [124 kB]
Get:29 http://archive.ubuntu.com/ubuntu/ trusty/main iso-codes all 3.52-1 [2073 kB]
Get:30 http://archive.ubuntu.com/ubuntu/ trusty/main krb5-locales all 1.12+dfsg-2ubuntu4 [12.3 kB]
Get:31 http://archive.ubuntu.com/ubuntu/ trusty/main libglib2.0-data all 2.40.0-2 [116 kB]
Get:32 http://archive.ubuntu.com/ubuntu/ trusty/main libsasl2-modules amd64 2.1.25.dfsg1-17build1 [64.3 kB]
Get:33 http://archive.ubuntu.com/ubuntu/ trusty/main python-apt-common all 0.9.3.5 [17.3 kB]
Get:34 http://archive.ubuntu.com/ubuntu/ trusty/main python3-apt amd64 0.9.3.5 [139 kB]
Get:35 http://archive.ubuntu.com/ubuntu/ trusty/main python3-dbus amd64 1.2.0-2build2 [82.1 kB]
Get:36 http://archive.ubuntu.com/ubuntu/ trusty/main python3-gi amd64 3.12.0-1 [154 kB]
Get:37 http://archive.ubuntu.com/ubuntu/ trusty/main shared-mime-info amd64 1.2-0ubuntu3 [415 kB]
Get:38 http://archive.ubuntu.com/ubuntu/ trusty/main xml-core all 0.13+nmu2 [23.3 kB]
Get:39 http://archive.ubuntu.com/ubuntu/ trusty/main python3-pycurl amd64 7.19.3-0ubuntu3 [47.5 kB]
Get:40 http://archive.ubuntu.com/ubuntu/ trusty/main xz-utils amd64 5.1.1alpha+20120614-2ubuntu2 [78.8 kB]
Get:41 http://archive.ubuntu.com/ubuntu/ trusty/main unattended-upgrades all 0.82.1ubuntu2 [25.5 kB]
Get:42 http://archive.ubuntu.com/ubuntu/ trusty-updates/main python3-software-properties all 0.92.37 [19.4 kB]
Get:43 http://archive.ubuntu.com/ubuntu/ trusty-updates/main software-properties-common all 0.92.37 [9344 B]
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin:
Fetched 7661 kB in 39s (193 kB/s)
Selecting previously unselected package libroken18-heimdal:amd64.
(Reading database ... 11518 files and directories currently installed.)
Preparing to unpack .../libroken18-heimdal_1.6~git20131207+dfsg-1ubuntu1_amd64.deb ...
Unpacking libroken18-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Selecting previously unselected package libasn1-8-heimdal:amd64.
Preparing to unpack .../libasn1-8-heimdal_1.6~git20131207+dfsg-1ubuntu1_amd64.deb ...
Unpacking libasn1-8-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Selecting previously unselected package libkrb5support0:amd64.
Preparing to unpack .../libkrb5support0_1.12+dfsg-2ubuntu4_amd64.deb ...
Unpacking libkrb5support0:amd64 (1.12+dfsg-2ubuntu4) ...
Selecting previously unselected package libk5crypto3:amd64.
Preparing to unpack .../libk5crypto3_1.12+dfsg-2ubuntu4_amd64.deb ...
Unpacking libk5crypto3:amd64 (1.12+dfsg-2ubuntu4) ...
Selecting previously unselected package libkeyutils1:amd64.
Preparing to unpack .../libkeyutils1_1.5.6-1_amd64.deb ...
Unpacking libkeyutils1:amd64 (1.5.6-1) ...
Selecting previously unselected package libkrb5-3:amd64.
Preparing to unpack .../libkrb5-3_1.12+dfsg-2ubuntu4_amd64.deb ...
Unpacking libkrb5-3:amd64 (1.12+dfsg-2ubuntu4) ...
Selecting previously unselected package libgssapi-krb5-2:amd64.
Preparing to unpack .../libgssapi-krb5-2_1.12+dfsg-2ubuntu4_amd64.deb ...
Unpacking libgssapi-krb5-2:amd64 (1.12+dfsg-2ubuntu4) ...
Selecting previously unselected package libidn11:amd64.
Preparing to unpack .../libidn11_1.28-1ubuntu2_amd64.deb ...
Unpacking libidn11:amd64 (1.28-1ubuntu2) ...
Selecting previously unselected package libhcrypto4-heimdal:amd64.
Preparing to unpack .../libhcrypto4-heimdal_1.6~git20131207+dfsg-1ubuntu1_amd64.deb ...
Unpacking libhcrypto4-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Selecting previously unselected package libheimbase1-heimdal:amd64.
Preparing to unpack .../libheimbase1-heimdal_1.6~git20131207+dfsg-1ubuntu1_amd64.deb ...
Unpacking libheimbase1-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Selecting previously unselected package libwind0-heimdal:amd64.
Preparing to unpack .../libwind0-heimdal_1.6~git20131207+dfsg-1ubuntu1_amd64.deb ...
Unpacking libwind0-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Selecting previously unselected package libhx509-5-heimdal:amd64.
Preparing to unpack .../libhx509-5-heimdal_1.6~git20131207+dfsg-1ubuntu1_amd64.deb ...
Unpacking libhx509-5-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Selecting previously unselected package libkrb5-26-heimdal:amd64.
Preparing to unpack .../libkrb5-26-heimdal_1.6~git20131207+dfsg-1ubuntu1_amd64.deb ...
Unpacking libkrb5-26-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Selecting previously unselected package libheimntlm0-heimdal:amd64.
Preparing to unpack .../libheimntlm0-heimdal_1.6~git20131207+dfsg-1ubuntu1_amd64.deb ...
Unpacking libheimntlm0-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Selecting previously unselected package libgssapi3-heimdal:amd64.
Preparing to unpack .../libgssapi3-heimdal_1.6~git20131207+dfsg-1ubuntu1_amd64.deb ...
Unpacking libgssapi3-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Selecting previously unselected package libsasl2-modules-db:amd64.
Preparing to unpack .../libsasl2-modules-db_2.1.25.dfsg1-17build1_amd64.deb ...
Unpacking libsasl2-modules-db:amd64 (2.1.25.dfsg1-17build1) ...
Selecting previously unselected package libsasl2-2:amd64.
Preparing to unpack .../libsasl2-2_2.1.25.dfsg1-17build1_amd64.deb ...
Unpacking libsasl2-2:amd64 (2.1.25.dfsg1-17build1) ...
Selecting previously unselected package libldap-2.4-2:amd64.
Preparing to unpack .../libldap-2.4-2_2.4.31-1+nmu2ubuntu8_amd64.deb ...
Unpacking libldap-2.4-2:amd64 (2.4.31-1+nmu2ubuntu8) ...
Selecting previously unselected package librtmp0:amd64.
Preparing to unpack .../librtmp0_2.4+20121230.gitdf6c518-1_amd64.deb ...
Unpacking librtmp0:amd64 (2.4+20121230.gitdf6c518-1) ...
Selecting previously unselected package libcurl3-gnutls:amd64.
Preparing to unpack .../libcurl3-gnutls_7.35.0-1ubuntu2_amd64.deb ...
Unpacking libcurl3-gnutls:amd64 (7.35.0-1ubuntu2) ...
Selecting previously unselected package libglib2.0-0:amd64.
Preparing to unpack .../libglib2.0-0_2.40.0-2_amd64.deb ...
Unpacking libglib2.0-0:amd64 (2.40.0-2) ...
Selecting previously unselected package libdbus-glib-1-2:amd64.
Preparing to unpack .../libdbus-glib-1-2_0.100.2-1_amd64.deb ...
Unpacking libdbus-glib-1-2:amd64 (0.100.2-1) ...
Selecting previously unselected package libxml2:amd64.
Preparing to unpack .../libxml2_2.9.1+dfsg1-3ubuntu4_amd64.deb ...
Unpacking libxml2:amd64 (2.9.1+dfsg1-3ubuntu4) ...
Selecting previously unselected package sgml-base.
Preparing to unpack .../sgml-base_1.26+nmu4ubuntu1_all.deb ...
Unpacking sgml-base (1.26+nmu4ubuntu1) ...
Selecting previously unselected package openssl.
Preparing to unpack .../openssl_1.0.1f-1ubuntu2_amd64.deb ...
Unpacking openssl (1.0.1f-1ubuntu2) ...
Selecting previously unselected package ca-certificates.
Preparing to unpack .../ca-certificates_20130906ubuntu2_all.deb ...
Unpacking ca-certificates (20130906ubuntu2) ...
Selecting previously unselected package libgirepository-1.0-1.
Preparing to unpack .../libgirepository-1.0-1_1.40.0-1_amd64.deb ...
Unpacking libgirepository-1.0-1 (1.40.0-1) ...
Selecting previously unselected package gir1.2-glib-2.0.
Preparing to unpack .../gir1.2-glib-2.0_1.40.0-1_amd64.deb ...
Unpacking gir1.2-glib-2.0 (1.40.0-1) ...
Selecting previously unselected package iso-codes.
Preparing to unpack .../iso-codes_3.52-1_all.deb ...
Unpacking iso-codes (3.52-1) ...
Selecting previously unselected package krb5-locales.
Preparing to unpack .../krb5-locales_1.12+dfsg-2ubuntu4_all.deb ...
Unpacking krb5-locales (1.12+dfsg-2ubuntu4) ...
Selecting previously unselected package libglib2.0-data.
Preparing to unpack .../libglib2.0-data_2.40.0-2_all.deb ...
Unpacking libglib2.0-data (2.40.0-2) ...
Selecting previously unselected package libsasl2-modules:amd64.
Preparing to unpack .../libsasl2-modules_2.1.25.dfsg1-17build1_amd64.deb ...
Unpacking libsasl2-modules:amd64 (2.1.25.dfsg1-17build1) ...
Selecting previously unselected package python-apt-common.
Preparing to unpack .../python-apt-common_0.9.3.5_all.deb ...
Unpacking python-apt-common (0.9.3.5) ...
Selecting previously unselected package python3-apt.
Preparing to unpack .../python3-apt_0.9.3.5_amd64.deb ...
Unpacking python3-apt (0.9.3.5) ...
Selecting previously unselected package python3-dbus.
Preparing to unpack .../python3-dbus_1.2.0-2build2_amd64.deb ...
Unpacking python3-dbus (1.2.0-2build2) ...
Selecting previously unselected package python3-gi.
Preparing to unpack .../python3-gi_3.12.0-1_amd64.deb ...
Unpacking python3-gi (3.12.0-1) ...
Selecting previously unselected package shared-mime-info.
Preparing to unpack .../shared-mime-info_1.2-0ubuntu3_amd64.deb ...
Unpacking shared-mime-info (1.2-0ubuntu3) ...
Selecting previously unselected package xml-core.
Preparing to unpack .../xml-core_0.13+nmu2_all.deb ...
Unpacking xml-core (0.13+nmu2) ...
Selecting previously unselected package python3-pycurl.
Preparing to unpack .../python3-pycurl_7.19.3-0ubuntu3_amd64.deb ...
Unpacking python3-pycurl (7.19.3-0ubuntu3) ...
Selecting previously unselected package xz-utils.
Preparing to unpack .../xz-utils_5.1.1alpha+20120614-2ubuntu2_amd64.deb ...
Unpacking xz-utils (5.1.1alpha+20120614-2ubuntu2) ...
Selecting previously unselected package unattended-upgrades.
Preparing to unpack .../unattended-upgrades_0.82.1ubuntu2_all.deb ...
Unpacking unattended-upgrades (0.82.1ubuntu2) ...
Selecting previously unselected package python3-software-properties.
Preparing to unpack .../python3-software-properties_0.92.37_all.deb ...
Unpacking python3-software-properties (0.92.37) ...
Selecting previously unselected package software-properties-common.
Preparing to unpack .../software-properties-common_0.92.37_all.deb ...
Unpacking software-properties-common (0.92.37) ...
Processing triggers for ureadahead (0.100.0-16) ...
Setting up libroken18-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Setting up libasn1-8-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Setting up libkrb5support0:amd64 (1.12+dfsg-2ubuntu4) ...
Setting up libk5crypto3:amd64 (1.12+dfsg-2ubuntu4) ...
Setting up libkeyutils1:amd64 (1.5.6-1) ...
Setting up libkrb5-3:amd64 (1.12+dfsg-2ubuntu4) ...
Setting up libgssapi-krb5-2:amd64 (1.12+dfsg-2ubuntu4) ...
Setting up libidn11:amd64 (1.28-1ubuntu2) ...
Setting up libhcrypto4-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Setting up libheimbase1-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Setting up libwind0-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Setting up libhx509-5-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Setting up libkrb5-26-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Setting up libheimntlm0-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Setting up libgssapi3-heimdal:amd64 (1.6~git20131207+dfsg-1ubuntu1) ...
Setting up libsasl2-modules-db:amd64 (2.1.25.dfsg1-17build1) ...
Setting up libsasl2-2:amd64 (2.1.25.dfsg1-17build1) ...
Setting up libldap-2.4-2:amd64 (2.4.31-1+nmu2ubuntu8) ...
Setting up librtmp0:amd64 (2.4+20121230.gitdf6c518-1) ...
Setting up libcurl3-gnutls:amd64 (7.35.0-1ubuntu2) ...
Setting up libglib2.0-0:amd64 (2.40.0-2) ...
No schema files found: doing nothing.
Setting up libdbus-glib-1-2:amd64 (0.100.2-1) ...
Setting up libxml2:amd64 (2.9.1+dfsg1-3ubuntu4) ...
Setting up sgml-base (1.26+nmu4ubuntu1) ...
Setting up openssl (1.0.1f-1ubuntu2) ...
Setting up ca-certificates (20130906ubuntu2) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
Setting up libgirepository-1.0-1 (1.40.0-1) ...
Setting up gir1.2-glib-2.0 (1.40.0-1) ...
Setting up iso-codes (3.52-1) ...
Setting up krb5-locales (1.12+dfsg-2ubuntu4) ...
Setting up libglib2.0-data (2.40.0-2) ...
Setting up libsasl2-modules:amd64 (2.1.25.dfsg1-17build1) ...
Setting up python-apt-common (0.9.3.5) ...
Setting up python3-apt (0.9.3.5) ...
Setting up python3-dbus (1.2.0-2build2) ...
Setting up python3-gi (3.12.0-1) ...
Setting up shared-mime-info (1.2-0ubuntu3) ...
Setting up xml-core (0.13+nmu2) ...
Setting up python3-pycurl (7.19.3-0ubuntu3) ...
Setting up xz-utils (5.1.1alpha+20120614-2ubuntu2) ...
update-alternatives: using /usr/bin/xz to provide /usr/bin/lzma (lzma) in auto mode
Setting up unattended-upgrades (0.82.1ubuntu2) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
Processing triggers for ureadahead (0.100.0-16) ...
Setting up python3-software-properties (0.92.37) ...
Setting up software-properties-common (0.92.37) ...
Processing triggers for libc-bin (2.19-0ubuntu6) ...
Processing triggers for ca-certificates (20130906ubuntu2) ...
Updating certificates in /etc/ssl/certs... 164 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.
Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
 ---> 26ddac8239a3
Step 4 : RUN apt-get install -y python-software-properties python g++ make
 ---> Running in 05e4fdf07c26
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  binutils cpp cpp-4.8 g++-4.8 gcc gcc-4.8 libasan0 libatomic1 libc-dev-bin
  libc6-dev libcloog-isl4 libgcc-4.8-dev libgmp10 libgomp1 libisl10 libitm1
  libmpc3 libmpfr4 libpython-stdlib libpython2.7-minimal libpython2.7-stdlib
  libquadmath0 libstdc++-4.8-dev libtsan0 linux-libc-dev manpages manpages-dev
  python-apt python-minimal python-pycurl python2.7 python2.7-minimal
Suggested packages:
  binutils-doc cpp-doc gcc-4.8-locales g++-multilib g++-4.8-multilib
  gcc-4.8-doc libstdc++6-4.8-dbg gcc-multilib autoconf automake1.9 libtool
  flex bison gdb gcc-doc gcc-4.8-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg
  libatomic1-dbg libasan0-dbg libtsan0-dbg libbacktrace1-dbg libquadmath0-dbg
  binutils-gold glibc-doc libstdc++-4.8-doc make-doc man-browser python-doc
  python-tk python-apt-dbg python-gtk2 python-vte python-apt-doc
  libcurl4-gnutls-dev python-pycurl-dbg python2.7-doc binfmt-support
The following NEW packages will be installed:
  binutils cpp cpp-4.8 g++ g++-4.8 gcc gcc-4.8 libasan0 libatomic1
  libc-dev-bin libc6-dev libcloog-isl4 libgcc-4.8-dev libgmp10 libgomp1
  libisl10 libitm1 libmpc3 libmpfr4 libpython-stdlib libpython2.7-minimal
  libpython2.7-stdlib libquadmath0 libstdc++-4.8-dev libtsan0 linux-libc-dev
  make manpages manpages-dev python python-apt python-minimal python-pycurl
  python-software-properties python2.7 python2.7-minimal
0 upgraded, 36 newly installed, 0 to remove and 2 not upgraded.
Need to get 31.9 MB of archives.
After this operation, 118 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/main libasan0 amd64 4.8.2-19ubuntu1 [63.0 kB]
Get:2 http://archive.ubuntu.com/ubuntu/ trusty/main libatomic1 amd64 4.8.2-19ubuntu1 [8626 B]
Get:3 http://archive.ubuntu.com/ubuntu/ trusty/main libgmp10 amd64 2:5.1.3+dfsg-1ubuntu1 [218 kB]
Get:4 http://archive.ubuntu.com/ubuntu/ trusty/main libisl10 amd64 0.12.2-1 [419 kB]
Get:5 http://archive.ubuntu.com/ubuntu/ trusty/main libcloog-isl4 amd64 0.18.2-1 [57.5 kB]
Get:6 http://archive.ubuntu.com/ubuntu/ trusty/main libgomp1 amd64 4.8.2-19ubuntu1 [23.2 kB]
Get:7 http://archive.ubuntu.com/ubuntu/ trusty/main libitm1 amd64 4.8.2-19ubuntu1 [28.5 kB]
Get:8 http://archive.ubuntu.com/ubuntu/ trusty/main libmpfr4 amd64 3.1.2-1 [203 kB]
Get:9 http://archive.ubuntu.com/ubuntu/ trusty/main libquadmath0 amd64 4.8.2-19ubuntu1 [126 kB]
Get:10 http://archive.ubuntu.com/ubuntu/ trusty/main libtsan0 amd64 4.8.2-19ubuntu1 [94.7 kB]
Get:11 http://archive.ubuntu.com/ubuntu/ trusty/main libpython2.7-minimal amd64 2.7.6-8 [307 kB]
Get:12 http://archive.ubuntu.com/ubuntu/ trusty/main python2.7-minimal amd64 2.7.6-8 [1190 kB]
Get:13 http://archive.ubuntu.com/ubuntu/ trusty/main libmpc3 amd64 1.0.1-1ubuntu1 [38.4 kB]
Get:14 http://archive.ubuntu.com/ubuntu/ trusty/main manpages all 3.54-1ubuntu1 [627 kB]
Get:15 http://archive.ubuntu.com/ubuntu/ trusty/main binutils amd64 2.24-5ubuntu3 [2071 kB]
Get:16 http://archive.ubuntu.com/ubuntu/ trusty/main cpp-4.8 amd64 4.8.2-19ubuntu1 [4439 kB]
Get:17 http://archive.ubuntu.com/ubuntu/ trusty/main cpp amd64 4:4.8.2-1ubuntu6 [27.5 kB]
Get:18 http://archive.ubuntu.com/ubuntu/ trusty/main libgcc-4.8-dev amd64 4.8.2-19ubuntu1 [1688 kB]
Get:19 http://archive.ubuntu.com/ubuntu/ trusty/main gcc-4.8 amd64 4.8.2-19ubuntu1 [5012 kB]
Get:20 http://archive.ubuntu.com/ubuntu/ trusty/main gcc amd64 4:4.8.2-1ubuntu6 [5098 B]
Get:21 http://archive.ubuntu.com/ubuntu/ trusty/main libc-dev-bin amd64 2.19-0ubuntu6 [69.0 kB]
Get:22 http://archive.ubuntu.com/ubuntu/ trusty/main linux-libc-dev amd64 3.13.0-24.46 [781 kB]
Get:23 http://archive.ubuntu.com/ubuntu/ trusty/main libc6-dev amd64 2.19-0ubuntu6 [1911 kB]
Get:24 http://archive.ubuntu.com/ubuntu/ trusty/main libstdc++-4.8-dev amd64 4.8.2-19ubuntu1 [1050 kB]
Get:25 http://archive.ubuntu.com/ubuntu/ trusty/main g++-4.8 amd64 4.8.2-19ubuntu1 [7038 kB]
Get:26 http://archive.ubuntu.com/ubuntu/ trusty/main g++ amd64 4:4.8.2-1ubuntu6 [1490 B]
Get:27 http://archive.ubuntu.com/ubuntu/ trusty/main libpython2.7-stdlib amd64 2.7.6-8 [1872 kB]
Get:28 http://archive.ubuntu.com/ubuntu/ trusty/main libpython-stdlib amd64 2.7.5-5ubuntu3 [7012 B]
Get:29 http://archive.ubuntu.com/ubuntu/ trusty/main make amd64 3.81-8.2ubuntu3 [119 kB]
Get:30 http://archive.ubuntu.com/ubuntu/ trusty/main manpages-dev all 3.54-1ubuntu1 [1820 kB]
Get:31 http://archive.ubuntu.com/ubuntu/ trusty/main python2.7 amd64 2.7.6-8 [197 kB]
Get:32 http://archive.ubuntu.com/ubuntu/ trusty/main python-minimal amd64 2.7.5-5ubuntu3 [27.5 kB]
Get:33 http://archive.ubuntu.com/ubuntu/ trusty/main python amd64 2.7.5-5ubuntu3 [134 kB]
Get:34 http://archive.ubuntu.com/ubuntu/ trusty/main python-apt amd64 0.9.3.5 [141 kB]
Get:35 http://archive.ubuntu.com/ubuntu/ trusty/main python-pycurl amd64 7.19.3-0ubuntu3 [47.9 kB]
Get:36 http://archive.ubuntu.com/ubuntu/ trusty-updates/universe python-software-properties all 0.92.37 [19.9 kB]
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin:
Fetched 31.9 MB in 1min 28s (360 kB/s)
Selecting previously unselected package libasan0:amd64.
(Reading database ... 12882 files and directories currently installed.)
Preparing to unpack .../libasan0_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libasan0:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package libatomic1:amd64.
Preparing to unpack .../libatomic1_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libatomic1:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package libgmp10:amd64.
Preparing to unpack .../libgmp10_2%3a5.1.3+dfsg-1ubuntu1_amd64.deb ...
Unpacking libgmp10:amd64 (2:5.1.3+dfsg-1ubuntu1) ...
Selecting previously unselected package libisl10:amd64.
Preparing to unpack .../libisl10_0.12.2-1_amd64.deb ...
Unpacking libisl10:amd64 (0.12.2-1) ...
Selecting previously unselected package libcloog-isl4:amd64.
Preparing to unpack .../libcloog-isl4_0.18.2-1_amd64.deb ...
Unpacking libcloog-isl4:amd64 (0.18.2-1) ...
Selecting previously unselected package libgomp1:amd64.
Preparing to unpack .../libgomp1_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libgomp1:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package libitm1:amd64.
Preparing to unpack .../libitm1_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libitm1:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package libmpfr4:amd64.
Preparing to unpack .../libmpfr4_3.1.2-1_amd64.deb ...
Unpacking libmpfr4:amd64 (3.1.2-1) ...
Selecting previously unselected package libquadmath0:amd64.
Preparing to unpack .../libquadmath0_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libquadmath0:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package libtsan0:amd64.
Preparing to unpack .../libtsan0_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libtsan0:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package libpython2.7-minimal:amd64.
Preparing to unpack .../libpython2.7-minimal_2.7.6-8_amd64.deb ...
Unpacking libpython2.7-minimal:amd64 (2.7.6-8) ...
Selecting previously unselected package python2.7-minimal.
Preparing to unpack .../python2.7-minimal_2.7.6-8_amd64.deb ...
Unpacking python2.7-minimal (2.7.6-8) ...
Selecting previously unselected package libmpc3:amd64.
Preparing to unpack .../libmpc3_1.0.1-1ubuntu1_amd64.deb ...
Unpacking libmpc3:amd64 (1.0.1-1ubuntu1) ...
Selecting previously unselected package manpages.
Preparing to unpack .../manpages_3.54-1ubuntu1_all.deb ...
Unpacking manpages (3.54-1ubuntu1) ...
Selecting previously unselected package binutils.
Preparing to unpack .../binutils_2.24-5ubuntu3_amd64.deb ...
Unpacking binutils (2.24-5ubuntu3) ...
Selecting previously unselected package cpp-4.8.
Preparing to unpack .../cpp-4.8_4.8.2-19ubuntu1_amd64.deb ...
Unpacking cpp-4.8 (4.8.2-19ubuntu1) ...
Selecting previously unselected package cpp.
Preparing to unpack .../cpp_4%3a4.8.2-1ubuntu6_amd64.deb ...
Unpacking cpp (4:4.8.2-1ubuntu6) ...
Selecting previously unselected package libgcc-4.8-dev:amd64.
Preparing to unpack .../libgcc-4.8-dev_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libgcc-4.8-dev:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package gcc-4.8.
Preparing to unpack .../gcc-4.8_4.8.2-19ubuntu1_amd64.deb ...
Unpacking gcc-4.8 (4.8.2-19ubuntu1) ...
Selecting previously unselected package gcc.
Preparing to unpack .../gcc_4%3a4.8.2-1ubuntu6_amd64.deb ...
Unpacking gcc (4:4.8.2-1ubuntu6) ...
Selecting previously unselected package libc-dev-bin.
Preparing to unpack .../libc-dev-bin_2.19-0ubuntu6_amd64.deb ...
Unpacking libc-dev-bin (2.19-0ubuntu6) ...
Selecting previously unselected package linux-libc-dev:amd64.
Preparing to unpack .../linux-libc-dev_3.13.0-24.46_amd64.deb ...
Unpacking linux-libc-dev:amd64 (3.13.0-24.46) ...
Selecting previously unselected package libc6-dev:amd64.
Preparing to unpack .../libc6-dev_2.19-0ubuntu6_amd64.deb ...
Unpacking libc6-dev:amd64 (2.19-0ubuntu6) ...
Selecting previously unselected package libstdc++-4.8-dev:amd64.
Preparing to unpack .../libstdc++-4.8-dev_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libstdc++-4.8-dev:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package g++-4.8.
Preparing to unpack .../g++-4.8_4.8.2-19ubuntu1_amd64.deb ...
Unpacking g++-4.8 (4.8.2-19ubuntu1) ...
Selecting previously unselected package g++.
Preparing to unpack .../g++_4%3a4.8.2-1ubuntu6_amd64.deb ...
Unpacking g++ (4:4.8.2-1ubuntu6) ...
Selecting previously unselected package libpython2.7-stdlib:amd64.
Preparing to unpack .../libpython2.7-stdlib_2.7.6-8_amd64.deb ...
Unpacking libpython2.7-stdlib:amd64 (2.7.6-8) ...
Selecting previously unselected package libpython-stdlib:amd64.
Preparing to unpack .../libpython-stdlib_2.7.5-5ubuntu3_amd64.deb ...
Unpacking libpython-stdlib:amd64 (2.7.5-5ubuntu3) ...
Selecting previously unselected package make.
Preparing to unpack .../make_3.81-8.2ubuntu3_amd64.deb ...
Unpacking make (3.81-8.2ubuntu3) ...
Selecting previously unselected package manpages-dev.
Preparing to unpack .../manpages-dev_3.54-1ubuntu1_all.deb ...
Unpacking manpages-dev (3.54-1ubuntu1) ...
Selecting previously unselected package python2.7.
Preparing to unpack .../python2.7_2.7.6-8_amd64.deb ...
Unpacking python2.7 (2.7.6-8) ...
Selecting previously unselected package python-minimal.
Preparing to unpack .../python-minimal_2.7.5-5ubuntu3_amd64.deb ...
Unpacking python-minimal (2.7.5-5ubuntu3) ...
Selecting previously unselected package python.
Preparing to unpack .../python_2.7.5-5ubuntu3_amd64.deb ...
Unpacking python (2.7.5-5ubuntu3) ...
Selecting previously unselected package python-apt.
Preparing to unpack .../python-apt_0.9.3.5_amd64.deb ...
Unpacking python-apt (0.9.3.5) ...
Selecting previously unselected package python-pycurl.
Preparing to unpack .../python-pycurl_7.19.3-0ubuntu3_amd64.deb ...
Unpacking python-pycurl (7.19.3-0ubuntu3) ...
Selecting previously unselected package python-software-properties.
Preparing to unpack .../python-software-properties_0.92.37_all.deb ...
Unpacking python-software-properties (0.92.37) ...
Processing triggers for mime-support (3.54ubuntu1) ...
Setting up libasan0:amd64 (4.8.2-19ubuntu1) ...
Setting up libatomic1:amd64 (4.8.2-19ubuntu1) ...
Setting up libgmp10:amd64 (2:5.1.3+dfsg-1ubuntu1) ...
Setting up libisl10:amd64 (0.12.2-1) ...
Setting up libcloog-isl4:amd64 (0.18.2-1) ...
Setting up libgomp1:amd64 (4.8.2-19ubuntu1) ...
Setting up libitm1:amd64 (4.8.2-19ubuntu1) ...
Setting up libmpfr4:amd64 (3.1.2-1) ...
Setting up libquadmath0:amd64 (4.8.2-19ubuntu1) ...
Setting up libtsan0:amd64 (4.8.2-19ubuntu1) ...
Setting up libpython2.7-minimal:amd64 (2.7.6-8) ...
Setting up python2.7-minimal (2.7.6-8) ...
Linking and byte-compiling packages for runtime python2.7...
Setting up libmpc3:amd64 (1.0.1-1ubuntu1) ...
Setting up manpages (3.54-1ubuntu1) ...
Setting up binutils (2.24-5ubuntu3) ...
Setting up cpp-4.8 (4.8.2-19ubuntu1) ...
Setting up cpp (4:4.8.2-1ubuntu6) ...
Setting up libgcc-4.8-dev:amd64 (4.8.2-19ubuntu1) ...
Setting up gcc-4.8 (4.8.2-19ubuntu1) ...
Setting up gcc (4:4.8.2-1ubuntu6) ...
Setting up libc-dev-bin (2.19-0ubuntu6) ...
Setting up linux-libc-dev:amd64 (3.13.0-24.46) ...
Setting up libc6-dev:amd64 (2.19-0ubuntu6) ...
Setting up libstdc++-4.8-dev:amd64 (4.8.2-19ubuntu1) ...
Setting up g++-4.8 (4.8.2-19ubuntu1) ...
Setting up g++ (4:4.8.2-1ubuntu6) ...
update-alternatives: using /usr/bin/g++ to provide /usr/bin/c++ (c++) in auto mode
Setting up libpython2.7-stdlib:amd64 (2.7.6-8) ...
Setting up libpython-stdlib:amd64 (2.7.5-5ubuntu3) ...
Setting up make (3.81-8.2ubuntu3) ...
Setting up manpages-dev (3.54-1ubuntu1) ...
Setting up python2.7 (2.7.6-8) ...
Setting up python-minimal (2.7.5-5ubuntu3) ...
Setting up python (2.7.5-5ubuntu3) ...
Setting up python-apt (0.9.3.5) ...
Setting up python-pycurl (7.19.3-0ubuntu3) ...
Setting up python-software-properties (0.92.37) ...
Processing triggers for libc-bin (2.19-0ubuntu6) ...
 ---> ee6497211169
Step 5 : RUN add-apt-repository -y ppa:chris-lea/node.js
 ---> Running in 992024e4ecb7
gpg: keyring `/tmp/tmpx451mo8x/secring.gpg' created
gpg: keyring `/tmp/tmpx451mo8x/pubring.gpg' created
gpg: requesting key C7917B12 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpx451mo8x/trustdb.gpg: trustdb created
gpg: key C7917B12: public key "Launchpad chrislea" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK
 ---> 896920ec873f
Step 6 : RUN apt-get update
 ---> Running in 76d83305f6ef
Ign http://ppa.launchpad.net trusty InRelease
Get:1 http://ppa.launchpad.net trusty Release.gpg [316 B]
Ign http://archive.ubuntu.com trusty InRelease
Get:2 http://ppa.launchpad.net trusty Release [14.0 kB]
Ign http://archive.ubuntu.com trusty-updates InRelease
Get:3 http://ppa.launchpad.net trusty/main amd64 Packages [1124 B]
Ign http://archive.ubuntu.com trusty-security InRelease
Ign http://archive.ubuntu.com precise InRelease
Hit http://archive.ubuntu.com trusty Release.gpg
Hit http://archive.ubuntu.com trusty-updates Release.gpg
Hit http://archive.ubuntu.com trusty-security Release.gpg
Hit http://archive.ubuntu.com precise Release.gpg
Hit http://archive.ubuntu.com trusty Release
Hit http://archive.ubuntu.com trusty-updates Release
Hit http://archive.ubuntu.com trusty-security Release
Hit http://archive.ubuntu.com precise Release
Hit http://archive.ubuntu.com trusty/main Sources
Hit http://archive.ubuntu.com trusty/restricted Sources
Hit http://archive.ubuntu.com trusty/universe Sources
Hit http://archive.ubuntu.com trusty/main amd64 Packages
Hit http://archive.ubuntu.com trusty/restricted amd64 Packages
Hit http://archive.ubuntu.com trusty/universe amd64 Packages
Hit http://archive.ubuntu.com trusty-updates/main Sources
Hit http://archive.ubuntu.com trusty-updates/restricted Sources
Hit http://archive.ubuntu.com trusty-updates/universe Sources
Hit http://archive.ubuntu.com trusty-updates/main amd64 Packages
Hit http://archive.ubuntu.com trusty-updates/restricted amd64 Packages
Hit http://archive.ubuntu.com trusty-updates/universe amd64 Packages
Hit http://archive.ubuntu.com trusty-security/main Sources
Hit http://archive.ubuntu.com trusty-security/restricted Sources
Hit http://archive.ubuntu.com trusty-security/universe Sources
Hit http://archive.ubuntu.com trusty-security/main amd64 Packages
Hit http://archive.ubuntu.com trusty-security/restricted amd64 Packages
Hit http://archive.ubuntu.com trusty-security/universe amd64 Packages
Hit http://archive.ubuntu.com precise/universe amd64 Packages
Fetched 15.5 kB in 9s (1588 B/s)
Reading package lists...
 ---> ca2d62f31a28
Step 7 : RUN apt-get install -y nodejs
 ---> Running in 4381cc118804
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  rlwrap
The following NEW packages will be installed:
  nodejs rlwrap
0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded.
Need to get 4306 kB of archives.
After this operation, 17.1 MB of additional disk space will be used.
Get:1 http://ppa.launchpad.net/chris-lea/node.js/ubuntu/ trusty/main nodejs amd64 0.10.26-1chl1~trusty1 [4233 kB]
Get:2 http://archive.ubuntu.com/ubuntu/ trusty/universe rlwrap amd64 0.37-5 [73.4 kB]
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin:
Fetched 4306 kB in 12s (349 kB/s)
Selecting previously unselected package rlwrap.
(Reading database ... 18375 files and directories currently installed.)
Preparing to unpack .../rlwrap_0.37-5_amd64.deb ...
Unpacking rlwrap (0.37-5) ...
Selecting previously unselected package nodejs.
Preparing to unpack .../nodejs_0.10.26-1chl1~trusty1_amd64.deb ...
Unpacking nodejs (0.10.26-1chl1~trusty1) ...
Setting up rlwrap (0.37-5) ...
update-alternatives: using /usr/bin/rlwrap to provide /usr/bin/readline-editor (readline-editor) in auto mode
Setting up nodejs (0.10.26-1chl1~trusty1) ...
 ---> 94e5059b3d9a
Step 8 : ADD . /pacemaker-node-app
 ---> 0b0c6a4bcda7
Step 9 : WORKDIR /pacemaker-node-app
 ---> Running in a764c80a856d
 ---> 152d43985683
Step 10 : RUN npm rebuild
 ---> Running in abad5fb8dfa7
 ---> 0555f9dccd5b
Step 11 : EXPOSE 8080
 ---> Running in 5996ad8e0d7f
 ---> 86a3360958bf
Step 12 : CMD node app
 ---> Running in 58d8cee2b357
 ---> 89c87becafe7
Successfully built 89c87becafe7
Removing intermediate container adfae8b10a00
Removing intermediate container 992024e4ecb7
Removing intermediate container 76d83305f6ef
Removing intermediate container a764c80a856d
Removing intermediate container 092c66d960f7
Removing intermediate container 07e1ff30fda5
Removing intermediate container 05e4fdf07c26
Removing intermediate container 4381cc118804
Removing intermediate container 86013f6bd068
Removing intermediate container abad5fb8dfa7
Removing intermediate container 5996ad8e0d7f
Removing intermediate container 58d8cee2b357

Exercises

This is an archive of the pacemaker-node application so far:

Exercise 1: Cloudbees Deployment

The Cloudbees service support java and node.js applications:

The easiest route to node.js deployment is most likely via the click start projects:

Exercise 2: Digital Ocean Deployment

Digital Ocean supports a range of application types:

In particular, Docker and Vagrant :

Try to deploy pacemaker-node to this service.