From caee178ad89a5446a78d25d6af86d813fd1d6c8f Mon Sep 17 00:00:00 2001 From: geek Date: Thu, 1 Jun 2017 16:25:45 -0500 Subject: [PATCH] feat(portal-data): support manifest provision flow --- packages/portal-data/lib/index.js | 185 ++++++++++++++++--- packages/portal-data/lib/transform.js | 11 +- packages/portal-data/package.json | 7 +- packages/portal-data/test/docker-compose.yml | 24 +++ packages/portal-data/test/index.js | 42 +++-- packages/portal-data/yarn.lock | 49 +---- packages/styled-is/yarn.lock | 49 +++++ yarn.lock | 126 ++----------- 8 files changed, 283 insertions(+), 210 deletions(-) create mode 100644 packages/portal-data/test/docker-compose.yml diff --git a/packages/portal-data/lib/index.js b/packages/portal-data/lib/index.js index ffb175ab..6f2fd26b 100644 --- a/packages/portal-data/lib/index.js +++ b/packages/portal-data/lib/index.js @@ -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) => { diff --git a/packages/portal-data/lib/transform.js b/packages/portal-data/lib/transform.js index 3ae67612..0c6138f8 100644 --- a/packages/portal-data/lib/transform.js +++ b/packages/portal-data/lib/transform.js @@ -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) }; }; diff --git a/packages/portal-data/package.json b/packages/portal-data/package.json index 0d86fe77..be571b38 100644 --- a/packages/portal-data/package.json +++ b/packages/portal-data/package.json @@ -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" } } diff --git a/packages/portal-data/test/docker-compose.yml b/packages/portal-data/test/docker-compose.yml new file mode 100644 index 00000000..2e20de31 --- /dev/null +++ b/packages/portal-data/test/docker-compose.yml @@ -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 diff --git a/packages/portal-data/test/index.js b/packages/portal-data/test/index.js index dda10b10..3b9219ba 100644 --- a/packages/portal-data/test/index.js +++ b/packages/portal-data/test/index.js @@ -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) => { diff --git a/packages/portal-data/yarn.lock b/packages/portal-data/yarn.lock index ab975f5b..a6b3bbda 100644 --- a/packages/portal-data/yarn.lock +++ b/packages/portal-data/yarn.lock @@ -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" diff --git a/packages/styled-is/yarn.lock b/packages/styled-is/yarn.lock index 06c321f9..27687faf 100644 --- a/packages/styled-is/yarn.lock +++ b/packages/styled-is/yarn.lock @@ -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" diff --git a/yarn.lock b/yarn.lock index d519e146..dd02dced 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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: