t.test('setup listener', function (t2) { var count = 0; t2.plan(CF_RESOURCES.length); FEED = mod_changefeed.createListener({ log: LOG, url: 'http://localhost:' + NAPI.client.url.port, instance: INSTUUID, service: 'napi-tests', resources: CF_RESOURCES, backoff: { maxTimeout: 10000, minTimeout: 2000, retries: Infinity } }); FEED.on('bootstrap', function (bs) { t2.ok(bs, 'bootstrap object returned'); if (++count === CF_RESOURCES.length) { t2.end(); } }); FEED.register(); });
exports.listen_for_destroy = function (t) { t.expect(4); var opts = { path: '/vms/' + VM.uuid }; var listener = changefeed.createListener(listenerOpts); listener.register(); listener.on('bootstrap', function () { client.del(opts, function (err, req, res, body) { common.ifError(t, err); t.equal(res.statusCode, 202, '202 Accepted'); common.checkHeaders(t, res.headers); t.ok(body, 'bootstrap body'); }); }); var noStateReceived = true; listener.on('readable', function () { var changeItem = listener.read(); var changeKind = changeItem.changeKind; if (noStateReceived && changeItem.changedResourceId === VM.uuid && changeKind.subResources && changeKind.subResources.indexOf('destroyed') !== -1) { t.ok(true, 'destroyed received'); noStateReceived = false; listener._endSocket(); t.done(); } }); };
exports.listen_for_tags = function (t) { t.expect(2); VM.tags.test_tag = 'test'; var opts = { path: '/vms/' + VM.uuid + '?server_uuid=' + VM.server_uuid }; var listener = changefeed.createListener(listenerOpts); listener.register(); listener.on('bootstrap', function () { client.put(opts, VM, function (err, req, res) { common.ifError(t, err); }); }); var noStateReceived = true; listener.on('readable', function () { var changeItem = listener.read(); var changeKind = changeItem.changeKind; if (noStateReceived && changeItem.changedResourceId === VM.uuid && changeKind.subResources && changeKind.subResources.indexOf('tags') !== -1) { t.ok(true, 'tags received'); noStateReceived = false; listener._endSocket(); t.done(); } }); };
exports.listen_for_reboot_state = function (t) { t.expect(5); var params = { action: 'reboot' }; var opts = createOpts('/vms/' + VM.uuid + '?action=reboot', params); var listener = changefeed.createListener(listenerOpts); listener.register(); listener.on('bootstrap', function () { client.post(opts, params, function (err, req, res, body) { common.ifError(t, err); t.equal(res.statusCode, 202, '202 Accepted'); common.checkHeaders(t, res.headers); t.ok(body, 'bootstrap body'); t.ok(body.job_uuid, 'job_uuid: ' + body.job_uuid); }); }); var noStateReceived = true; listener.on('readable', function () { var changeItem = listener.read(); var changeKind = changeItem.changeKind; if (noStateReceived && changeItem.changedResourceId === VM.uuid && changeKind.subResources && changeKind.subResources.indexOf('state') !== -1) { t.ok(true, 'state received'); noStateReceived = false; listener._endSocket(); t.done(); } }); };
exports.create_vm = function (t) { t.expect(5); var md = { foo: 'bar', credentials: JSON.stringify({ 'user_pw': '12345678' }) }; jobLocation = null; VM = { alias: 'sdcvmapitest_create_vm_' + process.pid, uuid: uuid.create(), owner_uuid: CUSTOMER, image_uuid: IMAGE, networks: [ { uuid: ADMIN_NETWORK.uuid } ], brand: 'joyent-minimal', billing_id: '00000000-0000-0000-0000-000000000000', ram: 64, quota: 10, cpu_cap: 100, customer_metadata: md, creator_uuid: CUSTOMER, role_tags: ['fd48177c-d7c3-11e3-9330-28cfe91a33c9'] }; var opts = createOpts('/vms', VM); var listener = changefeed.createListener(listenerOpts); listener.register(); listener.on('bootstrap', function () { client.post(opts, VM, function (err, req, res, body) { common.ifError(t, err); t.equal(res.statusCode, 202, '202 Accepted'); common.checkHeaders(t, res.headers); t.ok(res.headers['workflow-api'], 'workflow-api header'); t.ok(body, 'vm ok job: ' + body.job_uuid); jobLocation = '/jobs/' + body.job_uuid; done(); }); }); listener.on('readable', function () { var changeItem; while ((changeItem = listener.read())) { processChangeItem(changeItem); } }); var stateReceived = false; /* * It doesn't matter if the request return or the change feed event occurs * first as long as they both occur. */ function done() { if (jobLocation !== null && stateReceived) { t.done(); } } function processChangeItem(changeItem) { var changeKind = changeItem.changeKind; if (!stateReceived && changeItem.changedResourceId === VM.uuid && changeKind.subResources && changeKind.subResources.indexOf('state') !== -1) { t.ok(true, 'state received'); stateReceived = true; listener._endSocket(); done(); } } };