Merge branch 'do_not_store_stack_details' into CID-428-increments_in_stack_node_names
This commit is contained in:
commit
c098c6a126
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -6,19 +6,13 @@ module Output
|
|||||||
include Concerns::HasProvider
|
include Concerns::HasProvider
|
||||||
|
|
||||||
def table
|
def table
|
||||||
if options[:current_command] == :resources
|
if outputting_list?
|
||||||
if options[:resource].nil?
|
title = I18n.t("output.title.stack.list")
|
||||||
headers, rows = create_servers_list
|
headers, rows = create_list
|
||||||
end
|
|
||||||
else
|
else
|
||||||
if outputting_list?
|
puts 'Details are not displayed in table view'
|
||||||
title = I18n.t("output.title.stack.list")
|
title = I18n.t("output.title.stack.show", id: @data["name"])
|
||||||
headers, rows = create_list
|
headers, rows = create_show
|
||||||
else
|
|
||||||
puts 'Details are not displayed in table view'
|
|
||||||
title = I18n.t("output.title.stack.show", id: @data["name"])
|
|
||||||
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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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"
|
||||||
# ]
|
# ]
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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'
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user