Merge branch 'CID-471-set_ebs_optimized' into features

This commit is contained in:
Anton Chuchkalov 2016-03-16 21:40:05 +02:00
commit 7e3e1715e1
8 changed files with 64 additions and 23 deletions

View File

@ -9,7 +9,7 @@ module Devops
def schedule_expiration!
return unless @expires
DeleteExpiredServerWorker.perform_in(interval_in_seconds, server_chef_node_name: @server.chef_node_name)
DeleteExpiredServerWorker.perform_in(interval_in_seconds, server_id: @server.id)
end
def interval_in_seconds

View File

@ -265,8 +265,8 @@ module Devops
return error_code(:server_not_in_chef_nodes)
end
else
# @out << roll_back
# mongo.server_delete @server.id
roll_back
mongo.server_delete @server.id
msg = "Failed while bootstraping server with id '#{@server.id}'\n"
msg << "Bootstraping operation result was #{bootstrap_status}"
DevopsLogger.logger.error msg
@ -511,8 +511,8 @@ module Devops
def schedule_expiration
if @deploy_env.expires
@out << "Planning expiration in #{@deploy_env.expires}"
ExpirationScheduler.new(@deploy_env.expires, @server).schedule_expiration!
job_id = ExpirationScheduler.new(@deploy_env.expires, @server).schedule_expiration!
puts_and_flush "Planning expiration in #{@deploy_env.expires}, job_id: #{job_id}"
end
end

View File

@ -100,7 +100,9 @@ module Provider
"InstanceType" => flavor,
# "Placement.AvailabilityZone" => s.options[:availability_zone],
"KeyName" => self.ssh_key,
"PrivateIpAddress" => s.private_ip
"PrivateIpAddress" => s.private_ip,
"EbsOptimized" => ebs_optimized?(flavor),
"BlockDeviceMapping" => ephemeral_storages_mappings(flavor)
}
vpcId = nil
unless subnets.empty?
@ -412,5 +414,30 @@ module Provider
end
end
# When you create an instance with one of these flavors within AWS console,
# EbsOptimized is automatically set to true. But in case of creating within API we should set it manually.
def ebs_optimized?(flavor)
always_ebs_optimized = ['c4.large', 'c4.xlarge', 'c4.2xlarge', 'c4.4xlarge', 'c4.8xlarge', 'd2.xlarge', 'd2.2xlarge', 'd2.4xlarge', 'd2.8xlarge', 'm4.large', 'm4.xlarge', 'm4.2xlarge', 'm4.4xlarge', 'm4.10xlarge']
always_ebs_optimized.include?(flavor)
end
# When you create an instance with with ephemeral storages available within AWS console,
# they are mapped automatically. But in case of creating within API we should map them manually.
# Result example: [{'VirtualName' => 'ephemeral0', 'DeviceName' => '/dev/xvdb'}]
def ephemeral_storages_mappings(flavor)
require 'fog/aws/models/compute/flavors'
details = Fog::Compute::AWS::FLAVORS.detect {|f| f[:id] == flavor}
return [] unless details
mappings = []
details[:instance_store_volumes].times do |i|
mappings << {
'VirtualName' => "ephemeral#{i}",
'DeviceName' => "/dev/xvd#{('b'.ord + i).chr}"
}
end
mappings
end
end
end

View File

@ -5,7 +5,7 @@ RSpec.describe Devops::Executor::ExpirationScheduler do
describe '#schedule_expiration!' do
it 'schedules server deleting at given time' do
expect(DeleteExpiredServerWorker).to receive(:perform_in).with(120, server_chef_node_name: 'chef_node_name')
expect(DeleteExpiredServerWorker).to receive(:perform_in).with(120, server_id: server.id)
described_class.new('2m', server).schedule_expiration!
end

View File

@ -140,7 +140,7 @@ RSpec.describe Devops::Executor::ServerExecutor, type: :executor, stubbed_connec
it 'schedules expiration for server' do
deploy_env.expires = '2m'
allow(DeleteExpiredServerWorker).to receive(:perform_in)
expect(DeleteExpiredServerWorker).to receive(:perform_in).with(120, {server_chef_node_name: 'node_name'})
expect(DeleteExpiredServerWorker).to receive(:perform_in).with(120, hash_including(:server_id))
create_server
end
@ -366,10 +366,19 @@ RSpec.describe Devops::Executor::ServerExecutor, type: :executor, stubbed_connec
end
context "when bootstrap wasn't successful" do
it 'returns :server_bootstrap_fail error code' do
before do
allow(executor).to receive(:bootstrap) { 1 }
allow(executor).to receive(:roll_back)
end
it 'returns :server_bootstrap_fail error code' do
expect(two_phase_bootstrap).to eq 2
end
it 'rollbacks server' do
allow(executor).to receive(:roll_back)
two_phase_bootstrap
end
end
context 'when an error occured during bootstrap' do

View File

@ -3,7 +3,7 @@ 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(:stack) { build(:stack_ec2, 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') }
@ -113,6 +113,15 @@ RSpec.describe StackServersPersister, stubbed_connector: true do
persister.persist
end
it "sets provider and provider account from stack" do
stack.provider_account = 'foo'
expect(stubbed_connector).to receive(:server_insert) do |server|
expect(server.provider).to eq 'ec2'
expect(server.provider_account).to eq 'foo'
end
persister.persist
end
describe 'incremented variables' do
it 'substitutes :increment-groupid: with incrementing numbers' do
allow(provider).to receive(:stack_servers) {[

View File

@ -6,12 +6,11 @@ require "workers/worker"
class DeleteExpiredServerWorker < Worker
def perform(options)
chef_node_name = options.fetch('server_chef_node_name')
call() do |out, file|
out.puts "Expire server '#{chef_node_name}'."
server = mongo.server_by_chef_node_name(chef_node_name)
report = save_report(file, server)
call do
server_id = options.fetch('server_id')
puts_and_flush "Expire server '#{server_id}'."
server = mongo.server_by_instance_id(server_id)
report = save_report(server)
e = Devops::Executor::ServerExecutor.new(server, out)
e.report = report
@ -21,17 +20,13 @@ class DeleteExpiredServerWorker < Worker
private
def save_report(file, server)
report = Devops::Model::Report.new(
"file" => file,
"_id" => jid,
def save_report(server)
update_report(
"created_by" => 'SYSTEM',
"project" => server.project,
"deploy_env" => server.deploy_env,
"type" => Devops::Model::Report::EXPIRE_SERVER_TYPE
)
mongo.save_report(report)
report
end
end

View File

@ -50,7 +50,8 @@ class StackServersPersister
'deploy_env' => @deploy_env.identifier,
'key' => server_info['key_name'] || @provider.ssh_key,
'project' => @project.id,
'provider' => @provider.name,
'provider' => @stack.provider,
'provider_account' => @stack.provider_account,
'remote_user' => mongo.image(@deploy_env.image).remote_user,
'private_ip' => server_info['private_ip'],
'public_ip' => server_info['public_ip'],