116 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			116 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | 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' => { | ||
|  |         'cid:priority' => '3' | ||
|  |       } | ||
|  |     } | ||
|  |   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 | ||
|  | 
 | ||
|  |     it 'build chef_node_name with default mask "$project-$nodename-$env"' do | ||
|  |       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 | ||
|  |       server_info_hash['tags']['cid:node-name-mask'] = '$project-$nodename-123' | ||
|  |       expect(stubbed_connector).to receive(:server_insert) do |server| | ||
|  |         expect(server.chef_node_name).to eq 'name-server1-123' | ||
|  |       end | ||
|  |       persister.persist | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  | end |