1
0
mirror of https://github.com/yldio/copilot.git synced 2024-12-27 04:10:05 +02:00
copilot/packages/portal-api/lib/index.js

101 lines
2.2 KiB
JavaScript
Raw Normal View History

2017-04-28 00:59:03 +03:00
'use strict';
2017-05-27 19:35:38 +03:00
const Schema = require('joyent-cp-gql-schema');
2017-05-23 03:13:15 +03:00
const Graphi = require('graphi');
const Piloted = require('piloted');
const Data = require('./data');
2017-04-28 00:59:03 +03:00
const Pack = require('../package.json');
2017-05-27 19:35:38 +03:00
const Resolvers = require('./resolvers');
const ContainerPilotWatcher = require('./watch/container-pilot');
const MachinesWatcher = require('./watch/machines');
2017-04-28 00:59:03 +03:00
const {
NAMESPACE
} = process.env;
const namespace = NAMESPACE ?
`/${NAMESPACE}` :
'';
2017-04-28 00:59:03 +03:00
const internals = {};
2017-04-28 00:59:03 +03:00
module.exports = function (server, options, next) {
try {
const docker = Piloted.service('docker-compose-api');
if (docker) {
options.data.dockerComposeHost = `tcp://${docker.address}:${docker.port}`;
}
} catch (ex) {
console.error(ex);
}
2017-07-31 23:10:04 +03:00
options.watch.server = server;
options.data.server = server;
const data = new Data(options.data);
const cpWatcher = new ContainerPilotWatcher(Object.assign(options.watch, { data }));
const machinesWatcher = new MachinesWatcher(Object.assign(options.watch, {
data
}));
// watcher <-> watcher
// portal depends on watcher and vice-versa
// I'm sure there is a better way to organize this domains
// but this works for now
data.setMachinesWatcher(machinesWatcher);
cpWatcher.on('error', (err) => {
server.log(['error'], err);
});
data.on('error', (err) => {
server.log(['error'], err);
});
2017-05-02 01:28:03 +03:00
data.connect((err) => {
if (err) {
return next(err);
}
2017-04-28 00:59:03 +03:00
server.bind(data);
2017-05-02 01:28:03 +03:00
Piloted.on('refresh', internals.refresh(data));
machinesWatcher.poll();
cpWatcher.poll();
2017-05-02 01:28:03 +03:00
server.register([
{
2017-05-23 03:13:15 +03:00
register: Graphi,
2017-05-27 19:35:38 +03:00
options: {
graphqlPath: `${namespace}/graphql`,
graphiqlPath: `${namespace}/graphiql`,
2017-05-27 19:35:38 +03:00
schema: Schema,
resolvers: Resolvers(data)
}
2017-04-28 00:59:03 +03:00
}
2017-05-02 01:28:03 +03:00
]);
next();
});
2017-04-28 00:59:03 +03:00
};
module.exports.attributes = {
name: Pack.name,
version: Pack.version,
once: true,
multiple: false
};
internals.refresh = function (data) {
return () => {
const docker = Piloted.service('docker-compose-api');
if (!docker) {
return;
}
data.reconnectCompose(`tcp://${docker.address}:${docker.port}`);
};
2017-06-21 22:12:57 +03:00
};