fuel-astute/spec/unit/puppet_task_spec.rb

222 lines
6.4 KiB
Ruby

# Copyright 2015 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.
require File.join(File.dirname(__FILE__), '../spec_helper')
describe Astute::PuppetTask do
include SpecHelpers
let(:node) do
{
'uid' => '45',
'priority' => 200,
'role' => 'ceph',
'tasks' => [
{
'priority' => 100,
'type' => 'puppet',
'uids' => ['45']
},
{
'priority' => 300,
'type' => 'puppet',
'uids' => ['45']
}
]
}
end
let(:ctx) {
ctx = mock
ctx.stubs(:task_id)
ctx.stubs(:deploy_log_parser).returns(Astute::LogParser::NoParsing.new)
ctx.stubs(:status).returns({})
reporter = mock
reporter.stubs(:report)
up_reporter = Astute::ProxyReporter::DeploymentProxyReporter.new(reporter, [node])
ctx.stubs(:reporter).returns(up_reporter)
ctx
}
let(:puppet_task) { Astute::PuppetTask.new(ctx, node)}
let(:puppet_task_wo_retries) { Astute::PuppetTask.new(ctx, node, {:retries=>0})}
let(:puppet_task_success_retries) { Astute::PuppetTask.new(ctx, node, {
:retries=>1,
:puppet_manifest=>nil,
:puppet_modules=>nil,
:cwd=>nil,
:timeout=>nil,
:puppet_debug=>false,
:succeed_retries=>1
})
}
let(:mco_puppet_stopped) do
{
:changes => {"total" => 1},
:time => {"last_run" => 1358425701},
:resources => {"failed" => 0},
:status => "stopped",
:enabled => 1,
:stopped => 1,
:idling => 0,
:running => 0,
:runtime => 1358425701
}
end
let(:mco_puppet_running) do
mco_puppet_stopped.merge(
:status => 'running',
:running => 1,
:stopped => 0
)
end
let(:mco_puppet_fail) do
mco_puppet_running.merge(
:runtime => 1358426000,
:time => {"last_run" => 1358426000},
:resources => {"failed" => 1}
)
end
let(:mco_puppet_failed) do
mco_puppet_fail.merge(
:status => 'stopped',
:stopped => 1,
:running => 0
)
end
let(:mco_puppet_finished) do
mco_puppet_stopped.merge(
:time => {'last_run' => 1358428000},
:status => 'stopped'
)
end
let(:mco_puppet_idling) do
mco_puppet_stopped.merge(
:status => 'idling',
:running => 0,
:stopped => 0,
:idling => 1
)
end
describe "#run" do
it 'run puppet using mcollective' do
puppet_task.expects(:puppet_status).returns(mco_puppet_stopped)
puppet_task.expects(:puppet_run)
puppet_task.run
end
end #run
describe "#status" do
before(:each) do
ctx.stubs(:report_and_update_status)
end
it 'check puppet using mcollective' do
puppet_task.stubs(:puppet_status).returns(mco_puppet_stopped)
.then.returns(mco_puppet_running)
.then.returns(mco_puppet_finished)
puppet_task.expects(:puppet_run)
puppet_task.run
end
it 'return error for node if puppet failed (a cycle w/o any transitional states)' do
puppet_task_wo_retries.stubs(:puppet_status).returns(mco_puppet_stopped)
.then.returns(mco_puppet_failed)
puppet_task_wo_retries.expects(:puppet_run)
puppet_task_wo_retries.run
expect(puppet_task_wo_retries.status).to eql('error')
end
it 'retries to run puppet if it fails and return middle status' do
puppet_task.stubs(:puppet_status).returns(mco_puppet_stopped)
.then.returns(mco_puppet_failed)
.then.returns(mco_puppet_failed)
.then.returns(mco_puppet_finished)
puppet_task.expects(:puppet_run).times(2)
puppet_task.run
expect(puppet_task.status).to eql('deploying')
expect(puppet_task.status).to eql('ready')
end
it "return error for node if puppet failed (a cycle with one running state only)" do
puppet_task_wo_retries.stubs(:puppet_status).returns(mco_puppet_stopped)
.then.returns(mco_puppet_running)
.then.returns(mco_puppet_running)
.then.returns(mco_puppet_fail)
.then.returns(mco_puppet_failed)
puppet_task_wo_retries.expects(:puppet_run)
puppet_task_wo_retries.run
expect(puppet_task_wo_retries.status).to eql('deploying')
expect(puppet_task_wo_retries.status).to eql('deploying')
expect(puppet_task_wo_retries.status).to eql('deploying')
expect(puppet_task_wo_retries.status).to eql('error')
end
it "error status for node if puppet failed (a cycle w/o idle and finishing states)" do
puppet_task_wo_retries.stubs(:puppet_status).returns(mco_puppet_stopped)
.then.returns(mco_puppet_running)
.then.returns(mco_puppet_failed)
puppet_task_wo_retries.expects(:puppet_run)
puppet_task_wo_retries.run
expect(puppet_task_wo_retries.status).to eql('deploying')
expect(puppet_task_wo_retries.status).to eql('error')
end
it "retries to run puppet if it idling" do
puppet_task.stubs(:puppet_status).returns(mco_puppet_stopped)
.then.returns(mco_puppet_idling)
.then.returns(mco_puppet_stopped)
.then.returns(mco_puppet_running)
.then.returns(mco_puppet_finished)
puppet_task.expects(:puppet_run)
puppet_task.run
expect(puppet_task.status).to eql('deploying')
expect(puppet_task.status).to eql('ready')
end
it "error status for node if puppet failed (mcollective retries)" do
puppet_task.stubs(:puppet_status).raises(Astute::MClientTimeout)
puppet_task.stubs(:puppetd_runonce)
puppet_task.run
expect(puppet_task.status).to eql('error')
end
it 'status will retry successful puppet task if configured' do
puppet_task_success_retries.stubs(:puppet_status).returns(mco_puppet_finished)
puppet_task_success_retries.stubs(:node_status).returns('succeed')
puppet_task_success_retries.expects(:puppetd_runonce).times(2)
puppet_task_success_retries.run
puppet_task_success_retries.status
end
end #status
end