fuel-astute/lib/astute/image_provision.rb

83 lines
2.8 KiB
Ruby

# Copyright 2013 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
module Astute
module ImageProvision
def self.provision(ctx, nodes)
failed_uids = []
begin
# uploading provisioning data "/tmp/provision.json"
nodes.each { |node| upload_provision(ctx, node) }
# running provisioning script
results = run_provision(ctx, nodes)
results.each do |node|
unless node.results[:data][:exit_code] == 0
failed = node.results[:sender]
Astute.logger.error("#{ctx.task_id}: Provision command returned non zero exit code on node: #{failed}")
failed_uids << failed
end
end
rescue => e
msg = "Error while provisioning: message: #{e.message} trace: #{e.format_backtrace}"
Astute.logger.error("#{ctx.task_id}: #{msg}")
report_error(ctx, msg)
end
failed_uids
end
def self.upload_provision(ctx, node)
Astute.logger.debug "#{ctx.task_id}: uploading provision data: #{node.to_json}"
client = MClient.new(ctx, "uploadfile", [node['uid']])
client.upload(:path => '/tmp/provision.json',
:content => node.to_json,
:user_owner => 'root',
:group_owner => 'root',
:overwrite => true)
end
def self.run_provision(ctx, nodes)
uids = nodes.map { |node| node['uid'] }
Astute.logger.debug "#{ctx.task_id}: running provision script: #{uids.join(', ')}"
shell = MClient.new(ctx, 'execute_shell_command', uids, check_result=true, timeout=3600, retries=1)
shell.execute(:cmd => 'flock -n /var/lock/provision.lock /usr/bin/provision')
end
def self.report_error(ctx, msg)
ctx.reporter.report({'status' => 'error', 'error' => msg, 'progress' => 100})
end
def self.reboot(ctx, node_ids, task_id="reboot_provisioned_nodes")
Astute::NailgunHooks.new(
[{
"priority" => 100,
"type" => "reboot",
"fail_on_error" => false,
"id" => task_id,
"uids" => node_ids,
"parameters" => {
"timeout" => Astute.config.reboot_timeout
}
}],
ctx,
'provision'
).process
end
end
end