persist stack servers into mongo
This commit is contained in:
parent
e0c456c571
commit
5203455436
@ -38,7 +38,7 @@ class Image < Handler
|
||||
bt.auth = self.auth
|
||||
list = bt.list_handler
|
||||
return list, nil if list.empty?
|
||||
return list, bt.table
|
||||
[list, bt.outputter.table]
|
||||
end
|
||||
|
||||
def create_handler
|
||||
|
||||
@ -34,6 +34,8 @@ module Devops
|
||||
stack = self.stack(id)
|
||||
stack.sync_details!
|
||||
Devops::Db.connector.stack_update(stack)
|
||||
|
||||
stack
|
||||
end
|
||||
|
||||
def resources id
|
||||
|
||||
@ -20,6 +20,7 @@ module Devops
|
||||
def apply id, body
|
||||
preset = Devops::StackPresetsFactory.get(id)
|
||||
stack = preset.create_stack_from_preset(body)
|
||||
stack.owner = @request.env['REMOTE_USER']
|
||||
Devops::Db.connector.stack_insert(stack)
|
||||
|
||||
file = JobStarter.start_job(:worker, :sync_stack_till_not_in_progress,
|
||||
@ -33,28 +34,6 @@ module Devops
|
||||
stack
|
||||
end
|
||||
|
||||
# def self.apply
|
||||
# lambda {
|
||||
# # check_privileges("stack_presets", "r")
|
||||
# check_privileges('stack_template', 'w')
|
||||
|
||||
# attrs = create_object_from_json_body
|
||||
# preset = Devops::StackPresetsFactory.get(attrs.fetch('id'))
|
||||
# stack = preset.create_stack_from_preset(attrs)
|
||||
# settings.mongo.stack_insert(stack)
|
||||
|
||||
# file = JobStarter.start_job(:worker, :sync_stack_till_not_in_progress,
|
||||
# provider: stack.provider,
|
||||
# stack_id: stack.id,
|
||||
# request: request
|
||||
# )
|
||||
|
||||
# puts "Syncing report is located here: #{file}"
|
||||
|
||||
# create_response 'Created', stack.to_hash, 201
|
||||
# }
|
||||
# end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -35,7 +35,7 @@ module Devops
|
||||
app.get_with_headers "/networks/:provider", :headers => [:accept] do |provider|
|
||||
check_privileges("network", "r")
|
||||
check_provider(provider)
|
||||
json Devops::API2_0::Handler::Network.new(request, params).networks
|
||||
json Devops::API2_0::Handler::Network.new(request, params).networks(provider)
|
||||
end
|
||||
|
||||
puts "Network routes initialized"
|
||||
|
||||
@ -7,8 +7,8 @@ module StackCommands
|
||||
|
||||
def sync_stack_till_not_in_progress_proc
|
||||
lambda do |out, stack, mongo|
|
||||
# two tries each 2 seconds, then 5 tries each 10 seconds, then 5 tries each minute.
|
||||
sleep_times = [2]*2 + [10]*5 + [60]*5
|
||||
# two tries each 4 seconds, then 5 tries each 10 seconds, then 5 tries each minute.
|
||||
sleep_times = [4]*2 + [10]*5 + [60]*5
|
||||
|
||||
begin
|
||||
out << "Syncing stack '#{stack.id}'...\n"
|
||||
@ -29,30 +29,8 @@ module StackCommands
|
||||
end
|
||||
end
|
||||
|
||||
def create_devops_servers_from_stack_resources
|
||||
lambda do |out, stack, mongo, owner|
|
||||
project = mongo.project(stack.project)
|
||||
deploy_env = project.deploy_envs.detect {|env| env.identifier == stack.deploy_env}
|
||||
provider = ::Provider::ProviderFactory.get(stack.provider)
|
||||
|
||||
stack.resources.each do |resource|
|
||||
logical_name = resource['resource_name']
|
||||
attrs = stack.resource(logical_name)
|
||||
body = {
|
||||
'name' => logical_name,
|
||||
'key' => attrs['key_name']
|
||||
}
|
||||
|
||||
server = extract_servers(provider, project, deploy_env, body, owner, mongo)
|
||||
server.private_ip = attrs['addresses']['devops-net-1'].first['addr']
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
CommandsStorage.add_job_lambda(
|
||||
sync_stack_till_not_in_progress: sync_stack_till_not_in_progress_proc,
|
||||
create_devops_servers_from_stack_resources: create_devops_servers_from_stack_resources
|
||||
sync_stack_till_not_in_progress: sync_stack_till_not_in_progress_proc
|
||||
)
|
||||
|
||||
end
|
||||
|
||||
@ -4,7 +4,7 @@ module Devops
|
||||
module Model
|
||||
class Server < MongoModel
|
||||
|
||||
attr_accessor :provider, :chef_node_name, :id, :remote_user, :project, :deploy_env, :private_ip, :public_ip, :created_at, :without_bootstrap, :created_by, :reserved_by
|
||||
attr_accessor :provider, :chef_node_name, :id, :remote_user, :project, :deploy_env, :private_ip, :public_ip, :created_at, :without_bootstrap, :created_by, :reserved_by, :stack
|
||||
attr_accessor :options, :static, :key
|
||||
|
||||
types :id => {:type => String, :empty => false},
|
||||
@ -17,7 +17,8 @@ module Devops
|
||||
:key => {:type => String, :empty => false},
|
||||
:created_by => {:type => String, :empty => false},
|
||||
:chef_node_name => {:type => String, :empty => true},
|
||||
:reserved_by => {:type => String, :empty => true}
|
||||
:reserved_by => {:type => String, :empty => true},
|
||||
:stack => {:type => String, :nil => true}
|
||||
|
||||
def self.fields
|
||||
["chef_node_name", "project", "deploy_env", "provider", "remote_user", "private_ip", "public_ip", "created_at", "created_by", "static", "key", "reserved_by"]
|
||||
@ -37,6 +38,7 @@ module Devops
|
||||
self.static = s["static"]
|
||||
self.key = s["key"]
|
||||
self.reserved_by = s["reserved_by"]
|
||||
self.stack = s["stack"]
|
||||
end
|
||||
|
||||
def validate!
|
||||
@ -57,7 +59,8 @@ module Devops
|
||||
"created_by" => self.created_by,
|
||||
"static" => self.static,
|
||||
"key" => self.key,
|
||||
"reserved_by" => self.reserved_by
|
||||
"reserved_by" => self.reserved_by,
|
||||
"stack" => stack
|
||||
}.delete_if{|k,v| v.nil?}
|
||||
end
|
||||
|
||||
|
||||
@ -3,14 +3,15 @@ module Devops
|
||||
class StackBase < MongoModel
|
||||
|
||||
attr_accessor :id, :project, :deploy_env, :stack_template,
|
||||
:cloud_stack_id, :provider, :parameters, :details
|
||||
:cloud_stack_id, :provider, :parameters, :details, :owner
|
||||
|
||||
types id: {type: String, empty: false},
|
||||
provider: {type: String, empty: false},
|
||||
project: {type: String},
|
||||
deploy_env: {type: String},
|
||||
stack_template: {type: String, empty: false},
|
||||
cloud_stack_id: {type: String, nil: true}
|
||||
cloud_stack_id: {type: String, nil: true},
|
||||
owner: {type: String}
|
||||
# details: {type: Hash, nil: true} # Hash type isn't supported yet
|
||||
|
||||
def initialize attrs={}
|
||||
@ -23,6 +24,7 @@ module Devops
|
||||
self.cloud_stack_id = attrs['cloud_stack_id']
|
||||
self.parameters = attrs['parameters']
|
||||
self.details = attrs['details']
|
||||
self.owner = attrs['owner']
|
||||
self
|
||||
end
|
||||
|
||||
@ -35,7 +37,8 @@ module Devops
|
||||
cloud_stack_id: cloud_stack_id,
|
||||
parameters: parameters,
|
||||
details: details,
|
||||
stack_status: stack_status
|
||||
stack_status: stack_status,
|
||||
owner: owner
|
||||
}
|
||||
end
|
||||
|
||||
@ -52,7 +55,7 @@ module Devops
|
||||
end
|
||||
|
||||
def sync_details!
|
||||
self.details = provider_class.stack_details(self)
|
||||
self.details = provider_class.stack_details(self).attributes
|
||||
end
|
||||
|
||||
def resources
|
||||
@ -64,10 +67,6 @@ module Devops
|
||||
provider_class.stack_resource(self, resource_id)
|
||||
end
|
||||
|
||||
def template_body
|
||||
Devops::Api2.settings.mongo.stack_template(stack_template).template_body
|
||||
end
|
||||
|
||||
def stack_status
|
||||
raise 'override me'
|
||||
end
|
||||
@ -80,6 +79,10 @@ module Devops
|
||||
}
|
||||
end
|
||||
|
||||
def template_body
|
||||
Devops::Db.connector.stack_template(stack_template).template_body
|
||||
end
|
||||
|
||||
class << self
|
||||
attr_accessor :provider
|
||||
|
||||
|
||||
@ -210,7 +210,7 @@ module Provider
|
||||
end
|
||||
|
||||
def stack_details(stack)
|
||||
fog_stack(stack).details.attributes
|
||||
fog_stack(stack).details
|
||||
end
|
||||
|
||||
def stack_resources(stack)
|
||||
@ -219,7 +219,7 @@ module Provider
|
||||
|
||||
def stack_resource(stack, resource_id)
|
||||
physical_id = fog_stack(stack).resources.get(resource_id).physical_resource_id
|
||||
compute.servers.get(physical_id).attributes
|
||||
compute.servers.get(physical_id)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@ -11,7 +11,6 @@ module JobStarter
|
||||
|
||||
def self.start_job_as_worker(worker_class, options)
|
||||
job_options = options.dup
|
||||
job_options[:owner] ||= options[:request].env['REMOTE_USER']
|
||||
job_options[:config] ||= DevopsConfig.config
|
||||
job_options[:dir] ||= DevopsConfig[:report_dir_v2]
|
||||
job_options[:url] ||= options[:request].url
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
require "providers/provider_factory"
|
||||
require "commands/stack"
|
||||
require "db/mongo/models/stack/stack_factory"
|
||||
require "db/mongo/models/project"
|
||||
require "db/mongo/models/report"
|
||||
require 'workers/workers_storage'
|
||||
|
||||
@ -13,20 +14,55 @@ class StackSyncWorker < Worker
|
||||
def perform(options)
|
||||
call(options['config'], options['provider'], options['dir']) do |mongo, provider, out, file|
|
||||
stack = mongo.stack(options['stack_id'])
|
||||
o = {
|
||||
"file" => file,
|
||||
"_id" => jid,
|
||||
"created_by" => options['owner'],
|
||||
"project" => stack.project,
|
||||
"deploy_env" => stack.deploy_env,
|
||||
"type" => ::Devops::Model::Report::STACK_TYPE
|
||||
}
|
||||
mongo.save_report(::Devops::Model::Report.new(o))
|
||||
save_report(mongo, stack, file)
|
||||
|
||||
status = sync_stack_till_not_in_progress_proc.call(out, stack, mongo)
|
||||
persist_stack_servers_in_mongo!(mongo, stack, provider)
|
||||
status
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def save_report(mongo, stack, file)
|
||||
report = ::Devops::Model::Report.new(
|
||||
"file" => file,
|
||||
"_id" => jid,
|
||||
"created_by" => stack.owner,
|
||||
"project" => stack.project,
|
||||
"deploy_env" => stack.deploy_env,
|
||||
"type" => ::Devops::Model::Report::STACK_TYPE
|
||||
)
|
||||
mongo.save_report(report)
|
||||
end
|
||||
|
||||
def persist_stack_servers_in_mongo!(mongo, stack, provider)
|
||||
project = mongo.project(stack.project)
|
||||
deploy_env = project.deploy_env(stack.deploy_env)
|
||||
|
||||
stack_servers = []
|
||||
|
||||
stack.resources.each do |resource|
|
||||
logical_name = resource.resource_name
|
||||
extended_info = stack.resource(logical_name)
|
||||
body = {
|
||||
'name' => logical_name,
|
||||
'key' => extended_info.key_name
|
||||
}
|
||||
|
||||
servers = extract_servers(provider, project, deploy_env, body, stack.owner, mongo)
|
||||
servers.each do |server|
|
||||
# TODO: improve IP assigning logic
|
||||
server.private_ip = extended_info.addresses.values.first.first['addr']
|
||||
end
|
||||
stack_servers += servers
|
||||
end
|
||||
stack_servers.each_with_index do |server, i|
|
||||
server.id = "stack-#{stack.id}-server-#{i+1}"
|
||||
server.stack = stack.id
|
||||
mongo.server_insert server
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
WorkersStorage.add_worker(sync_stack_till_not_in_progress: StackSyncWorker)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user