add specs
This commit is contained in:
parent
970d845801
commit
170863809f
@ -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|
|
||||
|
||||
@ -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?
|
||||
|
||||
old_tags_str = knife_instance.tags_list(@server.chef_node_name).join(" ")
|
||||
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]
|
||||
|
||||
@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 << m + "\n"
|
||||
return 3
|
||||
@out.puts m
|
||||
return result_code(:server_cannot_update_tags)
|
||||
end
|
||||
DevopsLogger.logger.info("Set tags for '#{@server.chef_node_name}': #{new_tags_str}")
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
@ -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
|
||||
@ -1,6 +1,5 @@
|
||||
require 'spec_helper'
|
||||
|
||||
# не пытайся выделить в shared_specs, фигня выйдет
|
||||
RSpec.describe Devops::Model::OpenstackProviderAccount, type: :model do
|
||||
let(:provider_account) { build(:openstack_provider_account) }
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user