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}")
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
file = "/tmp/new_role.json"
File.open(file, "w") do |f|

View File

@ -10,7 +10,8 @@ module Devops
RESULT_CODES = {
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_bootstrap_unknown_error: 7,
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)
end
# there were changes in unbootstrap in other branches; leave it for now
def unbootstrap
k = Devops::Db.connector.key(@server.key)
cert_path = k.path
@ -335,35 +337,28 @@ module Devops
end
def deploy_server_with_tags tags, deploy_info
old_tags_str = nil
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)
return deploy_server(deploy_info) if tags.empty?
new_tags_str = tags.join(" ")
@out << "Server new tags: #{new_tags_str}\n"
cmd = knife_instance.tags_create(@server.chef_node_name, new_tags_str)
unless cmd[1]
m = "Error: Cannot add tags '#{new_tags_str}' to server '#{@server.chef_node_name}'"
DevopsLogger.logger.error(m)
@out << m + "\n"
return 3
end
DevopsLogger.logger.info("Set tags for '#{@server.chef_node_name}': #{new_tags_str}")
old_tags_str = knife_instance.tags_list(@server.chef_node_name).join(" ")
new_tags_str = tags.join(" ")
@out.puts "Temporarily changing tags (#{old_tags_str}) to (#{new_tags_str})"
unless knife_instance.swap_tags(@server.chef_node_name, old_tags_str, new_tags_str)
m = "Error: Cannot add tags '#{new_tags_str}' to server '#{@server.chef_node_name}'"
DevopsLogger.logger.error(m)
@out.puts m
return result_code(:server_cannot_update_tags)
end
DevopsLogger.logger.info("Set tags for '#{@server.chef_node_name}': #{new_tags_str}")
r = deploy_server deploy_info
unless tags.empty?
@out << "Restore tags\n"
cmd = knife_instance.tags_delete(@server.chef_node_name, new_tags_str)
DevopsLogger.logger.info("Deleted tags for #{@server.chef_node_name}: #{new_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}")
begin
deploy_result = deploy_server deploy_info
ensure
@out.puts "Restoring tags"
knife_instance.swap_tags(@server.chef_node_name, new_tags_str, old_tags_str)
DevopsLogger.logger.info("Restoring tags for #{@server.chef_node_name}: from #{new_tags_str} back to (#{old_tags_str})")
end
return r
deploy_result
end
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
it 'returns server_bootstrap_private_ip_unset error code' do
server.private_ip = nil
expect(subject).to eq 3
expect(subject).to eq 4
end
end
@ -366,4 +366,58 @@ RSpec.describe Devops::Executor::ServerExecutor, type: :executor, stubbed_connec
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

View File

@ -1,6 +1,5 @@
require 'spec_helper'
# не пытайся выделить в shared_specs, фигня выйдет
RSpec.describe Devops::Model::OpenstackProviderAccount, type: :model do
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
let(:stubbed_knife) { double('KnifeCommands') }
let(:stubbed_knife) { instance_double(KnifeCommands) }
before do
allow(KnifeFactory).to receive(:instance) { stubbed_knife }
end