From 31ec790024f7c324e28c7db16d0d9af3eca14949 Mon Sep 17 00:00:00 2001 From: Greyarch BV Date: Tue, 12 Sep 2017 12:37:28 +0200 Subject: [PATCH 1/2] moved all bucket ops to a storage agent --- index.coffee | 8 +- package-lock.json | 230 +++++++++++++-------------- package.json | 11 +- src/coffee/compose/lib.coffee | 10 +- src/coffee/storage.coffee | 70 ++------ src/coffee/storage/lib.coffee | 19 --- tests/coffee/compose/lib.test.coffee | 59 ++++++- tests/coffee/storage.test.coffee | 110 +------------ tests/coffee/storage/lib.test.coffee | 56 ------- 9 files changed, 197 insertions(+), 376 deletions(-) diff --git a/index.coffee b/index.coffee index 828cd97..d95df0a 100644 --- a/index.coffee +++ b/index.coffee @@ -9,8 +9,8 @@ ENABLE_NETWORK_HEALTHCHECK = env.get 'ENABLE_NETWORK_HEALTHCHECK', false NETWORK_HEALTHCHECK_TEST_INTERFACE = env.get 'NETWORK_HEALTHCHECK_TEST_INTERFACE', 'eth0' NETWORK_HEALTHCHECK_TEST_IP_PREFIX = env.get 'NETWORK_HEALTHCHECK_TEST_IP_PREFIX', '10.25' -datastoreScanEnabled = env.get 'DATASTORE_SCAN_ENABLED', true -if datastoreScanEnabled is 'false' then datastoreScanEnabled = false +graphScanEnabled = env.get 'GRAPH_SCAN_ENABLED', true +if graphScanEnabled is 'false' then graphScanEnabled = false config = domain: env.assert 'DOMAIN' @@ -38,8 +38,8 @@ config = image: env.get 'NETWORK_IMAGE', 'ictu/pipes:2' startcheck: test: "ifconfig #{NETWORK_HEALTHCHECK_TEST_INTERFACE} | grep inet | grep #{NETWORK_HEALTHCHECK_TEST_IP_PREFIX}" - datastore: - scanEnabled: datastoreScanEnabled + graph: + scanEnabled: graphScanEnabled if ENABLE_NETWORK_HEALTHCHECK and ENABLE_NETWORK_HEALTHCHECK isnt 'false' config.net_container.healthcheck = diff --git a/package-lock.json b/package-lock.json index 83aa4d6..334d180 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "docker-dashboard-agent-compose", - "version": "3.4.6", + "version": "3.4.8", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -15,7 +15,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", "requires": { - "mime-types": "2.1.16", + "mime-types": "2.1.17", "negotiator": "0.5.3" } }, @@ -165,7 +165,7 @@ "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", "requires": { "bytes": "2.2.0", - "content-type": "1.0.2", + "content-type": "1.0.4", "debug": "2.2.0", "depd": "1.1.1", "http-errors": "1.3.1", @@ -325,9 +325,9 @@ } }, "ci-info": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz", - "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.1.tgz", + "integrity": "sha512-vHDDF/bP9RYpTWtUhpJRhCFdvvp3iDWvEbuDbWgvjUrNGV1MXJrE0MPcwGtEled04m61iwdBLUIHZtDgzWS4ZQ==", "dev": true }, "cliff": { @@ -412,7 +412,7 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", "dev": true }, "commist": { @@ -452,9 +452,9 @@ "integrity": "sha1-h0dsamfI2qh+Muh2Ft+IO6f7Bxs=" }, "content-type": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { "version": "0.1.5", @@ -504,7 +504,7 @@ "requires": { "chalk": "1.1.3", "commander": "2.11.0", - "is-my-json-valid": "2.16.0", + "is-my-json-valid": "2.16.1", "pinkie-promise": "2.0.1" } }, @@ -549,7 +549,7 @@ "is-typedarray": "1.0.0", "isstream": "0.1.2", "json-stringify-safe": "5.0.1", - "mime-types": "2.1.16", + "mime-types": "2.1.17", "oauth-sign": "0.8.2", "qs": "6.3.2", "stringstream": "0.0.5", @@ -673,32 +673,14 @@ } }, "duplexify": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.0.tgz", - "integrity": "sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", + "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", "requires": { - "end-of-stream": "1.0.0", + "end-of-stream": "1.4.0", "inherits": "2.0.3", "readable-stream": "2.3.3", "stream-shift": "1.0.0" - }, - "dependencies": { - "end-of-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", - "integrity": "sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=", - "requires": { - "once": "1.3.3" - } - }, - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "requires": { - "wrappy": "1.0.2" - } - } } }, "ecc-jsbn": { @@ -824,7 +806,7 @@ "accepts": "1.2.13", "array-flatten": "1.1.1", "content-disposition": "0.5.1", - "content-type": "1.0.2", + "content-type": "1.0.4", "cookie": "0.1.5", "cookie-signature": "1.0.6", "debug": "2.2.0", @@ -836,7 +818,7 @@ "merge-descriptors": "1.0.1", "methods": "1.1.2", "on-finished": "2.3.0", - "parseurl": "1.3.1", + "parseurl": "1.3.2", "path-to-regexp": "0.1.7", "proxy-addr": "1.0.10", "qs": "4.0.0", @@ -877,9 +859,9 @@ } }, "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "eyes": { "version": "0.1.8", @@ -1007,13 +989,13 @@ "requires": { "asynckit": "0.4.0", "combined-stream": "1.0.5", - "mime-types": "2.1.16" + "mime-types": "2.1.17" } }, "forwarded": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.1.tgz", + "integrity": "sha1-ik4wxkCwU5U5mjVJxzAldygEiWE=" }, "fresh": { "version": "0.3.0", @@ -1029,7 +1011,7 @@ "jsonfile": "2.4.0", "klaw": "1.3.1", "path-is-absolute": "1.0.1", - "rimraf": "2.6.1" + "rimraf": "2.6.2" } }, "fs.realpath": { @@ -1070,7 +1052,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -1109,7 +1091,7 @@ "ordered-read-streams": "1.0.1", "pumpify": "1.3.5", "readable-stream": "2.3.3", - "remove-trailing-separator": "1.0.2", + "remove-trailing-separator": "1.1.0", "to-absolute-glob": "2.0.1", "unique-stream": "2.2.1" }, @@ -1224,6 +1206,12 @@ "sntp": "1.0.9" } }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, "help-me": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz", @@ -1255,7 +1243,7 @@ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "requires": { "assert-plus": "0.2.0", - "jsprim": "1.4.0", + "jsprim": "1.4.1", "sshpk": "1.13.1" } }, @@ -1346,7 +1334,7 @@ "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", "dev": true, "requires": { - "ci-info": "1.0.0" + "ci-info": "1.1.1" } }, "is-dotfile": { @@ -1381,9 +1369,9 @@ } }, "is-my-json-valid": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", - "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", "dev": true, "requires": { "generate-function": "2.0.0", @@ -1495,13 +1483,13 @@ "esprima": "2.7.3", "glob": "5.0.15", "handlebars": "4.0.10", - "js-yaml": "3.9.0", + "js-yaml": "3.10.0", "mkdirp": "0.5.1", "nopt": "3.0.6", "once": "1.4.0", "resolve": "1.1.7", "supports-color": "3.2.3", - "which": "1.2.14", + "which": "1.3.0", "wordwrap": "1.0.0" }, "dependencies": { @@ -1554,9 +1542,9 @@ } }, "js-yaml": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.0.tgz", - "integrity": "sha512-0LoUNELX4S+iofCT8f4uEHIiRBR+c2AINyC8qRWfC6QNruLtxVZRJaPcu/xwMgFIgDxF25tGHaDjvxzJCNE9yw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "requires": { "argparse": "1.0.9", "esprima": "4.0.0" @@ -1612,14 +1600,14 @@ "dev": true }, "jsprim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "requires": { "assert-plus": "1.0.0", - "extsprintf": "1.0.2", + "extsprintf": "1.3.0", "json-schema": "0.2.3", - "verror": "1.3.6" + "verror": "1.10.0" }, "dependencies": { "assert-plus": { @@ -1804,22 +1792,22 @@ "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" }, "mime-db": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" }, "mime-types": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", "requires": { - "mime-db": "1.29.0" + "mime-db": "1.30.0" } }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "1.1.8" } @@ -1845,18 +1833,19 @@ } }, "mocha": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.4.2.tgz", - "integrity": "sha1-0O9NMyEm2/GNDWQMmzgt1IvpdZQ=", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", "dev": true, "requires": { "browser-stdout": "1.3.0", "commander": "2.9.0", - "debug": "2.6.0", + "debug": "2.6.8", "diff": "3.2.0", "escape-string-regexp": "1.0.5", "glob": "7.1.1", "growl": "1.9.2", + "he": "1.1.1", "json3": "3.3.2", "lodash.create": "3.1.1", "mkdirp": "0.5.1", @@ -1873,12 +1862,12 @@ } }, "debug": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", - "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", "dev": true, "requires": { - "ms": "0.7.2" + "ms": "2.0.0" } }, "glob": { @@ -1896,9 +1885,9 @@ } }, "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "supports-color": { @@ -1913,9 +1902,9 @@ } }, "mqtt": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-2.9.3.tgz", - "integrity": "sha512-hjjzEDVIAkBm01WAgUNlavsrcL6JT60v8MOPZNp6ssO7azzPtM3ayjT12U0Ke4tj3KcXUiuy6a3CZ1CSitjOWw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-2.13.0.tgz", + "integrity": "sha512-Mg+Fsjp7oaQnIzWfqUHtbfRdmgZJxcVkhjPBvOqJ0gzj0IwgpTgkQUVihJ8/U02yhnSfV6xzVtKpODXu15wc2g==", "requires": { "commist": "1.0.0", "concat-stream": "1.6.0", @@ -1942,7 +1931,7 @@ "mqtt-packet": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-5.4.0.tgz", - "integrity": "sha1-OHEEwGqmj7ufgVnQxyLdXD5F3yI=", + "integrity": "sha512-ziN7uVysLdn7fYbOhEaKOhcZC3yIRTTakY4TFd2w+UvZIx9dPr8NCqbBYoC4WYDlzWHTn5EqR5x20pC+K24Ymg==", "requires": { "bl": "1.2.1", "inherits": "2.0.3", @@ -2010,7 +1999,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { - "remove-trailing-separator": "1.0.2" + "remove-trailing-separator": "1.1.0" } }, "nssocket": { @@ -2143,9 +2132,9 @@ } }, "parseurl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, "passport": { "version": "0.3.2", @@ -2287,7 +2276,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz", "integrity": "sha1-DUCoL4Afw1VWfS7LZe/j8HfxIcU=", "requires": { - "forwarded": "0.1.0", + "forwarded": "0.1.1", "ipaddr.js": "1.0.5" } }, @@ -2313,7 +2302,7 @@ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz", "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", "requires": { - "duplexify": "3.5.0", + "duplexify": "3.5.1", "inherits": "2.0.3", "pump": "1.0.2" } @@ -2412,7 +2401,7 @@ "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -2456,9 +2445,9 @@ "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=" }, "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { "version": "1.1.2", @@ -2488,7 +2477,7 @@ "is-typedarray": "1.0.0", "isstream": "0.1.2", "json-stringify-safe": "5.0.1", - "mime-types": "2.1.16", + "mime-types": "2.1.17", "oauth-sign": "0.8.2", "performance-now": "0.2.0", "qs": "6.4.0", @@ -2559,9 +2548,9 @@ } }, "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { "glob": "7.1.2" } @@ -2569,7 +2558,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "send": { "version": "0.13.1", @@ -2603,7 +2592,7 @@ "integrity": "sha1-zlpuzTEB/tXsCYJ9rCKpwpv7BTU=", "requires": { "escape-html": "1.0.3", - "parseurl": "1.3.1", + "parseurl": "1.3.2", "send": "0.13.2" }, "dependencies": { @@ -2733,7 +2722,7 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "5.1.1" } @@ -2885,7 +2874,7 @@ "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.16" + "mime-types": "2.1.17" } }, "typedarray": { @@ -2900,15 +2889,15 @@ "dev": true, "optional": true, "requires": { - "source-map": "0.5.6", + "source-map": "0.5.7", "uglify-to-browserify": "1.0.2", "yargs": "3.10.0" }, "dependencies": { "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true, "optional": true } @@ -2980,7 +2969,7 @@ "i": "0.3.5", "mkdirp": "0.5.1", "ncp": "0.4.2", - "rimraf": "2.6.1" + "rimraf": "2.6.2" } }, "utils-merge": { @@ -2991,7 +2980,7 @@ "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=" + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" }, "vary": { "version": "1.0.1", @@ -2999,11 +2988,20 @@ "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=" }, "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "extsprintf": "1.0.2" + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } } }, "websocket-stream": { @@ -3011,7 +3009,7 @@ "resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.0.1.tgz", "integrity": "sha512-N3X0rs/ucnccDdyn5GkwD7HVjtvcE3scSmYzdndzma/3ovQpjUxDRP71nTliph9EpXYt9fXbdCVL+e6JuguC+A==", "requires": { - "duplexify": "3.5.0", + "duplexify": "3.5.1", "inherits": "2.0.3", "readable-stream": "2.3.3", "safe-buffer": "5.1.1", @@ -3031,9 +3029,9 @@ } }, "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { "isexe": "2.0.0" diff --git a/package.json b/package.json index 52731c7..99350ed 100644 --- a/package.json +++ b/package.json @@ -4,19 +4,16 @@ "description": "", "main": "index.js", "scripts": { - "start": - "./node_modules/.bin/forever --minUptime 2500 --spinSleepTime 5000 ./node_modules/.bin/coffee index.coffee", - "test": - "mocha --recursive --compilers coffee:coffee-script/register --require coffee-coverage/register-istanbul tests && istanbul report text lcov", - "test:watch": - "mocha --recursive --compilers coffee:coffee-script/register --watch-extensions test.coffee --watch tests ", + "start": "./node_modules/.bin/forever --minUptime 2500 --spinSleepTime 5000 ./node_modules/.bin/coffee index.coffee", + "test": "mocha --recursive --compilers coffee:coffee-script/register --require coffee-coverage/register-istanbul tests && istanbul report text lcov", + "test:html": "mocha --recursive --compilers coffee:coffee-script/register --require coffee-coverage/register-istanbul tests && istanbul report html lcov", + "test:watch": "mocha --recursive --compilers coffee:coffee-script/register --watch-extensions test.coffee --watch tests ", "precommit": "npm test", "prepush": "npm test" }, "author": "", "license": "Apache-2.0", "dependencies": { - "chokidar": "^1.7.0", "coffee-script": "^1.12.4", "docker-dashboard-agent-api": "^4.5.1", "forever": "^0.15.2", diff --git a/src/coffee/compose/lib.coffee b/src/coffee/compose/lib.coffee index ea7a1bf..86c2b15 100644 --- a/src/coffee/compose/lib.coffee +++ b/src/coffee/compose/lib.coffee @@ -43,10 +43,10 @@ module.exports = console.error "Error, unable to execute", cmd, args, spawned.error else console.log 'success', cmd, args - spawned.stdout.on 'data', callbacks.stdout if callbacks.stdout - spawned.stderr.on 'data', callbacks.stderr if callbacks.stderr - spawned.on 'close', () -> + spawned.stdout.on 'data', callbacks.stdout if callbacks?.stdout + spawned.stderr.on 'data', callbacks.stderr if callbacks?.stderr + spawned.on 'close', () -> if spawned.exitCode == 0 exitCb() - else - callbacks.stderr 'Something went wrong while pulling images.' if callbacks.stderr + else + callbacks.stderr 'Something went wrong while pulling images.' if callbacks?.stderr diff --git a/src/coffee/storage.coffee b/src/coffee/storage.coffee index 758cd4e..1fece96 100644 --- a/src/coffee/storage.coffee +++ b/src/coffee/storage.coffee @@ -1,75 +1,23 @@ fs = require 'fs-extra' path = require 'path' -chokidar = require 'chokidar' lib = require './storage/lib.coffee' module.exports = (agent, mqtt, config) -> - - publishStorageBuckets = (err, buckets) -> - mqtt.publish '/agent/storage/buckets', buckets unless err - - basePath = path.join config.dataDir, config.domain - - if config.datastore?.scanEnabled - lib.runPeriodically lib.publishDataStoreUsage(mqtt, '/agent/storage/size', config.dataDir) + if config.graph?.scanEnabled lib.runPeriodically lib.publishDataStoreUsage(mqtt, '/agent/docker/graph', config.docker.graph.path) - listBucketsCb = (fileName, fileStats) -> - console.log "#{fileName} changed. Listing storage buckets..." - lib.listStorageBuckets fs, basePath, publishStorageBuckets - - listBucketsCb() - opts = - usePolling: true - ignored: path.join basePath, '/*/**' - - ['addDir', 'unlinkDir'].map (e) -> chokidar.watch(basePath, opts).on e, listBucketsCb - ['add', 'unlink'].map (e) -> chokidar.watch(path.join(basePath, '/.*'), opts).on e, listBucketsCb - - agent.on '/storage/list', (params, data, callback) -> - lib.listStorageBuckets fs, basePath, (err, buckets) -> - publishStorageBuckets err, buckets - callback() - - agent.on '/storage/delete', ({name}, data, callback) -> - targetpath = path.join '/', config.domain, name - lockFile = path.join basePath, ".#{name}.delete.lock" - fs.writeFile lockFile, "Deleting #{targetpath}...", -> - console.log "Deleting #{targetpath}..." - lib.remoteFs config.remotefsUrl, 'rm', {dir: targetpath}, (err) -> - unless err - console.log "#{targetpath} was successfully deleted" - fs.unlink lockFile, callback - else - callback err + agent.on '/storage/delete', (params, data, callback) -> + console.log "Requesting removal of storage bucket '#{params.name}'" + lib.remoteFs config.remotefsUrl, 'rm', params, callback agent.on '/storage/create', (params, {name, source}, callback) -> if source - srcpath = path.join '/', config.domain, source - targetpath = path.join '/', config.domain, name - lockFile = path.join basePath, ".#{name}.copy.lock" - fs.writeFile lockFile, "Copying #{srcpath} to #{targetpath}...", -> - console.log "Copying #{srcpath} to #{targetpath}..." - lib.remoteFs config.remotefsUrl, 'cp', {source: srcpath, destination: targetpath}, (err) -> - unless err - console.log "#{srcpath} was successfully copied to #{targetpath}" - fs.unlink lockFile, callback - else - callback err + console.log "Requesting copy of storage bucket '#{source}' to '#{name}'" + lib.remoteFs config.remotefsUrl, 'cp', {source: source, destination: name}, callback else - targetpath = path.join basePath, name - console.log "Creating bucket #{targetpath}" - fs.mkdirs targetpath, callback + console.log "Requesting a new bucket '#{name}'" + lib.remoteFs config.remotefsUrl, 'mk', {name}, callback agent.on '/storage/size', ({name}, data, callback) -> - targetpath = path.join '/', config.domain, name - lockFile = path.join basePath, ".#{name}.size.lock" - console.log "Retrieving size #{targetpath}" - fs.writeFile lockFile, "Retrieving size #{targetpath} ...", -> - lib.remoteFs config.remotefsUrl, 'du', {dir: targetpath}, (err, response) -> - unless err - fs.unlink lockFile, -> - callback null, { name: name, size: response.size} - else - callback err + console.log "Retrieving size of storage buckets is now automatic and near real-time." diff --git a/src/coffee/storage/lib.coffee b/src/coffee/storage/lib.coffee index cd5d7f7..0f262a3 100644 --- a/src/coffee/storage/lib.coffee +++ b/src/coffee/storage/lib.coffee @@ -4,25 +4,6 @@ request = require 'request' module.exports = runPeriodically: (f) -> setInterval f, 5000 - listStorageBuckets: (fs, dir, cb) -> - fs.readdir dir, (err, dirList) -> - if err - console.error err - cb? err, null - else - try - files = dirList?.map (file) -> - copyLock = ".#{file}.copy.lock" - deleteLock = ".#{file}.delete.lock" - stat = fs.statSync path.join(dir, file) - if stat?.isDirectory() - name: file - created: stat.birthtime - isLocked: copyLock in dirList or deleteLock in dirList - .filter (file) -> file? - cb? null, files - catch ex - cb? ex, null remoteFs: (remoteFsUrl, cmd, payload, cb) -> request diff --git a/tests/coffee/compose/lib.test.coffee b/tests/coffee/compose/lib.test.coffee index af87d27..e7430d1 100644 --- a/tests/coffee/compose/lib.test.coffee +++ b/tests/coffee/compose/lib.test.coffee @@ -1,23 +1,72 @@ assert = require 'assert' -{transformDependsOnToObject} = require '../../../src/coffee/compose/lib.coffee' +td = require 'testdouble' +_ = require 'lodash' + +child_process = null +mkdirp = null +lib = null + +config = + compose: scriptBaseDir: "/my/scripts" + domain: "my-domain" + describe 'Compose lib', -> describe 'transformDependsOnToObject', -> + lib = require '../../../src/coffee/compose/lib.coffee' it 'should return null when the argument is falsy', -> - assert.deepEqual transformDependsOnToObject(null), null - assert.deepEqual transformDependsOnToObject(false), null + assert.deepEqual lib.transformDependsOnToObject(null), null + assert.deepEqual lib.transformDependsOnToObject(false), null it 'should return the unchanged argument when the argument is an object', -> depends_on = www: condition: 'service_healthy' db: condition: 'service_started' someOther: key: 'prop' - assert.deepEqual transformDependsOnToObject(depends_on), depends_on + assert.deepEqual lib.transformDependsOnToObject(depends_on), depends_on it 'should transform a list of service names to a depends_on object with a default condition property', -> depends_on_list = ['www', 'db', 'someOther'] - assert.deepEqual transformDependsOnToObject(depends_on_list), + assert.deepEqual lib.transformDependsOnToObject(depends_on_list), www: condition: 'service_started' db: condition: 'service_started' someOther: condition: 'service_started' + + describe 'saveScript', -> + beforeEach -> + mkdirp = td.replace 'mkdirp' + lib = require '../../../src/coffee/compose/lib.coffee' + afterEach -> td.reset() + + it 'should invoke mkdirp and fs.writeFile', -> + td.when(mkdirp(td.matchers.anything(), td.matchers.anything())).thenCallback(null) + lib.saveScript config, "my-file", "my-instance", "script data", td.function() + td.verify mkdirp("/my/scripts/my-domain/my-instance", td.matchers.isA(Function)) + + it 'should return script path', -> + assert.equal lib.saveScript(config, "my-file", "my-instance", "nonce", td.function()), "/my/scripts/my-domain/my-instance/my-file" + + describe 'runCmd', -> + beforeEach -> + child_process = td.replace 'child_process' + lib = require '../../../src/coffee/compose/lib.coffee' + afterEach -> td.reset() + + it 'should spawn the command passed', -> + spawned = + error: null + stdout: on: td.function() + stderr: on: td.function() + on: td.function() + exitCode: 0 + td.when(child_process.spawn('test cmd', ['some', 'args'], td.matchers.isA(Object))).thenReturn spawned + testEnv = env: _.extend {}, process.env, {var: 'val'} + callbacks = + stdout: td.function() + stderr: td.function() + lib.runCmd 'test cmd', ['some', 'args'], {var: 'val'}, callbacks + td.verify child_process.spawn('test cmd', ['some', 'args'], testEnv) + td.verify spawned.stdout.on('data', callbacks.stdout) + td.verify spawned.stderr.on('data', callbacks.stderr) + td.verify spawned.on('close', td.matchers.isA(Function)) diff --git a/tests/coffee/storage.test.coffee b/tests/coffee/storage.test.coffee index af28a9e..4f5c942 100644 --- a/tests/coffee/storage.test.coffee +++ b/tests/coffee/storage.test.coffee @@ -4,47 +4,23 @@ td = require 'testdouble' fs = null storageLib = null storage = null -chokidar = null - -chokidarWatchOpts = - usePolling: true - ignored: "/rootDir/myDomain/*/**" - -chokidarWatchOn = td.function 'chokidar.watch.on' describe 'Storage', -> beforeEach -> fs = td.replace 'fs-extra' - chokidar = td.replace 'chokidar' storageLib = td.replace '../../src/coffee/storage/lib.coffee' storage = require '../../src/coffee/storage.coffee' - td.when(chokidar.watch(td.matchers.contains("/rootDir/myDomain"), chokidarWatchOpts)).thenReturn - on: chokidarWatchOn afterEach -> td.reset() - it 'should publish storage buckets to mqtt when /storage/list is invoked', -> - agent = td.object ['on'] - mqtt = td.object ['publish'] - cb = td.function() - td.when(agent.on('/storage/list')).thenCallback 'params', 'data', cb - argIsFs = td.matchers.argThat (arg) -> arg is fs - td.when(storageLib.listStorageBuckets argIsFs, '/rootDir/myDomain').thenCallback null, 'mybuckets' - storage agent, mqtt, dataDir: '/rootDir', domain: 'myDomain', docker: graph: path: '/docker/graph' - td.verify mqtt.publish '/agent/storage/buckets', 'mybuckets' - - it 'should delete a storage bucket when /storage/delete is invoked', -> + it 'should call remoteFS rm when when /storage/delete is invoked', -> agent = td.object ['on'] captor = td.matchers.captor() storage agent, null, dataDir: '/rootDir', domain: 'myDomain', remotefsUrl: 'remotefsUrl', docker: graph: path: '/docker/graph' td.verify agent.on '/storage/delete', captor.capture() captor.value {name:'name1'}, null, 'mycallback' - td.verify fs.writeFile '/rootDir/myDomain/.name1.delete.lock', td.matchers.anything(), captor.capture() - captor.value() - td.verify storageLib.remoteFs 'remotefsUrl', 'rm', {dir: '/myDomain/name1'}, captor.capture() - captor.value() - td.verify fs.unlink '/rootDir/myDomain/.name1.delete.lock', 'mycallback' + td.verify storageLib.remoteFs 'remotefsUrl', 'rm', {name:'name1'}, 'mycallback' it 'should create a new storage bucket when /storage/create is invoked', -> agent = td.object ['on'] @@ -52,7 +28,7 @@ describe 'Storage', -> storage agent, null, dataDir: '/rootDir', domain: 'myDomain', remotefsUrl: 'remotefsUrl', docker: graph: path: '/docker/graph' td.verify agent.on '/storage/create', captor.capture() captor.value null, {name: 'bucket1'}, 'mycallback' - td.verify fs.mkdirs '/rootDir/myDomain/bucket1', 'mycallback' + td.verify storageLib.remoteFs 'remotefsUrl', 'mk', {name: 'bucket1'}, 'mycallback' it 'should create new storage bucket by copying an existing bucket when /storage/create with source parameter is invoked', -> agent = td.object ['on'] @@ -60,37 +36,7 @@ describe 'Storage', -> storage agent, null, dataDir: '/rootDir', domain: 'myDomain', remotefsUrl: 'remotefsUrl', docker: graph: path: '/docker/graph' td.verify agent.on '/storage/create', captor.capture() captor.value null, {name: 'bucket1', source: 'src1'}, 'mycallback' - td.verify fs.writeFile '/rootDir/myDomain/.bucket1.copy.lock', td.matchers.anything(), captor.capture() - captor.value() - td.verify storageLib.remoteFs 'remotefsUrl', 'cp', {source: '/myDomain/src1', destination: '/myDomain/bucket1'}, captor.capture() - captor.value() - td.verify fs.unlink '/rootDir/myDomain/.bucket1.copy.lock', 'mycallback' - - it 'should report the size of a storage bucket when /storage/size is invoked', -> - agent = td.object ['on'] - cb = td.function() - captor = td.matchers.captor() - storage agent, null, dataDir: '/rootDir', domain: 'myDomain', remotefsUrl: 'remotefsUrl', docker: graph: path: '/docker/graph' - td.verify agent.on '/storage/size', captor.capture() - captor.value {name: 'bucket1'}, null, cb - td.verify fs.writeFile '/rootDir/myDomain/.bucket1.size.lock', td.matchers.anything(), captor.capture() - captor.value() - td.verify storageLib.remoteFs 'remotefsUrl', 'du', {dir: '/myDomain/bucket1'}, captor.capture() - captor.value null, {size: 1234} - td.verify fs.unlink '/rootDir/myDomain/.bucket1.size.lock', captor.capture() - captor.value() - td.verify cb null, {name: 'bucket1', size: 1234} - - it 'should periodically publish data storage statistics to mqtt if data store scan is enabled', -> - agent = td.object ['on'] - storage agent, null, - dataDir: '/rootDir' - domain: 'myDomain' - docker: - graph: path: '/docker/graph' - datastore: scanEnabled: true - td.verify storageLib.publishDataStoreUsage(null, '/agent/storage/size', '/rootDir') - td.verify storageLib.runPeriodically td.matchers.anything() + td.verify storageLib.remoteFs 'remotefsUrl', 'cp', {destination: 'bucket1', source: 'src1'}, 'mycallback' it 'should periodically publish docker graph statistics to mqtt if data store scan is enabled', -> agent = td.object ['on'] @@ -99,58 +45,16 @@ describe 'Storage', -> domain: 'myDomain' docker: graph: path: '/docker/graph' - datastore: scanEnabled: true + graph: scanEnabled: true td.verify storageLib.publishDataStoreUsage(null, '/agent/docker/graph', '/docker/graph') td.verify storageLib.runPeriodically td.matchers.anything() - it 'should NOT periodically publish data storage statistics to mqtt if data store scan is disabled', -> - agent = td.object ['on'] - storage agent, null, - dataDir: '/rootDir' - domain: 'myDomain' - docker: - graph: path: '/docker/graph' - datastore: scanEnabled: false - td.verify storageLib.publishDataStoreUsage(), {times: 0, ignoreExtraArgs: true} - td.verify storageLib.runPeriodically(), {times: 0, ignoreExtraArgs: true} - it 'should NOT periodically publish docker graph statistics to mqtt if data store scan is disabled', -> agent = td.object ['on'] storage agent, null, dataDir: '/rootDir' domain: 'myDomain' - docker: - graph: path: '/docker/graph' - datastore: scanEnabled: false + docker: graph: path: '/docker/graph' + graph: scanEnabled: false td.verify storageLib.publishDataStoreUsage(), {times: 0, ignoreExtraArgs: true} td.verify storageLib.runPeriodically(), {times: 0, ignoreExtraArgs: true} - - it 'should watch for changes on the base path and publish storage buckets when data store scan is enabled', -> - agent = td.object ['on'] - mqtt = td.object ['publish'] - argIsFs = td.matchers.argThat (arg) -> arg is fs - captor = td.matchers.captor() - - storage agent, mqtt, - dataDir: '/rootDir' - domain: 'myDomain' - docker: graph: path: '/docker/graph' - datastore: scanEnabled: true - td.verify chokidarWatchOn 'addDir', td.matchers.isA Function - td.verify chokidarWatchOn 'unlinkDir', td.matchers.isA Function - td.verify chokidarWatchOn 'add', td.matchers.isA Function - td.verify chokidarWatchOn 'unlink', td.matchers.isA Function - td.verify storageLib.listStorageBuckets argIsFs, '/rootDir/myDomain', captor.capture() - captor.value null, 'some-buckets' - td.verify mqtt.publish '/agent/storage/buckets', 'some-buckets' - - it 'should NOT watch for changes on the base path and publish storage buckets when data store scan is disabled', -> - agent = td.object ['on'] - - storage agent, null, - dataDir: '/rootDir' - domain: 'myDomain' - docker: graph: path: '/docker/graph' - datastore: scanEnabled: false - td.verify fs.watch(), {times: 0, ignoreExtraArgs: true} - td.verify storageLib.listStorageBuckets(), {times: 0, ignoreExtraArgs: true} diff --git a/tests/coffee/storage/lib.test.coffee b/tests/coffee/storage/lib.test.coffee index 0c8f10a..ed67f49 100644 --- a/tests/coffee/storage/lib.test.coffee +++ b/tests/coffee/storage/lib.test.coffee @@ -8,62 +8,6 @@ describe 'Storage/Lib', -> after -> td.reset() - describe 'listStorageBuckets', -> - it 'should callback with an error when there was a problem listing files in the dir', -> - fs = td.object ['readdir'] - cb = td.function() - td.when(fs.readdir 'mydir').thenCallback('err', null) - lib.listStorageBuckets fs, 'mydir', cb - td.verify cb 'err', null - it 'should callback with an error when there was a problem retrieving file stats', -> - fs = td.object ['readdir', 'statSync'] - cb = td.function() - td.when(fs.readdir 'mydir').thenCallback( null, ['dir1', '.dir1.delete.lock']) - td.when(fs.statSync 'mydir/dir1').thenThrow 'An Error' - lib.listStorageBuckets fs, 'mydir', cb - td.verify cb 'An Error', null - it 'should retrieve stats for each file', -> - fs = td.object ['readdir', 'statSync'] - cb = td.function() - td.when(fs.readdir 'mydir').thenCallback( null, ['file1', 'file2']) - lib.listStorageBuckets fs, 'mydir', cb - td.verify fs.statSync('mydir/file1'), times:1 - td.verify fs.statSync('mydir/file2'), times:1 - it 'should return stats for directories only', -> - fs = td.object ['readdir', 'statSync'] - cb = td.function() - td.when(fs.readdir 'mydir').thenCallback( null, ['dir1', 'file2']) - td.when(fs.statSync 'mydir/dir1').thenReturn isDirectory:(-> true), birthtime: 'sometime' - td.when(fs.statSync 'mydir/file2').thenReturn isDirectory: -> false - lib.listStorageBuckets fs, 'mydir', cb - td.verify cb null, [ - name: 'dir1' - created: 'sometime' - isLocked: false - ] - it 'should set the isLocked property to true for directories which are locked by a copy lock', -> - fs = td.object ['readdir', 'statSync'] - cb = td.function() - td.when(fs.readdir 'mydir').thenCallback( null, ['dir1', '.dir1.copy.lock']) - td.when(fs.statSync 'mydir/dir1').thenReturn isDirectory:(-> true), birthtime: 'sometime' - lib.listStorageBuckets fs, 'mydir', cb - td.verify cb null, [ - name: 'dir1' - created: 'sometime' - isLocked: true - ] - it 'should set the isLocked property to true for directories which are locked by a delete lock', -> - fs = td.object ['readdir', 'statSync'] - cb = td.function() - td.when(fs.readdir 'mydir').thenCallback( null, ['dir1', '.dir1.delete.lock']) - td.when(fs.statSync 'mydir/dir1').thenReturn isDirectory:(-> true), birthtime: 'sometime' - lib.listStorageBuckets fs, 'mydir', cb - td.verify cb null, [ - name: 'dir1' - created: 'sometime' - isLocked: true - ] - describe 'remoteFs', -> it 'should call the remoteFs endpoint with the desired command and return its response to the caller', -> cb = td.function() From 18144557b71c744ed79ef7340779344179711c8e Mon Sep 17 00:00:00 2001 From: Greyarch BV Date: Tue, 26 Sep 2017 10:44:39 +0200 Subject: [PATCH 2/2] pulled out mqt related code --- index.coffee | 8 ++----- package-lock.json | 9 +++++++ package.json | 14 +++++++---- run-dev.sh | 6 ++--- src/coffee/mqtt.coffee | 17 ------------- tests/coffee/mqtt.test.coffee | 45 ----------------------------------- 6 files changed, 23 insertions(+), 76 deletions(-) delete mode 100644 src/coffee/mqtt.coffee delete mode 100644 tests/coffee/mqtt.test.coffee diff --git a/index.coffee b/index.coffee index d95df0a..5bcc39b 100644 --- a/index.coffee +++ b/index.coffee @@ -1,7 +1,7 @@ fs = require 'fs-extra' path = require 'path' server = require 'docker-dashboard-agent-api' -Mqtt = require './src/coffee/mqtt' +Mqtt = require 'bigboat-mqtt-client' env = require './src/coffee/env' packageJson = require './package.json' @@ -17,10 +17,6 @@ config = tld: env.assert 'TLD' dataDir: env.assert 'DATA_DIR' remotefsUrl: env.assert 'REMOTEFS_URL' - mqtt: - url: env.assert 'MQTT_URL' - user: env.get 'MQTT_USER' - pass: env.get 'MQTT_PASS' docker: graph: path: env.get 'DOCKER_GRAPH_PATH', '/var/lib/docker' @@ -59,7 +55,7 @@ catch err libcompose = (require './src/coffee/compose') config -mqtt = Mqtt.connect config.mqtt +mqtt = Mqtt() publishState = (instance, state) -> mqtt.publish '/instance/state', {instance: instance, state: state} diff --git a/package-lock.json b/package-lock.json index 334d180..ef4d7f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -146,6 +146,15 @@ "tweetnacl": "0.14.5" } }, + "bigboat-mqtt-client": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bigboat-mqtt-client/-/bigboat-mqtt-client-1.0.0.tgz", + "integrity": "sha512-tkk8FwmfFYtpCSW/PocwWGwsU+DhmzVe/yBM20atoWuI1e+f8DfGJBK8ekJvHb4t1Or3haZcgXW/22wLErUchQ==", + "requires": { + "lodash": "4.17.4", + "mqtt": "2.13.0" + } + }, "binary-extensions": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", diff --git a/package.json b/package.json index 99350ed..0abcbac 100644 --- a/package.json +++ b/package.json @@ -4,16 +4,21 @@ "description": "", "main": "index.js", "scripts": { - "start": "./node_modules/.bin/forever --minUptime 2500 --spinSleepTime 5000 ./node_modules/.bin/coffee index.coffee", - "test": "mocha --recursive --compilers coffee:coffee-script/register --require coffee-coverage/register-istanbul tests && istanbul report text lcov", - "test:html": "mocha --recursive --compilers coffee:coffee-script/register --require coffee-coverage/register-istanbul tests && istanbul report html lcov", - "test:watch": "mocha --recursive --compilers coffee:coffee-script/register --watch-extensions test.coffee --watch tests ", + "start": + "./node_modules/.bin/forever --minUptime 2500 --spinSleepTime 5000 ./node_modules/.bin/coffee index.coffee", + "test": + "mocha --recursive --compilers coffee:coffee-script/register --require coffee-coverage/register-istanbul tests && istanbul report text lcov", + "test:html": + "mocha --recursive --compilers coffee:coffee-script/register --require coffee-coverage/register-istanbul tests && istanbul report html lcov", + "test:watch": + "mocha --recursive --compilers coffee:coffee-script/register --watch-extensions test.coffee --watch tests ", "precommit": "npm test", "prepush": "npm test" }, "author": "", "license": "Apache-2.0", "dependencies": { + "bigboat-mqtt-client": "^1.0.0", "coffee-script": "^1.12.4", "docker-dashboard-agent-api": "^4.5.1", "forever": "^0.15.2", @@ -21,7 +26,6 @@ "js-yaml": "^3.6.1", "lodash": "^4.15.0", "mkdirp": "^0.5.1", - "mqtt": "^2.4.0", "os-monitor": "^1.0.5", "path": "^0.12.7", "random-mac": "0.0.4", diff --git a/run-dev.sh b/run-dev.sh index ee91566..fb82ce7 100755 --- a/run-dev.sh +++ b/run-dev.sh @@ -4,13 +4,13 @@ DOCKER_HOST=unix:///var/run/docker.sock \ AUTH_TOKEN=innovation \ HTTP_PORT=8080 \ MQTT_URL=mqtt://localhost \ -MQTT_USER=user \ -MQTT_PASS=pass \ +MQTT_USERNAME=user \ +MQTT_PASSWORD=pass \ DOMAIN=acc \ TLD=ictu \ SCRIPT_BASE_DIR=/local/data/scripts \ DATA_DIR=/local/data \ -REMOTEFS_URL=http://10.19.88.248:8000 \ +REMOTEFS_URL=http://localhost:8000 \ NETWORK_NAME=bigboat-apps-3080 \ NETWORK_PARENT_NIC=eth0 \ NETWORK_SCAN_INTERVAL=60000 \ diff --git a/src/coffee/mqtt.coffee b/src/coffee/mqtt.coffee deleted file mode 100644 index ca6b59f..0000000 --- a/src/coffee/mqtt.coffee +++ /dev/null @@ -1,17 +0,0 @@ -mqtt = require 'mqtt' - -module.exports = - connect: (mqttConfig) -> _connect mqttConfig, console - _connect: _connect = (mqttConfig, console) -> - client = mqtt.connect mqttConfig.url, - username: mqttConfig.user - password: mqttConfig.pass - - client.on 'connect', -> - console.log 'Connected to', mqttConfig.url - - client.on 'error', (err) -> console.log 'An error occured', err - client.on 'close', -> console.log 'Connection closed' - - publish: (topic, data) -> - client.publish topic, JSON.stringify data diff --git a/tests/coffee/mqtt.test.coffee b/tests/coffee/mqtt.test.coffee deleted file mode 100644 index add5f94..0000000 --- a/tests/coffee/mqtt.test.coffee +++ /dev/null @@ -1,45 +0,0 @@ -assert = require 'assert' -td = require 'testdouble' - -realMqtt = td.replace 'mqtt' -mqtt = require '../../src/coffee/mqtt.coffee' - -config = - url: 'mqtt://host' - user: 'username' - pass: 'passwd123' - -client = null; myMqtt = null; console = null; - -describe 'mqtt', -> - - after -> td.reset() - - beforeEach -> - client = td.object ['on', 'publish'] - td.when(realMqtt.connect('mqtt://host', {username: 'username', password: 'passwd123'})).thenReturn client - console = td.object log: -> - myMqtt = mqtt._connect config, console - - it '.connect() returns an mqtt instance with publish capacilities', -> - assert.equal myMqtt.publish?, true - myMqtt.publish 'myTopic', {some: 'data'} - td.verify client.publish 'myTopic', '{"some":"data"}' - - it 'should log when connected to the server', -> - captor = td.matchers.captor() - td.verify client.on 'connect', captor.capture() - captor.value() - td.verify console.log 'Connected to', config.url - - it 'should log when an error occurs', -> - captor = td.matchers.captor() - td.verify client.on 'error', captor.capture() - captor.value('myerr') - td.verify console.log 'An error occured', 'myerr' - - it 'should log when the connection to the mqtt server is closed', -> - captor = td.matchers.captor() - td.verify client.on 'close', captor.capture() - captor.value() - td.verify console.log 'Connection closed'