216 lines
5.3 KiB
Ruby
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
|