add specs

This commit is contained in:
Anton Chuchkalov 2016-01-14 13:43:42 +03:00
parent 970d845801
commit 170863809f
5 changed files with 84 additions and 29 deletions

View File

@ -38,6 +38,13 @@ class KnifeCommands
knife("tag delete #{name} #{tagsStr}") knife("tag delete #{name} #{tagsStr}")
end end
# extracted from server_executor.rb
def swap_tags(name, from, to)
tags_delete(name, from)
result = tags_create(name, to)
!!result[1]
end
def create_role role_name, project, env def create_role role_name, project, env
file = "/tmp/new_role.json" file = "/tmp/new_role.json"
File.open(file, "w") do |f| File.open(file, "w") do |f|

View File

@ -10,7 +10,8 @@ module Devops
RESULT_CODES = { RESULT_CODES = {
server_bootstrap_fail: 2, server_bootstrap_fail: 2,
server_bootstrap_private_ip_unset: 3, server_cannot_update_tags: 3,
server_bootstrap_private_ip_unset: 4,
server_not_in_chef_nodes: 5, server_not_in_chef_nodes: 5,
server_bootstrap_unknown_error: 7, server_bootstrap_unknown_error: 7,
deploy_unknown_error: 6, deploy_unknown_error: 6,
@ -307,6 +308,7 @@ module Devops
knife_instance.chef_node_list.include?(@server.chef_node_name) and knife_instance.chef_client_list.include?(@server.chef_node_name) knife_instance.chef_node_list.include?(@server.chef_node_name) and knife_instance.chef_client_list.include?(@server.chef_node_name)
end end
# there were changes in unbootstrap in other branches; leave it for now
def unbootstrap def unbootstrap
k = Devops::Db.connector.key(@server.key) k = Devops::Db.connector.key(@server.key)
cert_path = k.path cert_path = k.path
@ -335,35 +337,28 @@ module Devops
end end
def deploy_server_with_tags tags, deploy_info def deploy_server_with_tags tags, deploy_info
old_tags_str = nil return deploy_server(deploy_info) if tags.empty?
new_tags_str = nil
unless tags.empty?
old_tags_str = knife_instance.tags_list(@server.chef_node_name).join(" ")
@out << "Server tags: #{old_tags_str}\n"
knife_instance.tags_delete(@server.chef_node_name, old_tags_str)
new_tags_str = tags.join(" ") old_tags_str = knife_instance.tags_list(@server.chef_node_name).join(" ")
@out << "Server new tags: #{new_tags_str}\n" new_tags_str = tags.join(" ")
cmd = knife_instance.tags_create(@server.chef_node_name, new_tags_str)
unless cmd[1] @out.puts "Temporarily changing tags (#{old_tags_str}) to (#{new_tags_str})"
m = "Error: Cannot add tags '#{new_tags_str}' to server '#{@server.chef_node_name}'" unless knife_instance.swap_tags(@server.chef_node_name, old_tags_str, new_tags_str)
DevopsLogger.logger.error(m) m = "Error: Cannot add tags '#{new_tags_str}' to server '#{@server.chef_node_name}'"
@out << m + "\n" DevopsLogger.logger.error(m)
return 3 @out.puts m
end return result_code(:server_cannot_update_tags)
DevopsLogger.logger.info("Set tags for '#{@server.chef_node_name}': #{new_tags_str}")
end end
DevopsLogger.logger.info("Set tags for '#{@server.chef_node_name}': #{new_tags_str}")
r = deploy_server deploy_info begin
deploy_result = deploy_server deploy_info
unless tags.empty? ensure
@out << "Restore tags\n" @out.puts "Restoring tags"
cmd = knife_instance.tags_delete(@server.chef_node_name, new_tags_str) knife_instance.swap_tags(@server.chef_node_name, new_tags_str, old_tags_str)
DevopsLogger.logger.info("Deleted tags for #{@server.chef_node_name}: #{new_tags_str}") DevopsLogger.logger.info("Restoring tags for #{@server.chef_node_name}: from #{new_tags_str} back to (#{old_tags_str})")
cmd = knife_instance.tags_create(@server.chef_node_name, old_tags_str)
DevopsLogger.logger.info("Set tags for #{@server.chef_node_name}: #{old_tags_str}")
end end
return r deploy_result
end end
def deploy_server deploy_info def deploy_server deploy_info

View File

@ -191,7 +191,7 @@ RSpec.describe Devops::Executor::ServerExecutor, type: :executor, stubbed_connec
context "when server's private ip is unset" do context "when server's private ip is unset" do
it 'returns server_bootstrap_private_ip_unset error code' do it 'returns server_bootstrap_private_ip_unset error code' do
server.private_ip = nil server.private_ip = nil
expect(subject).to eq 3 expect(subject).to eq 4
end end
end end
@ -366,4 +366,58 @@ RSpec.describe Devops::Executor::ServerExecutor, type: :executor, stubbed_connec
end end
end end
describe '#deploy_server_with_tags', stubbed_knife: true do
let(:current_tags) { @current_tags }
let(:initial_tags) { %w(a b) }
let(:joined_initial_tags) { initial_tags.join(' ') }
let(:given_tags) { %w(c d) }
let(:joined_given_tags) { given_tags.join(' ') }
subject { executor.deploy_server_with_tags(given_tags, {}) }
before do
@current_tags = initial_tags.dup
allow(stubbed_knife).to receive(:tags_list) { @current_tags }
allow(stubbed_knife).to receive(:swap_tags) do |_, tags_to_delete, tags_to_add|
@current_tags -= tags_to_delete.split
@current_tags += tags_to_add.split
end
allow(executor).to receive(:deploy_server)
end
context 'when tags are empty' do
it 'just deploys server' do
expect(executor).to receive(:deploy_server)
expect(stubbed_knife).not_to receive(:swap_tags)
executor.deploy_server_with_tags([], {})
end
end
context 'when tags are not empty' do
it 'temporarily swaps current_tags with given ones, deploys server and then restores tags' do
expect(stubbed_knife).to receive(:tags_list).ordered
expect(stubbed_knife).to receive(:swap_tags).with(instance_of(String), joined_initial_tags, joined_given_tags).ordered
expect(executor).to receive(:deploy_server).ordered
expect(stubbed_knife).to receive(:swap_tags).with(instance_of(String), joined_given_tags, joined_initial_tags).ordered
subject
end
end
context 'if error occures during deploy' do
it 'restores tags anyway' do
allow(executor).to receive(:deploy_server) { raise }
expect {
subject
}.to raise_error StandardError
expect(current_tags).to eq initial_tags
end
end
context 'if cannot add tags to server' do
it 'returns :server_cannot_update_tags code' do
allow(stubbed_knife).to receive(:swap_tags) { false }
expect(subject).to eq 3
end
end
end
end end

View File

@ -1,6 +1,5 @@
require 'spec_helper' require 'spec_helper'
# не пытайся выделить в shared_specs, фигня выйдет
RSpec.describe Devops::Model::OpenstackProviderAccount, type: :model do RSpec.describe Devops::Model::OpenstackProviderAccount, type: :model do
let(:provider_account) { build(:openstack_provider_account) } let(:provider_account) { build(:openstack_provider_account) }

View File

@ -1,5 +1,5 @@
RSpec.shared_context 'stubbed calls to KnifeFactory.instance', stubbed_knife: true do RSpec.shared_context 'stubbed calls to KnifeFactory.instance', stubbed_knife: true do
let(:stubbed_knife) { double('KnifeCommands') } let(:stubbed_knife) { instance_double(KnifeCommands) }
before do before do
allow(KnifeFactory).to receive(:instance) { stubbed_knife } allow(KnifeFactory).to receive(:instance) { stubbed_knife }
end end