[astute] Support of SimplePuppet in bin/astute, example provided

This commit is contained in:
Mike Scherbakov 2013-01-24 11:05:30 +04:00 committed by default
parent 3bcc57d373
commit ecdf8f6f19
8 changed files with 37 additions and 35 deletions

View File

@ -41,6 +41,15 @@ Astute.logger = Logger.new(STDOUT) if opts[:verbose]
environment = YAML.load_file(opts[:filename])
orchestrator = Astute::Orchestrator.new(nil, log_parsing=false)
case environment['attributes']['deployment_engine']
when 'nailyfact'
deploy_engine = Astute::DeploymentEngine::NailyFact
when 'simplepuppet'
deploy_engine = Astute::DeploymentEngine::SimplePuppet # It just calls puppet and doesn't do any magic
else
deploy_engine = nil # Orchestrator will use it's default
end
orchestrator = Astute::Orchestrator.new(deploy_engine, log_parsing=false)
orchestrator.deploy(reporter, environment['task_uuid'], environment['nodes'], environment['attributes'])
#orchestrator.verify_networks(reporter, task_id, nodes, networks)

View File

@ -0,0 +1,12 @@
---
nodes:
- status: provisioned
role: controller
uid: devnailgun.mirantis.com
- status: provisioned
role: compute
uid: devnailgun.mirantis.com
attributes:
deployment_mode: multinode_compute
deployment_engine: simplepuppet
task_uuid: deployment_task

View File

@ -59,6 +59,8 @@ nodes:
uid: devnailgun.mirantis.com
mac: 52:54:00:50:91:DD
attributes:
deployment_mode: multinode_compute
deployment_engine: nailyfact
glance:
db_password: glance
user_password: glance

View File

@ -7,15 +7,17 @@ PUPPET_FADE_TIMEOUT = 60
module Astute
class DeploymentEngine
def initialize(context)
if self.class.superclass.name == 'Object'
raise "Instantiation of this superclass is not allowed. Please subclass from #{self.class.name}."
end
@ctx = context
end
def deploy(nodes, attrs)
# See implementation in subclasses, this may be everriden
attrs['deployment_mode'] ||= 'multinode_compute' # simple multinode deployment is the default
nodes.each {|n| n['uid'] = n['uid'].to_s } # It may fail if uid is Fixnum
Astute.logger.info "Deployment mode #{attrs['deployment_mode']}, using #{self.class} for deployment."
attrs_for_mode = self.send("attrs_#{attrs['deployment_mode']}", nodes, attrs)
result = self.send("deploy_#{attrs['deployment_mode']}", nodes, attrs_for_mode)
Astute.logger.info "Deployment mode #{attrs['deployment_mode']}"
result = self.send("deploy_#{attrs['deployment_mode']}", nodes, attrs)
end
def method_missing(method, *args)

View File

@ -1,5 +1,10 @@
class Astute::DeploymentEngine::NailyFact < Astute::DeploymentEngine
def deploy(nodes, attrs)
attrs_for_mode = self.send("attrs_#{attrs['deployment_mode']}", nodes, attrs)
super(nodes, attrs_for_mode)
end
def create_facts(node, attrs)
metapublisher = Astute::Metadata.method(:publish_facts)
# calculate_networks method is common and you can find it in superclass

View File

@ -3,8 +3,8 @@ class Astute::DeploymentEngine::SimplePuppet < Astute::DeploymentEngine
# with all required parameters for modules
def deploy_piece(nodes, *args)
return false unless validate_nodes(nodes)
@ctx.reporter.report nodes_status(nodes, 'deploying')
Astute::PuppetdDeployer.deploy(@ctx, nodes)
@ctx.reporter.report nodes_status(nodes, 'ready')
nodes_roles = nodes.map { |n| { n['uid'] => n['role'] } }
Astute.logger.info "#{@ctx.task_id}: Finished deployment of nodes => roles: #{nodes_roles.inspect}"
end

View File

@ -26,6 +26,7 @@ module Astute
proxy_reporter = ProxyReporter.new(up_reporter)
context = Context.new(task_id, proxy_reporter, @log_parser)
deploy_engine_instance = @deploy_engine.new(context)
Astute.logger.info "Using #{deploy_engine_instance.class} for deployment."
deploy_engine_instance.deploy(nodes, attrs)
end

View File

@ -1,29 +0,0 @@
#!/usr/bin/env rspec
require File.join(File.dirname(__FILE__), "..", "spec_helper")
describe "DeploymentEngine" do
context "When deploy is called, it" do
before(:each) do
@ctx = mock
@deploy_engine = Astute::DeploymentEngine.new(@ctx)
end
it "should call valid method depends on attrs" do
nodes = [{'uid' => 1}]
attrs = {'deployment_mode' => 'ha_compute'}
attrs_modified = attrs.merge({'some' => 'somea'})
@deploy_engine.expects(:attrs_ha_compute).with(nodes, attrs).returns(attrs_modified)
@deploy_engine.expects(:deploy_ha_compute).with(nodes, attrs_modified)
# All implementations of deploy_piece go to subclasses
@deploy_engine.respond_to?(:deploy_piece).should be_false
@deploy_engine.deploy(nodes, attrs)
end
it "should raise an exception if deployment mode is unsupported" do
nodes = [{'uid' => 1}]
attrs = {'deployment_mode' => 'unknown'}
expect {@deploy_engine.deploy(nodes, attrs)}.to raise_exception(/Method attrs_unknown is not implemented/)
end
end
end