1 |
|
2 | (function() {
|
3 | var buildKnifeCommand, defaultFindHost, exec, getNodesByRoleAndEnv, knife;
|
4 |
|
5 | exec = require("child_process").exec;
|
6 |
|
7 | knife = "knife";
|
8 |
|
9 | buildKnifeCommand = function(role, env) {
|
10 | if (env) {
|
11 | return "" + knife + " search node --format=json 'role:" + role + " AND chef_environment:" + env + "' --format=json";
|
12 | }
|
13 | };
|
14 |
|
15 | getNodesByRoleAndEnv = function(role, env, cb) {
|
16 | return exec(buildKnifeCommand(role, env), function(err, stdout) {
|
17 | var nodes;
|
18 | if (err != null) {
|
19 | return cb(err);
|
20 | }
|
21 | nodes = JSON.parse(stdout);
|
22 | return cb(null, nodes);
|
23 | });
|
24 | };
|
25 |
|
26 | defaultFindHost = function(member) {
|
27 | return member.automatic.cloud.public_hostname;
|
28 | };
|
29 |
|
30 | module.exports = function(opts, cb) {
|
31 | var env, findHost;
|
32 | if (!opts.role) {
|
33 | return cb(new Error("no role specified"));
|
34 | }
|
35 | findHost = opts.findHost || defaultFindHost;
|
36 | knife = opts.knifePath || knife;
|
37 | env = opts.env || "_default";
|
38 | return getNodesByRoleAndEnv(opts.role, env, function(err, nodes) {
|
39 | var hosts, member, members, _i, _len;
|
40 | if (err != null) {
|
41 | return cb(err);
|
42 | }
|
43 | if (!nodes.results) {
|
44 | return cb(new Error("no hosts found!"));
|
45 | }
|
46 | members = nodes.rows;
|
47 | hosts = [];
|
48 | for (_i = 0, _len = members.length; _i < _len; _i++) {
|
49 | member = members[_i];
|
50 | try {
|
51 | hosts.push(findHost(member));
|
52 | } catch (error) {
|
53 | return cb(new Error("failed to find the hostname using method:\n " + (findHost.toString())));
|
54 | }
|
55 | }
|
56 | return cb(null, hosts);
|
57 | });
|
58 | };
|
59 |
|
60 | }).call(this);
|