diff --git a/test/integration/cli-fwrules.test.js b/test/integration/cli-fwrules.test.js index 9ece721..02eb8ad 100644 --- a/test/integration/cli-fwrules.test.js +++ b/test/integration/cli-fwrules.test.js @@ -23,6 +23,7 @@ var RULE = 'FROM any TO vm $id ALLOW tcp PORT 80'; var RULE2 = 'FROM any TO vm $id BLOCK tcp port 25'; var INST; var ID; +var FAKE_INST_UUID = '89bcb9de-f174-4f20-bfa8-27d9749e6a2c'; // --- Tests @@ -33,11 +34,17 @@ test('triton fwrule', function (tt) { return t.end(); var rows = stdout.split('\n'); - INST = JSON.parse(rows[0]).id; - t.ok(INST); - - RULE = RULE.replace('$id', INST); - RULE2 = RULE2.replace('$id', INST); + try { + INST = JSON.parse(rows[0]).id; + RULE = RULE.replace('$id', INST); + RULE2 = RULE2.replace('$id', INST); + } catch (e) { + // if we don't have a VM already running to test with, we'll + // run most tests with a fake UUID, and skip any tests that + // require an actual machine UUID + RULE = RULE.replace('$id', FAKE_INST_UUID); + RULE2 = RULE2.replace('$id', FAKE_INST_UUID); + } t.end(); }); @@ -148,6 +155,9 @@ test('triton fwrule', function (tt) { t.ok(machines[0].match(/ID\s+NAME\s+IMG\s+BRAND/)); machines.shift(); + if (!INST) + return t.end(); + t.equal(machines.length, 1, 'triton fwrule instances expected ' + 'num machines'); diff --git a/test/integration/cli-snapshots.test.js b/test/integration/cli-snapshots.test.js index 577e733..f0a40aa 100644 --- a/test/integration/cli-snapshots.test.js +++ b/test/integration/cli-snapshots.test.js @@ -19,6 +19,7 @@ var test = require('tape'); var SNAP_NAME = 'test-snapshot'; var INST; +var DESTROY_INST = false; // --- Tests @@ -29,10 +30,21 @@ test('triton snapshot', function (tt) { return t.end(); var rows = stdout.split('\n'); - INST = JSON.parse(rows[0]).id; - t.ok(INST); - t.end(); + try { + INST = JSON.parse(rows[0]).id; + return t.end(); + } catch (e) { + h.createMachine(function onCreate(err2, instId) { + if (h.ifErr(t, err2, 'triton instance create')) + return t.end(); + + INST = instId; + DESTROY_INST = true; + + t.end(); + }); + } }); }); @@ -113,4 +125,13 @@ test('triton snapshot', function (tt) { t.end(); }); }); + + tt.test('teardown', function (t) { + if (!DESTROY_INST) + return t.end(); + + h.triton('instance delete ' + INST, function () { + t.end(); + }); + }); }); diff --git a/test/integration/helpers.js b/test/integration/helpers.js index 6bce274..e7de302 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -121,6 +121,8 @@ function triton(args, opts, cb) { }, cb); } + + /* * triton wrapper that: * - tests no error is present @@ -172,6 +174,54 @@ function createClient() { } +/* + * Create a small instance. + */ +function createMachine(cb) { + function jsonToObjs(jsons) { + return jsons.split('\n').map(function (json) { + try { + return JSON.parse(json); + } catch (e) {} + }).filter(function (obj) { + return obj; + }); + } + + triton('package list -j', function (err, pkgJson) { + if (err) + return cb(err); + + // pick the smallest package (ram-wise) + var pkgs = jsonToObjs(pkgJson); + var pkg = pkgs.sort(function (x, y) { + return (x.memory > y.memory) ? 1 : -1; + })[0]; + + triton('image list -j', function (err2, imgJson) { + if (err2) + return cb(err2); + + // pick any smartos image + var imgs = jsonToObjs(imgJson); + var img = imgs.filter(function (i) { + return i.os === 'smartos'; + })[0]; + + triton('instance create -w ' + img.id + ' ' + pkg.id, + function (err3, stdout) { + if (err3) + return cb(err3); + + var match = stdout.match(/Created .+? \((.+)\)/); + var inst = match[1]; + cb(null, inst); + }); + }); + }); +} + + // --- exports module.exports = { @@ -179,5 +229,6 @@ module.exports = { triton: triton, safeTriton: safeTriton, createClient: createClient, + createMachine: createMachine, ifErr: testcommon.ifErr };