fuel-astute/lib/astute/deploy_actions.rb

216 lines
5.3 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
class DeployActions
def initialize(deployment_info, context)
@deployment_info = deployment_info
@context = context
@actions = []
end
def process
@actions.each { |action| action.process(@deployment_info, @context) }
end
end
class PreDeployActions < DeployActions
def initialize(deployment_info, context)
super
@actions = [
ConnectFacts.new
]
end
end
class GranularPreDeployActions < DeployActions
def initialize(deployment_info, context)
super
@actions = [
ConnectFacts.new
]
end
end
class PostDeployActions < DeployActions
def initialize(deployment_info, context)
super
@actions = [
PostPatchingHa.new
]
end
end
class GranularPostDeployActions < DeployActions
def initialize(deployment_info, context)
super
@actions = [
PostPatchingHa.new
]
end
end
class PreNodeActions
def initialize(context)
@node_uids = []
@context = context
@actions = [
PrePatchingHa.new,
StopOSTServices.new,
PrePatching.new
]
end
def process(deployment_info)
nodes_to_process = deployment_info.select { |n| !@node_uids.include?(n['uid']) }
return if nodes_to_process.empty?
@actions.each { |action| action.process(nodes_to_process, @context) }
@node_uids += nodes_to_process.map { |n| n['uid'] }
end
end
class GranularPreNodeActions
def initialize(context)
@node_uids = []
@context = context
@actions = [
PrePatchingHa.new,
StopOSTServices.new,
PrePatching.new
]
end
def process(deployment_info)
nodes_to_process = deployment_info.select { |n| !@node_uids.include?(n['uid']) }
return if nodes_to_process.empty?
@actions.each { |action| action.process(nodes_to_process, @context) }
@node_uids += nodes_to_process.map { |n| n['uid'] }
end
end
class PreDeploymentActions < DeployActions
def initialize(deployment_info, context)
super
@actions = [
SyncTime.new,
GenerateSshKeys.new,
GenerateKeys.new,
UploadSshKeys.new,
UploadKeys.new,
UpdateRepoSources.new,
SyncPuppetStuff.new,
SyncTasks.new,
EnablePuppetDeploy.new,
UploadFacts.new,
InitialConnectFacts.new
]
end
end
class GranularPreDeploymentActions < DeployActions
def initialize(deployment_info, context)
super
@actions = [
EnablePuppetDeploy.new,
UploadFacts.new,
InitialConnectFacts.new
]
end
end
class TaskPreDeploymentActions < DeployActions
def initialize(deployment_info, context)
super
@actions = [
EnablePuppetDeploy.new,
UploadFacts.new,
InitialConnectFacts.new
]
end
end
class PostDeploymentActions < DeployActions
def initialize(deployment_info, context)
super
@actions = [
UpdateNoQuorumPolicy.new,
UploadCirrosImage.new,
RestartRadosgw.new,
UpdateClusterHostsInfo.new
]
end
end
class DeployAction
def process(deployment_info, context)
raise "Should be implemented!"
end
def run_shell_command(context, node_uids, cmd, timeout=60)
shell = MClient.new(context,
'execute_shell_command',
node_uids,
check_result=true,
timeout=timeout,
retries=1)
#TODO: return result for all nodes not only for first
response = shell.execute(:cmd => cmd).first
Astute.logger.debug("#{context.task_id}: cmd: #{cmd}
stdout: #{response[:data][:stdout]}
stderr: #{response[:data][:stderr]}
exit code: #{response[:data][:exit_code]}")
response
rescue MClientTimeout, MClientError => e
Astute.logger.error("#{context.task_id}: cmd: #{cmd}
mcollective error: #{e.message}")
{:data => {}}
end
def only_uniq_nodes(nodes)
nodes.uniq { |n| n['uid'] }
end
# Prevent high load for tasks
def perform_with_limit(nodes, &block)
nodes.each_slice(Astute.config[:max_nodes_per_call]) do |part|
block.call(part)
end
end
end # DeployAction
class PreDeployAction < DeployAction; end
class PostDeployAction < DeployAction; end
class PreNodeAction < DeployAction; end
class PostNodeAction < DeployAction; end
class PreDeploymentAction < DeployAction; end
class PostDeploymentAction < DeployAction; end
end