1 |
|
2 | {exec} = require "child_process"
|
3 |
|
4 | knife = "knife"
|
5 | buildKnifeCommand = (role, env) ->
|
6 | if env
|
7 | "#{knife} search node --format=json 'role:#{role} AND chef_environment:#{env}' --format=json"
|
8 |
|
9 |
|
10 | getNodesByRoleAndEnv = (role, env, cb) ->
|
11 | exec buildKnifeCommand(role, env), (err, stdout) ->
|
12 | return cb err if err?
|
13 | nodes = JSON.parse stdout
|
14 | cb null, nodes
|
15 |
|
16 | defaultFindHost = (member) ->
|
17 | member.automatic.cloud.public_hostname
|
18 |
|
19 | module.exports = (opts, cb) ->
|
20 | return cb new Error "no role specified" if not opts.role
|
21 | findHost = opts.findHost || defaultFindHost
|
22 | knife = opts.knifePath || knife
|
23 |
|
24 | env = opts.env || "_default"
|
25 | getNodesByRoleAndEnv opts.role, env, (err, nodes) ->
|
26 | return cb err if err?
|
27 |
|
28 | return cb new Error("no hosts found!") if not nodes.results
|
29 | members = nodes.rows
|
30 | hosts = []
|
31 | for member in members
|
32 | try
|
33 | hosts.push findHost(member)
|
34 | catch error
|
35 | return cb new Error("failed to find the hostname using method:\n #{findHost.toString()}")
|
36 |
|
37 | cb null, hosts
|