feat(portal-data): support manifest provision flow

This commit is contained in:
geek 2017-06-01 16:25:45 -05:00 committed by Sérgio Ramos
parent 7445a9a3e5
commit caee178ad8
8 changed files with 283 additions and 210 deletions

View File

@ -1,8 +1,8 @@
'use strict';
const EventEmitter = require('events');
const Hoek = require('hoek');
const Penseur = require('penseur');
const DCClient = require('docker-compose-client');
const VAsync = require('vasync');
const Transform = require('./transform');
@ -27,13 +27,13 @@ const internals = {
}
};
module.exports = class Data {
module.exports = class Data extends EventEmitter {
constructor (options) {
super();
const settings = Hoek.applyToDefaults(options || {}, internals.defaults);
// Penseur will assert that the options are correct
this._db = new Penseur.Db(settings.name, settings.db);
this._docker = new DCClient(settings.dockerHost);
}
connect (cb) {
@ -176,32 +176,33 @@ module.exports = class Data {
// versions
createVersion (clientVersion, cb) {
Hoek.assert(clientVersion && clientVersion.manifestId, 'manifestId is required');
Hoek.assert(clientVersion, 'version is required');
Hoek.assert(clientVersion.manifestId, 'manifestId is required');
Hoek.assert(clientVersion.deploymentGroupId, 'deploymentGroupId is required');
// go get the manifest to find the deployment group id so we can update it
this.getManifest({ id: clientVersion.manifestId }, (err, manifest) => {
const version = Transform.toVersion(clientVersion);
this._db.versions.insert(version, (err, key) => {
if (err) {
return cb(err);
}
if (!manifest) {
return cb(new Error('manifest not found for version'));
const changes = {
id: clientVersion.deploymentGroupId,
version_id: key,
history_version_ids: this._db.append(key)
};
if (clientVersion.serviceIds) {
changes['service_ids'] = clientVersion.serviceIds;
}
const version = Transform.toVersion(clientVersion);
this._db.versions.insert(version, (err, key) => {
this._db.deployment_groups.update([changes], (err) => {
if (err) {
return cb(err);
}
this._db.deployment_groups.update(manifest.deploymentGroupId, { history_version_ids: this._db.append(key) }, (err) => {
if (err) {
return cb(err);
}
version.id = key;
cb(null, Transform.fromVersion(version));
});
version.id = key;
cb(null, Transform.fromVersion(version));
});
});
}
@ -227,16 +228,19 @@ module.exports = class Data {
cb(null, versions.map(Transform.fromVersion));
};
if (manifestId) {
return this._db.versions.query({ manifest_id: manifestId }, finish);
}
this.getDeploymentGroup({ id: deploymentGroupId }, (err, deploymentGroup) => {
if (err) {
return finish(err);
// ensure the data is in sync
this._db.versions.sync(() => {
if (manifestId) {
return this._db.versions.query({ manifest_id: manifestId }, finish);
}
this._db.versions.get(deploymentGroup.history, finish);
this.getDeploymentGroup({ id: deploymentGroupId }, (err, deploymentGroup) => {
if (err) {
return finish(err);
}
this._db.versions.get(deploymentGroup.history, finish);
});
});
}
@ -244,16 +248,32 @@ module.exports = class Data {
// manifests
provisionManifest (clientManifest, cb) {
this._db.manifests.insert(Transform.toManifest(clientManifest), (err, key) => {
// insert manifest
// callback with manifest
// provision services
const manifest = Transform.toManifest(clientManifest);
this._db.manifests.insert(manifest, (err, key) => {
if (err) {
return cb(err);
}
this.getManifest({ id: key }, cb);
setImmediate(() => {
const options = {
manifestServices: manifest.json.services || manifest.json,
deploymentGroupId: clientManifest.deploymentGroupId,
manifestId: key
};
this.provisionServices(options);
});
manifest.id = key;
cb(null, Transform.fromManifest(manifest));
});
}
getManifest ({ id }, cb) {
console.log(id);
this._db.manifests.single({ id }, (err, manifest) => {
if (err) {
return cb(err);
@ -278,23 +298,128 @@ module.exports = class Data {
// services
provisionServices ({ manifestServices, deploymentGroupId, manifestId }, cb) {
// call to docker and create containers
// insert instance information
// insert service information
// insert version information -- will update deploymentGroups
cb = cb || ((err) => {
if (err) {
this.emit('error', err);
}
});
// TODO: call out to docker for each service and provision a new instance
VAsync.forEachPipeline({
func: (serviceName, next) => {
const manifestService = manifestServices[serviceName];
const clientInstance = {
name: serviceName,
machineId: 'unknown',
status: 'CREATED'
};
this.createInstance(clientInstance, (err, createdInstance) => {
if (err) {
return next(err);
}
const clientService = {
hash: manifestService.image,
name: serviceName,
slug: serviceName,
deploymentGroupId,
instances: [createdInstance]
};
this.createService(clientService, (err, createdService) => {
if (err) {
return next(err);
}
return next(null, {
action: {
type: 'CREATE',
service: serviceName,
machines: [createdInstance.machineId]
},
serviceId: createdService.id,
scale: {
serviceName,
replicas: 1
}
});
});
});
},
inputs: Object.keys(manifestServices)
}, (err, results) => {
if (err) {
return cb(err);
}
const successes = results.successes;
if (!successes || !successes.length) {
return cb();
}
const scales = successes.map((result) => {
return result.scale;
});
const actions = successes.map((result) => {
return result.action;
});
const serviceIds = successes.map((result) => {
return result.serviceId;
});
const plan = {
running: true,
actions
};
const clientVersion = {
deploymentGroupId,
manifestId,
scales,
plan,
serviceIds
};
this.createVersion(clientVersion, (err) => {
if (err) {
return cb(err);
}
cb();
});
});
}
createService (clientService, cb) {
this._db.services.insert(Transform.toService(clientService), (err, key) => {
if (err) {
return cb(err);
}
this.getService({ id: key }, cb);
clientService.id = key;
cb(null, clientService);
});
}
getService ({ id, hash }, cb) {
const query = id ? { id } : { version_hash: hash };
this._db.services.single(query, (err, service) => {
this._db.services.query(query, (err, service) => {
if (err) {
return cb(err);
}
if (!service) {
return cb(null, null);
}
VAsync.parallel({
funcs: [
(next) => {

View File

@ -1,5 +1,7 @@
'use strict';
const Yamljs = require('yamljs');
exports.fromPortal = function ({ portal, datacenter, deploymentGroups }) {
deploymentGroups = Array.isArray(deploymentGroups) ? deploymentGroups : [];
@ -22,6 +24,7 @@ exports.toPortal = function (clientPortal) {
};
};
exports.fromDeploymentGroup = function (deploymentGroup, services) {
if (!Array.isArray(services)) {
services = [];
@ -52,6 +55,7 @@ exports.fromService = function ({ service, instances, packages }) {
return {
id: service.id,
hash: service.version_hash,
deploymentGroupId: service.deployment_group_id,
name: service.name,
slug: service.slug,
environment: service.environment || [],
@ -66,10 +70,11 @@ exports.fromService = function ({ service, instances, packages }) {
exports.toService = function (clientService) {
return {
version_hash: clientService.hash || '',
deployment_group_id: clientService.deploymentGroupId,
name: clientService.name,
slug: clientService.slub || '',
slug: clientService.slug || '',
environment: clientService.environment || {},
instance_ids: clientService.intances ? clientService.instances.map((instance) => { return instance.id; }) : [],
instance_ids: clientService.instances ? clientService.instances.map((instance) => { return instance.id; }) : [],
service_dependency_ids: clientService.connections || [],
package_id: clientService.package ? clientService.package.id : '',
parent_id: clientService.parent || ''
@ -136,7 +141,7 @@ exports.toManifest = function (clientManifest) {
type: clientManifest.type,
format: clientManifest.format,
raw: clientManifest.raw,
json: clientManifest.json
json: clientManifest.json || Yamljs.parse(clientManifest.raw)
};
};

View File

@ -16,15 +16,14 @@
"author": "wyatt",
"license": "MPL-2.0",
"dependencies": {
"docker-compose-client": "^1.0.3",
"hoek": "^4.1.1",
"penseur": "^7.8.1",
"vasync": "^1.6.4"
"vasync": "^1.6.4",
"yamljs": "^0.2.10"
},
"devDependencies": {
"belly-button": "^3.1.0",
"code": "^4.0.0",
"lab": "^13.0.4",
"zerorpc": "^0.9.7"
"lab": "^13.0.4"
}
}

View File

@ -0,0 +1,24 @@
version: '2.1'
services:
# Service definition for Consul cluster with a minimum of 3 nodes.
# Nodes will use Triton CNS for the service (passed in via the CONSUL
# env var) to find each other and bootstrap the cluster.
consul:
image: autopilotpattern/consul:${TAG:-latest}
labels:
- triton.cns.services=consul
restart: always
mem_limit: 128m
ports:
- 8500
env_file:
- _env
network_mode: bridge
command: >
/usr/local/bin/containerpilot
/bin/consul agent -server
-bootstrap-expect 3
-config-dir=/etc/consul
-ui-dir /ui

View File

@ -1,15 +1,19 @@
'use strict';
const { expect } = require('code');
const Fs = require('fs');
const Path = require('path');
const Code = require('code');
const Lab = require('lab');
const PortalData = require('../');
const lab = (exports.lab = Lab.script());
const lab = exports.lab = Lab.script();
const it = lab.it;
const describe = lab.describe;
const expect = Code.expect;
const internals = {
options: { name: 'test', db: { test: true } }
options: { name: 'test', db: { test: true } },
composeFile: Fs.readFileSync(Path.join(__dirname, 'docker-compose.yml')).toString()
};
describe('connect()', () => {
@ -245,14 +249,14 @@ describe('versions', () => {
deploymentGroupId: deploymentGroup.id,
type: 'compose',
format: 'yml',
raw: 'docker compose raw contents',
json: { services: [] }
raw: internals.composeFile
};
data.provisionManifest(clientManifest, (err, manifest) => {
expect(err).to.not.exist();
const clientVersion = {
deploymentGroupId: deploymentGroup.id,
manifestId: manifest.id,
scales: [{
serviceName: 'consul',
@ -291,8 +295,7 @@ describe('versions', () => {
deploymentGroupId: deploymentGroup.id,
type: 'compose',
format: 'yml',
raw: 'docker compose raw contents',
json: { services: [] }
raw: internals.composeFile
};
data.provisionManifest(clientManifest, (err, manifest) => {
@ -300,6 +303,7 @@ describe('versions', () => {
const clientVersion = {
manifestId: manifest.id,
deploymentGroupId: deploymentGroup.id,
scales: [{
serviceName: 'consul',
replicas: 3
@ -345,8 +349,7 @@ describe('versions', () => {
deploymentGroupId: deploymentGroup.id,
type: 'compose',
format: 'yml',
raw: 'docker compose raw contents',
json: { services: [] }
raw: internals.composeFile
};
data.provisionManifest(clientManifest, (err, manifest) => {
@ -354,6 +357,7 @@ describe('versions', () => {
const clientVersion = {
manifestId: manifest.id,
deploymentGroupId: deploymentGroup.id,
scales: [{
serviceName: 'consul',
replicas: 3
@ -374,7 +378,7 @@ describe('versions', () => {
expect(result.scales).to.equal(clientVersion.scales);
data.getVersions({ manifestId: clientVersion.manifestId }, (err, versions) => {
expect(err).to.not.exist();
expect(versions.length).to.equal(1);
expect(versions.length).to.equal(2);
done();
});
});
@ -393,8 +397,7 @@ describe('versions', () => {
deploymentGroupId: deploymentGroup.id,
type: 'compose',
format: 'yml',
raw: 'docker compose raw contents',
json: { services: [] }
raw: internals.composeFile
};
data.provisionManifest(clientManifest, (err, manifest) => {
@ -402,6 +405,7 @@ describe('versions', () => {
const clientVersion = {
manifestId: manifest.id,
deploymentGroupId: deploymentGroup.id,
scales: [{
serviceName: 'consul',
replicas: 3
@ -446,10 +450,8 @@ describe('manifests', () => {
deploymentGroupId: deploymentGroup.id,
type: 'compose',
format: 'yml',
raw: 'docker compose raw contents',
json: { services: [] }
raw: internals.composeFile
};
data.provisionManifest(clientManifest, (err, result) => {
expect(err).to.not.exist();
expect(result.id).to.exist();
@ -464,6 +466,10 @@ describe('manifests', () => {
describe('getManifests()', () => {
it('retrieves manifests using from a manifest type', (done) => {
const data = new PortalData(internals.options);
data.on('error', (err) => {
expect(err).to.not.exist();
});
data.connect((err) => {
expect(err).to.not.exist();
data.createDeploymentGroup({ name: 'something' }, (err, deploymentGroup) => {
@ -472,10 +478,8 @@ describe('manifests', () => {
deploymentGroupId: deploymentGroup.id,
type: 'compose',
format: 'yml',
raw: 'docker compose raw contents',
json: { services: [] }
raw: internals.composeFile
};
data.provisionManifest(clientManifest, (err, result) => {
expect(err).to.not.exist();
data.getManifests({ type: clientManifest.type }, (err, manifests) => {
@ -540,7 +544,7 @@ describe('instances', () => {
});
});
describe('geInstance()', () => {
describe('getInstance()', () => {
it('retrieves an instance record from the instances table', (done) => {
const data = new PortalData(internals.options);
data.connect((err) => {

View File

@ -97,10 +97,6 @@ belly-button@^3.1.0:
glob "7.x.x"
insync "2.x.x"
bindings@~1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11"
"bluebird@>= 2.3.2 < 3":
version "2.11.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
@ -741,24 +737,10 @@ ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
msgpack@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/msgpack/-/msgpack-1.0.2.tgz#923e2c5cffa65c8418e9b228d1124793969c429c"
dependencies:
nan "^2.0.9"
mute-stream@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
nan@^2.0.9:
version "2.6.2"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
nan@~2.3.0:
version "2.3.5"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.3.5.tgz#822a0dc266290ce4cd3a12282ca3e7e364668a08"
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@ -1077,10 +1059,6 @@ uglify-to-browserify@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
underscore@1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.3.3.tgz#47ac53683daf832bfa952e1774417da47817ae42"
user-home@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
@ -1091,10 +1069,6 @@ util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
uuid@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
vasync@^1.6.4:
version "1.6.4"
resolved "https://registry.yarnpkg.com/vasync/-/vasync-1.6.4.tgz#dfe93616ad0e7ae801b332a9d88bfc5cdc8e1d1f"
@ -1137,6 +1111,13 @@ xtend@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
yamljs@^0.2.10:
version "0.2.10"
resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.2.10.tgz#481cc7c25ca73af59f591f0c96e3ce56c757a40f"
dependencies:
argparse "^1.0.7"
glob "^7.0.5"
yargs@~3.10.0:
version "3.10.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
@ -1145,19 +1126,3 @@ yargs@~3.10.0:
cliui "^2.1.0"
decamelize "^1.0.0"
window-size "0.1.0"
zerorpc@^0.9.7:
version "0.9.7"
resolved "https://registry.yarnpkg.com/zerorpc/-/zerorpc-0.9.7.tgz#64ddb32ce8c934bea5434ec81ca22e971045a860"
dependencies:
msgpack "1.0.2"
underscore "1.3.3"
uuid "^3.0.0"
zmq "2.x"
zmq@2.x:
version "2.15.3"
resolved "https://registry.yarnpkg.com/zmq/-/zmq-2.15.3.tgz#66c6de82cc36b09734b820703776490a6fbbe624"
dependencies:
bindings "~1.2.1"
nan "~2.3.0"

View File

@ -74,6 +74,10 @@ align-text@^0.1.1, align-text@^0.1.3:
longest "^1.0.1"
repeat-string "^1.5.2"
all-object-keys@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/all-object-keys/-/all-object-keys-1.1.0.tgz#d83122195c62cf440fc3ccd4b4b49aa2ab7b8703"
amdefine@>=0.0.4:
version "1.0.1"
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
@ -1173,6 +1177,10 @@ currently-unhandled@^0.4.1:
dependencies:
array-find-index "^1.0.1"
currify@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/currify/-/currify-2.0.4.tgz#0c36aad8094355fa41428dbc4e322b1bd5e1b9c3"
d@1:
version "1.0.0"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
@ -1684,6 +1692,10 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
mkdirp ">=0.5 0"
rimraf "2"
fullstore@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fullstore/-/fullstore-1.0.0.tgz#ed222f47691110796b853bb290b9091cc7bea0ec"
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
@ -2261,6 +2273,10 @@ istanbul-reports@^1.1.0:
dependencies:
handlebars "^4.0.3"
jessy@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/jessy/-/jessy-2.0.1.tgz#2114b42a51caa40dd48caa8689cc8ffca25abe47"
jest-diff@19.0.0, jest-diff@^19.0.0:
version "19.0.0"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-19.0.0.tgz#d1563cfc56c8b60232988fbc05d4d16ed90f063c"
@ -2565,6 +2581,10 @@ map-obj@^1.0.0, map-obj@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
mapsome@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/mapsome/-/mapsome-1.0.0.tgz#70bf732b3eeab66aee7042158202885a17625c41"
matcher@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/matcher/-/matcher-0.1.2.tgz#ef20cbde64c24c50cc61af5b83ee0b1b8ff00101"
@ -3221,6 +3241,12 @@ readdirp@^2.0.0:
readable-stream "^2.0.2"
set-immediate-shim "^1.0.1"
readjson@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/readjson/-/readjson-1.1.3.tgz#cb4c691551c6e4fee667f51c29cce2f5cea4593c"
dependencies:
try-catch "~1.0.0"
readline2@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
@ -3242,6 +3268,21 @@ redent@^1.0.0:
indent-string "^2.1.0"
strip-indent "^1.0.1"
redrun@^5.9.14:
version "5.9.14"
resolved "https://registry.yarnpkg.com/redrun/-/redrun-5.9.14.tgz#320d773f9084bab69fc423f19a942be9e020f035"
dependencies:
all-object-keys "^1.0.0"
currify "^2.0.0"
debug "^2.2.0"
fullstore "^1.0.0"
jessy "^2.0.0"
mapsome "^1.0.0"
readjson "^1.1.3"
squad "^1.1.3"
try-catch "^1.0.0"
yargs-parser "^7.0.0"
regenerate@^1.2.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
@ -3557,6 +3598,10 @@ sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
squad@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/squad/-/squad-1.1.3.tgz#da09f68d1e0b0a60dca172878fe1f3c9e5272401"
sshpk@^1.7.0:
version "1.13.0"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c"
@ -3805,6 +3850,10 @@ trim-right@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
try-catch@^1.0.0, try-catch@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/try-catch/-/try-catch-1.0.0.tgz#3797dab39a266775f4d0da5cbf42aca3f03608e6"
tryit@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"

126
yarn.lock
View File

@ -9,11 +9,7 @@ JSONStream@^1.0.4:
jsonparse "^1.2.0"
through ">=2.2.7 <3"
abbrev@1, abbrev@^1.0.7:
version "1.1.0"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
abbrev@~1.0.9:
abbrev@1, abbrev@^1.0.7, abbrev@~1.0.9:
version "1.0.9"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
@ -39,7 +35,7 @@ ajv-keywords@^1.0.0:
version "1.5.1"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
ajv@^4.7.0, ajv@^4.9.1:
ajv@^4.7.0:
version "4.11.8"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
dependencies:
@ -72,14 +68,14 @@ ansi-escapes@^1.1.0, ansi-escapes@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
ansi-regex@*, ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
ansi-regex@^0.2.0, ansi-regex@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9"
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
ansi-styles@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de"
@ -558,10 +554,6 @@ caseless@~0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
ccount@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.1.tgz#665687945168c218ec77ff61a4155ae00227a96c"
@ -1085,7 +1077,7 @@ debug@^2.1.1, debug@^2.2.0:
dependencies:
ms "2.0.0"
debuglog@*, debuglog@^1.0.1:
debuglog@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
@ -1618,14 +1610,6 @@ form-data@~2.0.0:
combined-stream "^1.0.5"
mime-types "^2.1.11"
form-data@~2.1.1:
version "2.1.4"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.5"
mime-types "^2.1.12"
franc@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/franc/-/franc-2.0.0.tgz#d9939eded4b486acf4b9f33591fe8e69e5464616"
@ -1928,10 +1912,6 @@ handlebars@^4.0.2:
optionalDependencies:
uglify-js "^2.6"
har-schema@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
har-validator@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
@ -1941,13 +1921,6 @@ har-validator@~2.0.6:
is-my-json-valid "^2.12.4"
pinkie-promise "^2.0.0"
har-validator@~4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
dependencies:
ajv "^4.9.1"
har-schema "^1.0.5"
has-ansi@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e"
@ -1997,11 +1970,7 @@ hoek@2.x.x:
version "2.16.3"
resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
hosted-git-info@^2.1.4, hosted-git-info@^2.1.5:
version "2.4.2"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67"
hosted-git-info@~2.1.5:
hosted-git-info@^2.1.4, hosted-git-info@^2.1.5, hosted-git-info@~2.1.5:
version "2.1.5"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b"
@ -2034,7 +2003,7 @@ ignore@^3.2.0:
version "3.3.3"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d"
imurmurhash@*, imurmurhash@^0.1.4:
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
@ -2580,10 +2549,6 @@ lockfile@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79"
lodash._baseindexof@*:
version "3.1.0"
resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c"
lodash._baseuniq@~4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8"
@ -2591,28 +2556,10 @@ lodash._baseuniq@~4.6.0:
lodash._createset "~4.0.0"
lodash._root "~3.0.0"
lodash._bindcallback@*:
version "3.0.1"
resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
lodash._cacheindexof@*:
version "3.0.2"
resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92"
lodash._createcache@*:
version "3.1.2"
resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093"
dependencies:
lodash._getnative "^3.0.0"
lodash._createset@~4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26"
lodash._getnative@*, lodash._getnative@^3.0.0:
version "3.9.1"
resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
lodash._reinterpolate@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
@ -2689,10 +2636,6 @@ lodash.mergewith@^4.3.1:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55"
lodash.restparam@*:
version "3.6.1"
resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
lodash.sortby@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
@ -2835,7 +2778,7 @@ mime-db@~1.27.0:
version "1.27.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.7:
mime-types@^2.1.11, mime-types@~2.1.7:
version "2.1.15"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
dependencies:
@ -3435,10 +3378,6 @@ per-env@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/per-env/-/per-env-1.0.2.tgz#74e5f1a2c401b72cefe7fd872b3f3f6b79c04bb1"
performance-now@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
pify@^2.0.0, pify@^2.2.0, pify@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@ -3550,10 +3489,6 @@ qs@~6.2.0:
version "6.2.3"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe"
qs@~6.4.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
quality-docs@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/quality-docs/-/quality-docs-3.3.0.tgz#cc2a3f35440000fe274410ab3ccfdd760b3cfc94"
@ -3713,7 +3648,7 @@ readable-stream@~2.1.5:
string_decoder "~0.10.x"
util-deprecate "~1.0.1"
readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0:
readdir-scoped-modules@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747"
dependencies:
@ -3877,34 +3812,7 @@ replace-ext@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
request@2, request@^2.74.0:
version "2.81.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
dependencies:
aws-sign2 "~0.6.0"
aws4 "^1.2.1"
caseless "~0.12.0"
combined-stream "~1.0.5"
extend "~3.0.0"
forever-agent "~0.6.1"
form-data "~2.1.1"
har-validator "~4.2.1"
hawk "~3.1.3"
http-signature "~1.1.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
mime-types "~2.1.7"
oauth-sign "~0.8.1"
performance-now "^0.2.0"
qs "~6.4.0"
safe-buffer "^5.0.1"
stringstream "~0.0.4"
tough-cookie "~2.3.0"
tunnel-agent "^0.6.0"
uuid "^3.0.0"
request@~2.75.0:
request@2, request@^2.74.0, request@~2.75.0:
version "2.75.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.75.0.tgz#d2b8268a286da13eaa5d01adf5d18cc90f657d93"
dependencies:
@ -4634,12 +4542,6 @@ tryit@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
dependencies:
safe-buffer "^5.0.1"
tunnel-agent@~0.4.1:
version "0.4.3"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
@ -4826,11 +4728,11 @@ uuid@^2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
uuid@^3.0.0, uuid@^3.0.1:
uuid@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
validate-npm-package-license@*, validate-npm-package-license@^3.0.1:
validate-npm-package-license@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
dependencies: