19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/chef/knife/roleflip.rb', line 19
def run
unless @role = name_args[0]
ui.error "You need to specify a role to search against"
exit 1
end
unless @new_env = name_args[1]
ui.error "You need to specify an environment to move nodes to"
exit 1
end
puts "Checking for a role called #{@role} to flip nodes from..."
searcher = Chef::Search::Query.new
result = searcher.search(:role, "name:#{@role}")
knife_search = Chef::Knife::Search.new
env = result.first.first
if env.nil?
puts "Could not find an role named #{@role}. Can't update nodes which run a non-existant role!"
exit 1
else
puts "Found!\n"
end
puts "Checking for an environment called #{@new_env} to update to..."
searcher = Chef::Search::Query.new
result = searcher.search(:environment, "name:#{@new_env}")
knife_search = Chef::Knife::Search.new
env = result.first.first
if env.nil?
puts "Could not find an environment named #{@new_env}. Please create it before trying to put nodes in it!"
exit 1
else
puts "Found!\n"
end
q_nodes = Chef::Search::Query.new
node_query = "role:#{@role}"
query_nodes = URI.escape(node_query,
Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
result_items = []
result_count = 0
begin
q_nodes.search('node', query_nodes) do |node_item|
node_item.chef_environment(@new_env)
node_item.save
formatted_item_node = format_for_display(node_item)
if formatted_item_node.respond_to?(:has_key?) && !formatted_item_node.has_key?('id')
formatted_item_node.normal['id'] = node_item.has_key?('id') ? node_item['id'] : node_item.name
end
ui.msg("Moving #{formatted_item_node.name} to environment #{@new_env}...")
result_items << formatted_item_node
result_count += 1
end
rescue Net::HTTPServerException => e
msg = Chef::JSONCompat.from_json(e.response.body)["error"].first
ui.error("knife role flip failed: #{msg}")
exit 1
end
if ui.interchange?
output({:results => result_count, :rows => result_items})
else
ui.msg "#{result_count} Nodes updated"
end
end
|