| 
									
										
										
										
											2016-01-31 17:52:11 +03:00
										 |  |  | require 'workers/stack_bootstrap/stack_servers_persister' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RSpec.describe StackServersPersister, stubbed_connector: true do | 
					
						
							|  |  |  |   let(:out) { double(:out, puts: nil, flush: nil) } | 
					
						
							|  |  |  |   let(:run_list) { ['role[asd]'] } | 
					
						
							|  |  |  |   let(:stack) { build(:stack, deploy_env: 'foo', run_list: run_list) } | 
					
						
							|  |  |  |   let(:project) { build(:project, id: 'name') } | 
					
						
							|  |  |  |   let(:persister) { described_class.new(stack, out) } | 
					
						
							|  |  |  |   let(:provider) { instance_double(Provider::Ec2, name: 'ec2') } | 
					
						
							|  |  |  |   let(:server_info_hash) do | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       'id' => 'server1', | 
					
						
							|  |  |  |       'name' => 'server_name', | 
					
						
							|  |  |  |       'key_name' => 'key', | 
					
						
							|  |  |  |       'private_ip' => '127.0.0.1', | 
					
						
							|  |  |  |       'public_ip' => '127.0.0.2', | 
					
						
							|  |  |  |       'tags' => { | 
					
						
							| 
									
										
										
										
											2016-02-20 17:39:02 +03:00
										 |  |  |         'cid:priority' => '3', | 
					
						
							|  |  |  |         'Name' => 'server1' | 
					
						
							| 
									
										
										
										
											2016-01-31 17:52:11 +03:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   before do | 
					
						
							|  |  |  |     allow(stubbed_connector).to receive(:project) { project } | 
					
						
							|  |  |  |     allow(stubbed_connector).to receive(:image) { | 
					
						
							|  |  |  |       instance_double(Devops::Model::Image, remote_user: 'user') | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     allow(stubbed_connector).to receive(:server_insert) | 
					
						
							|  |  |  |     allow(stack).to receive(:provider_instance) { provider } | 
					
						
							|  |  |  |     allow(provider).to receive(:stack_servers) {[server_info_hash]} | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe '#persist' do | 
					
						
							|  |  |  |     it 'fetches stack servers info' do | 
					
						
							|  |  |  |       expect(provider).to receive(:stack_servers).with(stack) | 
					
						
							|  |  |  |       persister.persist | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "doesn't raise error if cid:priority tag is absent" do | 
					
						
							|  |  |  |       server_info_hash['tags'].delete('cid:priority') | 
					
						
							|  |  |  |       expect {persister.persist}.not_to raise_error | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'returns hash {priority_as_integer => array of Devops::Model::Server}' do | 
					
						
							|  |  |  |       result = persister.persist | 
					
						
							|  |  |  |       expect(result).to be_a(Hash) | 
					
						
							|  |  |  |       expect(result[3]).to be_an_array_of(Devops::Model::Server).and have_size(1) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'takes id, key_name, private_ip and public_ip attrs from info hash' do | 
					
						
							|  |  |  |       expect(stubbed_connector).to receive(:server_insert) do |server| | 
					
						
							|  |  |  |         expect(server.id).to eq 'server1' | 
					
						
							|  |  |  |         expect(server.key).to eq 'key' | 
					
						
							|  |  |  |         expect(server.private_ip).to eq '127.0.0.1' | 
					
						
							|  |  |  |         expect(server.public_ip).to eq '127.0.0.2' | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       persister.persist | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'takes created_by, run_list and stack attrs from stack' do | 
					
						
							|  |  |  |       expect(stubbed_connector).to receive(:server_insert) do |server| | 
					
						
							|  |  |  |         expect(server.created_by).to eq 'root' | 
					
						
							|  |  |  |         expect(server.run_list).to eq run_list | 
					
						
							|  |  |  |         expect(server.stack).to eq 'iamstack' | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       persister.persist | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it 'takes remote_user from image user' do | 
					
						
							|  |  |  |       expect(stubbed_connector).to receive(:server_insert) do |server| | 
					
						
							|  |  |  |         expect(server.remote_user).to eq 'user' | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       persister.persist | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "takes deploy_env from project's deploy_env identifier" do | 
					
						
							|  |  |  |       expect(stubbed_connector).to receive(:server_insert) do |server| | 
					
						
							|  |  |  |         expect(server.deploy_env).to eq 'foo' | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       persister.persist | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "takes default provider's ssh key if info doesn't contain it" do | 
					
						
							|  |  |  |       allow(provider).to receive(:ssh_key) { 'default_key' } | 
					
						
							|  |  |  |       server_info_hash.delete('key_name') | 
					
						
							|  |  |  |       expect(stubbed_connector).to receive(:server_insert) do |server| | 
					
						
							|  |  |  |         expect(server.key).to eq 'default_key' | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       persister.persist | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "sets server's run list to empty array if stack's run_list is nil" do | 
					
						
							|  |  |  |       stack.run_list = nil | 
					
						
							|  |  |  |       expect(stubbed_connector).to receive(:server_insert) do |server| | 
					
						
							|  |  |  |         expect(server.run_list).to eq [] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       persister.persist | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-02 16:00:20 +03:00
										 |  |  |     it 'build chef_node_name with default mask ":project-:instancename-:env"' do | 
					
						
							| 
									
										
										
										
											2016-01-31 17:52:11 +03:00
										 |  |  |       expect(stubbed_connector).to receive(:server_insert) do |server| | 
					
						
							|  |  |  |         expect(server.chef_node_name).to eq 'name-server1-foo' | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       persister.persist | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "builds chef_node_name with custom mask if info['tags']['cid:node-name-mask'] exists" do | 
					
						
							| 
									
										
										
										
											2016-03-02 16:00:20 +03:00
										 |  |  |       server_info_hash['tags']['cid:node-name-mask'] = ':project-:instancename-123' | 
					
						
							| 
									
										
										
										
											2016-01-31 17:52:11 +03:00
										 |  |  |       expect(stubbed_connector).to receive(:server_insert) do |server| | 
					
						
							|  |  |  |         expect(server.chef_node_name).to eq 'name-server1-123' | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       persister.persist | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-03-02 16:00:20 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     describe 'incremented variables' do | 
					
						
							|  |  |  |       it 'substitutes :increment-groupid: with incrementing numbers' do | 
					
						
							|  |  |  |         allow(provider).to receive(:stack_servers) {[ | 
					
						
							|  |  |  |           {'id' => 'server1', 'tags' => {'cid:node-name-mask' => 'node-:increment-group1:-dev'}, 'key_name' => 'key'}, | 
					
						
							|  |  |  |           {'id' => 'server1', 'tags' => {'cid:node-name-mask' => 'node-:increment-group1:-dev'}, 'key_name' => 'key'} | 
					
						
							|  |  |  |         ]} | 
					
						
							|  |  |  |         expect(stubbed_connector).to receive(:server_insert) do |server| | 
					
						
							|  |  |  |           expect(server.chef_node_name).to eq 'node-01-dev' | 
					
						
							|  |  |  |         end.ordered | 
					
						
							|  |  |  |         expect(stubbed_connector).to receive(:server_insert) do |server| | 
					
						
							|  |  |  |           expect(server.chef_node_name).to eq 'node-02-dev' | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         persister.persist | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-01-31 17:52:11 +03:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | end |