83 lines
2.8 KiB
Ruby
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
|