Merge branch 'do_not_store_stack_details' into CID-428-increments_in_stack_node_names

This commit is contained in:
Anton Chuchkalov 2016-03-04 14:03:25 +03:00
commit c098c6a126
14 changed files with 49 additions and 167 deletions

View File

@ -34,13 +34,6 @@ class Stack < Handler
reserve_handler reserve_handler
when :unreserve when :unreserve
unreserve_handler unreserve_handler
when :resources
resources_handler
if @args[3]
output(format: 'json', resource: true)
else
output
end
when :change_stack_template when :change_stack_template
change_stack_template_handler change_stack_template_handler
output output
@ -103,21 +96,7 @@ class Stack < Handler
@options_parser.invalid_sync_command @options_parser.invalid_sync_command
abort(r) abort(r)
end end
@show = post "/stack/#{stack_id}/sync_details" @show = post "/stack/#{stack_id}/sync"
end
def resources_handler
stack_id, resource_id = @args[2], @args[3]
r = inspect_parameters(@options_parser.sync_params, stack_id)
unless r.nil?
@options_parser.invalid_sync_command
abort(r)
end
if resource_id
@list = get "/stack/#{stack_id}/resources/#{resource_id}"
else
@list = get "/stack/#{stack_id}/resources"
end
end end
def delete_handler def delete_handler

View File

@ -2,7 +2,7 @@ require "devops-client/options/common_options"
class StackOptions < CommonOptions class StackOptions < CommonOptions
commands :create, :delete, :list, :show, :sync, :resources, :deploy, :reserve, :unreserve, :change_stack_template commands :create, :delete, :list, :show, :sync, :deploy, :reserve, :unreserve, :change_stack_template
def initialize args, def_options def initialize args, def_options
super(args, def_options) super(args, def_options)
@ -12,7 +12,6 @@ class StackOptions < CommonOptions
self.show_params = ["STACK"] self.show_params = ["STACK"]
self.delete_params = ["STACK"] self.delete_params = ["STACK"]
self.sync_params = ["STACK"] self.sync_params = ["STACK"]
self.resources_params = ["STACK"]
self.deploy_params = ["STACK"] self.deploy_params = ["STACK"]
self.reserve_params = ["STACK"] self.reserve_params = ["STACK"]
self.change_stack_template_params = %w(STACK STACK_TEMPLATE) self.change_stack_template_params = %w(STACK STACK_TEMPLATE)

View File

@ -6,11 +6,6 @@ module Output
include Concerns::HasProvider include Concerns::HasProvider
def table def table
if options[:current_command] == :resources
if options[:resource].nil?
headers, rows = create_servers_list
end
else
if outputting_list? if outputting_list?
title = I18n.t("output.title.stack.list") title = I18n.t("output.title.stack.list")
headers, rows = create_list headers, rows = create_list
@ -19,7 +14,6 @@ module Output
title = I18n.t("output.title.stack.show", id: @data["name"]) title = I18n.t("output.title.stack.show", id: @data["name"])
headers, rows = create_show headers, rows = create_show
end end
end
create_table(headers, rows, title, with_num?) create_table(headers, rows, title, with_num?)
end end
@ -47,13 +41,5 @@ module Output
headers_and_rows([@data], %w(name project deploy_env stack_template stack_status)) headers_and_rows([@data], %w(name project deploy_env stack_template stack_status))
end end
def create_servers_list
headers = ['Logical id', 'Physical id']
rows = @data.map do |resource|
[resource['resource_name'], resource['physical_resource_id']]
end
[headers, rows]
end
end end
end end

View File

@ -46,9 +46,9 @@ module Devops
Devops::Db.connector.stack_delete(stack.id) Devops::Db.connector.stack_delete(stack.id)
end end
def sync_details id def sync id
stack = self.stack(id) stack = self.stack(id)
stack.sync_details! stack.sync!
Devops::Db.connector.stack_update(stack) Devops::Db.connector.stack_update(stack)
stack stack
@ -59,16 +59,6 @@ module Devops
Devops::Db.connector.stack_servers(stack.id) Devops::Db.connector.stack_servers(stack.id)
end end
def resources id
stack = Devops::Db.connector.stack(id)
stack.resources
end
def resource id, resource_id
stack = Devops::Db.connector.stack(id)
stack.resource(resource_id)
end
def set_run_list id def set_run_list id
Devops::Db.connector.set_stack_run_list(id, parser.run_list) Devops::Db.connector.set_stack_run_list(id, parser.run_list)
end end

View File

@ -219,7 +219,6 @@ module Devops
# "key_name": "devops", # "key_name": "devops",
# "image": "CirrOS_0.3.1" # "image": "CirrOS_0.3.1"
# }, # },
# "details": null,
# "stack_status": null, # "stack_status": null,
# "id": "openstack_stack" # "id": "openstack_stack"
# ] # ]

View File

@ -64,19 +64,9 @@ module Devops
} }
app.multi_routes '/stack/:stack_id', {:headers => [:accept]}, hash app.multi_routes '/stack/:stack_id', {:headers => [:accept]}, hash
app.post_with_headers "/stack/:stack_id/sync_details", :headers => [:accept] do |stack_id| app.post_with_headers "/stack/:stack_id/sync", :headers => [:accept] do |stack_id|
check_privileges("stack", "w") check_privileges("stack", "w")
json Devops::API2_0::Handler::Stack.new(request).sync_details(stack_id).to_hash json Devops::API2_0::Handler::Stack.new(request).sync(stack_id).to_hash
end
app.get_with_headers "/stack/:stack_id/resources", :headers => [:accept] do |stack_id|
check_privileges("stack", "r")
json Devops::API2_0::Handler::Stack.new(request).resources(stack_id)
end
app.get_with_headers "/stack/:stack_id/resources/:resource_id", :headers => [:accept] do |stack_id, resource_id|
check_privileges("stack", "r")
json Devops::API2_0::Handler::Stack.new(request).resource(stack_id, resource_id)
end end
# Set run_list to stack # Set run_list to stack

View File

@ -7,17 +7,7 @@ module Devops
include ModelWithProvider include ModelWithProvider
attr_accessor :id, :name, :project, :deploy_env, :stack_template, :parameters, :details, :events, :owner, :run_list attr_accessor :id, :name, :project, :deploy_env, :stack_template, :parameters, :events, :owner, :run_list, :stack_status
types id: {type: String, empty: false},
provider: {type: String, empty: false},
project: {type: String},
deploy_env: {type: String},
stack_template: {type: String, empty: false},
name: {type: String, nil: true},
owner: {type: String},
run_list: {type: Array, value_type: String, empty: true, nil: true}
# details: {type: Hash, nil: true} # Hash type isn't supported yet
set_field_validators :id, [::Validators::FieldValidator::NotNil, set_field_validators :id, [::Validators::FieldValidator::NotNil,
::Validators::FieldValidator::FieldType::String, ::Validators::FieldValidator::FieldType::String,
@ -55,7 +45,6 @@ module Devops
::Validators::FieldValidator::FieldType::Hash] ::Validators::FieldValidator::FieldType::Hash]
def initialize attrs={} def initialize attrs={}
# self.provider = self.class.provider
self.set_provider(attrs) self.set_provider(attrs)
self.id = attrs['id'] self.id = attrs['id']
self.project = attrs['project'] self.project = attrs['project']
@ -63,10 +52,10 @@ module Devops
self.stack_template = attrs['stack_template'] self.stack_template = attrs['stack_template']
self.name = attrs['name'] self.name = attrs['name']
self.parameters = attrs['parameters'] self.parameters = attrs['parameters']
self.details = attrs['details']
self.owner = attrs['owner'] self.owner = attrs['owner']
self.run_list = attrs['run_list'] || [] self.run_list = attrs['run_list'] || []
self.tags = attrs['tags'] || {} self.tags = attrs['tags'] || {}
self.stack_status = attrs['stack_status']
self self
end end
@ -78,8 +67,6 @@ module Devops
stack_template: stack_template, stack_template: stack_template,
name: name, name: name,
parameters: parameters, parameters: parameters,
# details are required to proper status handling
details: bson_safe_details,
stack_status: stack_status, stack_status: stack_status,
owner: owner, owner: owner,
run_list: run_list, run_list: run_list,
@ -87,10 +74,6 @@ module Devops
}.merge(provider_hash) }.merge(provider_hash)
end end
# overrided in ec2
def bson_safe_details
details
end
def create_stack_in_cloud! out def create_stack_in_cloud! out
begin begin
@ -104,8 +87,8 @@ module Devops
provider_instance.delete_stack(self) provider_instance.delete_stack(self)
end end
def sync_details! def sync!
self.details = provider_instance.stack_details(self) self.stack_status = provider_instance.stack_details(self)[:stack_status]
self.events = provider_instance.stack_events(self) self.events = provider_instance.stack_events(self)
end end
@ -118,23 +101,6 @@ module Devops
provider_instance.stack_resource(self, resource_id) provider_instance.stack_resource(self, resource_id)
end end
# there is only one way to update stack status right now:
# stack.sync_details!
# mongo.stack_update(stack)
# It's because syncing updates @details instance variable, but doesn'not persist it.
# Also that's why we need to have "details" key in #to_mongo_hash
def stack_status
raise 'override me'
end
def stack_statuses
# maybe they differ in different providers, so use method instead of hardcoding
{
in_progress: 'CREATE_IN_PROGRESS',
complete: 'CREATE_COMPLETE'
}
end
def template_body def template_body
stack_template_model.template_body stack_template_model.template_body
end end
@ -154,7 +120,7 @@ module Devops
def create(attrs, out) def create(attrs, out)
model = new(attrs) model = new(attrs)
model.create_stack_in_cloud!(out) model.create_stack_in_cloud!(out)
model.sync_details! model.sync!
model model
end end

View File

@ -4,23 +4,11 @@ module Devops
module Model module Model
class StackEc2 < StackBase class StackEc2 < StackBase
def initialize attr={} def initialize attrs={}
super(attr) super
self.provider = 'ec2' self.provider = 'ec2'
end end
def stack_status
self.details['StackStatus'] if self.details
end
# creation date is instance of unsupported by mongo class, so stringify it
def bson_safe_details
return unless details
result = details.dup
result['CreationTime'] = result['CreationTime'].to_s
result
end
def update_in_cloud!(params) def update_in_cloud!(params)
parameters = params.keep_if do |key| parameters = params.keep_if do |key|
%w(Parameters TemplateBody TemplateURL Capabilities).include?(key) %w(Parameters TemplateBody TemplateURL Capabilities).include?(key)

View File

@ -2,21 +2,10 @@ require 'db/mongo/models/stack/stack_base'
module Devops module Devops
module Model module Model
class StackOpenstack < StackBase class StackOpenstack < StackBase
def initialize attrs={}
def initialize attr={} super
self.provider = 'openstack' self.provider = 'openstack'
super(attr) end
end
def stack_status
details[:stack_status] || details['stack_status'] if details
end
=begin
def self.provider
'openstack'
end
=end
end end
end end
end end

View File

@ -274,7 +274,11 @@ module Provider
def stack_details(stack) def stack_details(stack)
b = cloud_formation.describe_stacks({'StackName' => stack.name}).body b = cloud_formation.describe_stacks({'StackName' => stack.name}).body
b['Stacks'].detect{|s| s.key?("StackStatus")} || {} details = b['Stacks'].detect{|s| s.key?("StackStatus")} || {}
{
stack_status: details['StackStatus'],
raw: details
}
end end
def stack_resources(stack) def stack_resources(stack)

View File

@ -238,7 +238,10 @@ module Provider
end end
def stack_details(stack) def stack_details(stack)
orchestration.show_stack_details(stack.name, stack.id).body['stack'] details = orchestration.show_stack_details(stack.name, stack.id).body['stack']
{
stack_status: details[:stack_status]
}
end end
def stack_resources(stack) def stack_resources(stack)

View File

@ -52,12 +52,6 @@ RSpec.describe Devops::Model::StackEc2, type: :model do
end end
end end
describe '#bson_safe_details' do
it 'stringify value of CreationTime key' do
stack.details = {'CreationTime' => Time.now}
expect(stack.bson_safe_details['CreationTime']).to be_a(String)
end
end
describe '#create_stack_in_cloud!' do describe '#create_stack_in_cloud!' do
it 'calls create_stack method of provider instance' do it 'calls create_stack method of provider instance' do
@ -86,32 +80,27 @@ RSpec.describe Devops::Model::StackEc2, type: :model do
end end
describe '#sync_details!' do describe '#sync!' do
let(:stack_with_blank_info) { stack.details = nil; stack.events=nil; stack } let(:fresh_events) { double('fresh_events') }
let(:fresh_details) { {'StackStatus' => 'CREATE_COMPLETE'} } let(:provider) {
let(:fresh_events) { [] } instance_double('Provider::Ec2',
subject { stack_with_blank_info.sync_details! } stack_details: {stack_status: 'CREATE_COMPLETE'},
stack_events: fresh_events
)
}
before do before do
allow(stack_with_blank_info).to receive_message_chain('provider_instance.stack_details') {fresh_details} allow(stack).to receive(:provider_instance) {provider}
allow(stack_with_blank_info).to receive_message_chain('provider_instance.stack_events') {fresh_events}
end end
it "get fresh stack details and stores it in @details" do it "get fresh stack details and updates stack status" do
expect(stack_with_blank_info).to receive_message_chain('provider_instance.stack_details') expect(provider).to receive(:stack_details)
subject expect {stack.sync!}.to change {stack.stack_status}.from(nil).to('CREATE_COMPLETE')
expect(stack_with_blank_info.details).to eq fresh_details
end end
it "get fresh stack events and stores it in @events" do it "get fresh stack events and stores it in @events" do
expect(stack_with_blank_info).to receive_message_chain('provider_instance.stack_events') expect(stack).to receive_message_chain('provider_instance.stack_events')
subject expect {stack.sync!}.to change {stack.events}.from(nil).to(fresh_events)
expect(stack_with_blank_info.events).to eq fresh_events
end
it 'updates stack status' do
subject
expect(stack_with_blank_info.stack_status).to eq 'CREATE_COMPLETE'
end end
end end
@ -151,7 +140,7 @@ RSpec.describe Devops::Model::StackEc2, type: :model do
before do before do
allow_any_instance_of(described_class).to receive(:create_stack_in_cloud!) allow_any_instance_of(described_class).to receive(:create_stack_in_cloud!)
allow_any_instance_of(described_class).to receive(:sync_details!) allow_any_instance_of(described_class).to receive(:sync!)
end end
it "returns instance of #{described_class.name}" do it "returns instance of #{described_class.name}" do
@ -164,7 +153,7 @@ RSpec.describe Devops::Model::StackEc2, type: :model do
end end
it 'synchronizes details' do it 'synchronizes details' do
expect_any_instance_of(described_class).to receive(:sync_details!) expect_any_instance_of(described_class).to receive(:sync!)
subject subject
end end
end end

View File

@ -5,7 +5,7 @@ RSpec.describe StackSynchronizer, stubbed_connector: true do
let(:syncer) { described_class.new(stack, out) } let(:syncer) { described_class.new(stack, out) }
before do before do
allow(stack).to receive(:sync_details!) allow(stack).to receive(:sync!)
allow(stack).to receive(:events).and_return( [{'event_id' => 1}] ) allow(stack).to receive(:events).and_return( [{'event_id' => 1}] )
allow(syncer).to receive(:sleep) allow(syncer).to receive(:sleep)
allow(stubbed_connector).to receive(:stack_update) allow(stubbed_connector).to receive(:stack_update)
@ -17,7 +17,7 @@ RSpec.describe StackSynchronizer, stubbed_connector: true do
describe '#sync' do describe '#sync' do
it 'waits for stack creating to be finished' do it 'waits for stack creating to be finished' do
expect(syncer).to receive(:sleep).at_least(10).times expect(syncer).to receive(:sleep).at_least(10).times
expect(stack).to receive(:sync_details!).at_least(10).times expect(stack).to receive(:sync!).at_least(10).times
syncer.sync syncer.sync
end end

View File

@ -15,7 +15,7 @@ class StackSynchronizer
sleep_times.each do |sleep_time| sleep_times.each do |sleep_time|
sleep sleep_time sleep sleep_time
stack.sync_details! stack.sync!
print_new_events print_new_events
case stack.stack_status case stack.stack_status
when 'CREATE_IN_PROGRESS', 'ROLLBACK_IN_PROGRESS' when 'CREATE_IN_PROGRESS', 'ROLLBACK_IN_PROGRESS'