From 170863809f32fa2e5b0630a0e904c0abb6a621b2 Mon Sep 17 00:00:00 2001 From: Anton Chuchkalov Date: Thu, 14 Jan 2016 13:43:42 +0300 Subject: [PATCH] add specs --- devops-service/commands/knife_commands.rb | 7 +++ .../lib/executors/server_executor.rb | 47 +++++++--------- .../spec/executors/server_executor_spec.rb | 56 ++++++++++++++++++- .../openstack_provider_account_spec.rb | 1 - .../spec/shared_contexts/stubbed_knife.rb | 2 +- 5 files changed, 84 insertions(+), 29 deletions(-) diff --git a/devops-service/commands/knife_commands.rb b/devops-service/commands/knife_commands.rb index 45c4835..73c41bf 100644 --- a/devops-service/commands/knife_commands.rb +++ b/devops-service/commands/knife_commands.rb @@ -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| diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index a544990..c28356a 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -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 diff --git a/devops-service/spec/executors/server_executor_spec.rb b/devops-service/spec/executors/server_executor_spec.rb index 3a2f3fe..16c8441 100644 --- a/devops-service/spec/executors/server_executor_spec.rb +++ b/devops-service/spec/executors/server_executor_spec.rb @@ -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 \ No newline at end of file diff --git a/devops-service/spec/models/provider_account/openstack_provider_account_spec.rb b/devops-service/spec/models/provider_account/openstack_provider_account_spec.rb index e601778..97aabf6 100644 --- a/devops-service/spec/models/provider_account/openstack_provider_account_spec.rb +++ b/devops-service/spec/models/provider_account/openstack_provider_account_spec.rb @@ -1,6 +1,5 @@ require 'spec_helper' -# не пытайся выделить в shared_specs, фигня выйдет RSpec.describe Devops::Model::OpenstackProviderAccount, type: :model do let(:provider_account) { build(:openstack_provider_account) } diff --git a/devops-service/spec/shared_contexts/stubbed_knife.rb b/devops-service/spec/shared_contexts/stubbed_knife.rb index cd49d05..042bcc7 100644 --- a/devops-service/spec/shared_contexts/stubbed_knife.rb +++ b/devops-service/spec/shared_contexts/stubbed_knife.rb @@ -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