This commit is contained in:
amartynov 2014-11-20 15:08:51 +03:00
commit c47b10c952
11 changed files with 132 additions and 54 deletions

View File

@ -26,13 +26,9 @@ unless File.exists?(config[:devops_home])
puts "Directory '#{config[:devops_home]}' has been created"
end
config[:server_report_dir_v2] = File.expand_path(File.join(config[:devops_home], "report", "v2", "server")) unless config[:server_report_dir_v2]
config[:deploy_report_dir_v2] = File.expand_path(File.join(config[:devops_home], "report", "v2", "deploy")) unless config[:deploy_report_dir_v2]
config[:project_report_dir_v2] = File.expand_path(File.join(config[:devops_home], "report", "v2", "project")) unless config[:project_report_dir_v2]
config[:report_dir_v2] = File.expand_path(File.join(config[:devops_home], "report", "v2")) unless config[:report_dir_v2]
[
:server_report_dir_v2,
:deploy_report_dir_v2,
:project_report_dir_v2
:report_dir_v2
].each {|key| d = config[key]; FileUtils.mkdir_p(d) unless File.exists?(d) }
# URL map for API v2.0
run Rack::URLMap.new({

View File

@ -0,0 +1,34 @@
require "db/exceptions/invalid_record"
require "db/mongo/models/mongo_model"
class Report < MongoModel
DEPLOY_TYPE = 1
SERVER_TYPE = 2
BOOTSTRAP_TYPE = 3
PROJECT_TEST_TYPE = 4
attr_accessor :id, :file, :created_at, :created_by, :project, :deploy_env, :type
def initialize r
self.id = r["_id"]
self.file = r["file"]
self.created_by = r["created_by"]
self.project = r["project"]
self.deploy_env = r["deploy_env"]
self.type = r["type"]
self.created_at = r["created_at"]
end
def to_hash_without_id
{
"file" => self.file,
"created_at" => self.created_at,
"created_by" => self.created_by,
"project" => self.project,
"deploy_env" => self.deploy_env,
"type" => self.type
}
end
end

View File

@ -6,6 +6,7 @@ require "exceptions/invalid_privileges"
require "db/mongo/models/project"
require "db/mongo/models/image"
require "db/mongo/models/report"
require "db/mongo/models/key"
require "db/mongo/models/project"
require "db/mongo/models/server"
@ -26,6 +27,7 @@ class MongoConnector
@keys = @db.collection("keys")
@users = @db.collection("users")
@statistic = @db.collection("statistic")
@reports = @db.collection("reports")
end
def images provider=nil
@ -360,6 +362,21 @@ class MongoConnector
@statistic.insert({:user => user, :path => path, :method => method, :body => body, :response_code => response_code, :date => Time.now})
end
def save_report r
r.created_at = Time.new
@reports.insert(r.to_hash)
end
def reports
@reports.find().to_a.map{|e| Report.new(e)}
end
def report id
r = @reports.find({"_id" => id}).to_a[0]
raise RecordNotFound.new("Report '#{id}' does not exist") if r.nil?
Report.new(r)
end
private
def find_server params
s = @servers.find(create_query(params)).to_a[0]

View File

@ -5,16 +5,13 @@ class Report< Sinatra::Base
def initialize config, version
super()
@@config = config
@paths = {
"server" => @@config[:server_report_dir_v2],
"deploy" => @@config[:deploy_report_dir_v2],
"project" => @@config[:project_report_dir_v2]
}
end
enable :inline_templates
get "/all" do
json DevopsService.mongo.reports.map{|r| r.to_hash}
=begin
res = {}
uri = URI.parse(request.url)
pref = File.dirname(uri.path)
@ -34,35 +31,18 @@ class Report< Sinatra::Base
res[key] = files
end
json res
=end
end
get "/server/:id" do
dir = @paths["server"] || ""
file = File.join(dir, params[:id])
get "/:id" do
r = DevopsService.mongo.report(params[:id])
file = r.file
return [404, "Report '#{params[:id]}' does not exist"] unless File.exists? file
@text = File.read(file)
@done = completed?(params[:id])
erb :index
end
get "/deploy/:id" do
dir = @paths["deploy"] || ""
file = File.join(dir, params[:id])
return [404, "Report '#{params[:id]}' does not exist"] unless File.exists? file
@text = File.read(file)
@done = completed?(params[:id])
erb :index
end
get "/project/:project/:env/:id" do
dir = @paths["project"] || ""
file = File.join(dir, params[:project], params[:env], params[:id])
return [404, "Report '#{params[:id]}' for project '#{params[:project]}' and env '#{params[:env]}' does not exist"] unless File.exists? file
@text = File.read(file)
@done = completed?(params[:id])
erb :index
end
get "/favicon.ico" do
[404, ""]
end

View File

@ -67,7 +67,7 @@ module Version2_0
end
end # stream
else
dir = DevopsService.config[:deploy_report_dir_v2]
dir = DevopsService.config[:report_dir_v2]
files = []
uri = URI.parse(request.url)
servers.each do |s|
@ -76,11 +76,12 @@ module Version2_0
rescue InvalidPrivileges, RecordNotFound => e
next
end
jid = DeployWorker.perform_async(dir, s.to_hash, tags, DevopsService.config)
jid = DeployWorker.perform_async(dir, s.to_hash, tags, request.env['REMOTE_USER'], DevopsService.config)
logger.info "Job '#{jid}' has been started"
uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/deploy/" + jid
uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/" + jid
files.push uri.to_s
end
sleep 1
json files
end
end

View File

@ -497,7 +497,7 @@ module Version2_0
env = project.deploy_env params[:env]
logger.info "Test project '#{project.id}' and environment '#{env.identifier}'"
dir = File.join(DevopsService.config[:project_report_dir_v2], project.id, env.identifier)
dir = DevopsService.config[:report_dir_v2]
uri = URI.parse(request.url)
p = {
:project => project.id,
@ -506,8 +506,9 @@ module Version2_0
}
jid = ProjectTestWorker.perform_async(dir, p, DevopsService.config)
logger.info "Job '#{jid}' has been created"
uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/project/#{project.id}/#{env.identifier}/" + jid
uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/" + jid
files = [uri.to_s]
sleep 1
json files
end

View File

@ -254,17 +254,18 @@ module Version2_0
end
end
else
dir = DevopsService.config[:server_report_dir_v2]
dir = DevopsService.config[:report_dir_v2]
files = []
uri = URI.parse(request.url)
servers.each do |s|
h = s.to_hash
h["options"] = s.options
jid = CreateServerWorker.perform_async(dir, env.provider, h, DevopsService.config)
jid = CreateServerWorker.perform_async(dir, env.provider, h, request.env['REMOTE_USER'], DevopsService.config)
logger.info "Job '#{jid}' has been started"
uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/server/" + jid
uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/" + jid
files.push uri.to_s
end
sleep 1
json files
end
end
@ -444,18 +445,19 @@ module Version2_0
end
end
else
dir = DevopsService.config[:server_report_dir_v2]
dir = DevopsService.config[:report_dir_v2]
files = []
uri = URI.parse(request.url)
h = s.to_hash
h["options"] = s.options
h["_id"] = s.id
jid = BootstrapWorker.perform_async(dir, d.provider, h, DevopsService.config)
jid = BootstrapWorker.perform_async(dir, d.provider, h, request.env['REMOTE_USER'], DevopsService.config)
logger.info "Job '#{jid}' has been started"
uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/server/" + jid
uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/" + jid
uri.query = nil
uri.fragment = nil
files.push uri.to_s
sleep 1
json files
end
end

View File

@ -6,14 +6,16 @@ require File.join(File.dirname(__FILE__), "worker")
require "providers/provider_factory"
require "commands/server"
require "db/mongo/models/server"
require "db/mongo/models/report"
class BootstrapWorker < Worker
include ServerCommands
def perform(dir, e_provider, server, conf)
def perform(dir, e_provider, server, owner, conf)
set_status jid, "init"
config = convert_config(conf)
File.open(File.join(dir, jid), "w") do |out|
file = File.join(dir, jid)
File.open(file, "w") do |out|
begin
set_status jid, "running"
mongo = mongo_connector(config)
@ -22,6 +24,16 @@ class BootstrapWorker < Worker
logger.debug "Provider: #{provider.inspect}"
s = Server.new(server)
s.options = convert_config(server["options"])
o = {
"file" => file,
"_id" => jid,
"created_by" => owner,
"project" => s.project,
"deploy_env" => s.deploy_env,
"type" => Report::BOOTSTRAP_TYPE
}
mongo.save_report(Report.new(o))
key = mongo.key(s.key)
out << "\nBootstrap with run list: #{s.options[:run_list].inspect}"
status = bootstrap(s, out, key.path, logger)

View File

@ -6,22 +6,33 @@ require File.join(File.dirname(__FILE__), "worker")
require "providers/provider_factory"
require "commands/server"
require "db/mongo/models/server"
require "db/mongo/models/report"
class CreateServerWorker < Worker
include ServerCommands
def perform(dir, e_provider, server, conf)
def perform(dir, e_provider, server, owner, conf)
set_status jid, "init"
config = convert_config(conf)
File.open(File.join(dir, jid), "w") do |out|
file = File.join(dir, jid)
File.open(file, "w") do |out|
begin
set_status jid, "running"
mongo = mongo_connector(config)
::Provider::ProviderFactory.init(config)
provider = ::Provider::ProviderFactory.get(e_provider)
logger.debug "Provider: #{provider.inspect}"
s = Server.new(server)
s.options = convert_config(server["options"])
o = {
"file" => file,
"_id" => jid,
"created_by" => owner,
"project" => s.project,
"deploy_env" => s.deploy_env,
"type" => Report::SERVER_TYPE
}
mongo.save_report(Report.new(o))
status = create_server_proc.call(out, s, provider, mongo)
set_status jid, (status == 0 ? "completed" : "failed")
rescue Exception => e

View File

@ -5,19 +5,32 @@ require File.join(File.dirname(__FILE__), "worker")
require "commands/deploy"
require "db/mongo/models/server"
require "db/mongo/models/report"
class DeployWorker < Worker
include DeployCommands
def perform(dir, server, tags, conf)
def perform(dir, server, tags, owner, conf)
set_status jid, "init"
config = convert_config(conf)
File.open(File.join(dir, jid), "w") do |out|
file = File.join(dir, jid)
File.open(file, "w") do |out|
begin
set_status jid, "running"
mongo = mongo_connector(config)
s = deploy_server_proc.call(out, Server.new(server), mongo, tags)
set_status jid, (s == 0 ? "completed" : "failed")
s = Server.new(server)
o = {
"file" => file,
"_id" => jid,
"created_by" => owner,
"project" => s.project,
"deploy_env" => s.deploy_env,
"type" => Report::DEPLOY_TYPE
}
mongo.save_report(Report.new(o))
r = deploy_server_proc.call(out, s, mongo, tags)
set_status jid, (r == 0 ? "completed" : "failed")
rescue Exception => e
out << "\n"
out << e.message

View File

@ -6,6 +6,7 @@ require "db/mongo/models/server"
require "json"
require "fileutils"
require "commands/status"
require "db/mongo/models/report"
class ProjectTestWorker < Worker
include ServerCommands
@ -15,7 +16,8 @@ class ProjectTestWorker < Worker
FileUtils.mkdir_p(dir) unless File.exists?(dir)
set_status jid, "init"
config = convert_config(conf)
File.open(File.join(dir, jid), "w") do |out|
file = File.join(dir, jid)
File.open(file, "w") do |out|
begin
set_status jid, "running"
logger.info "Test project '#{params["project"]}' and env '#{params["env"]}' (user - #{params["user"]})"
@ -24,8 +26,17 @@ class ProjectTestWorker < Worker
project = mongo.project(params["project"])
env = project.deploy_env(params["env"])
user = params["user"]
o = {
"file" => file,
"_id" => jid,
"created_by" => user,
"project" => params["project"],
"deploy_env" => params["env"],
"type" => Report::PROJECT_TEST_TYPE
}
mongo.save_report(Report.new(o))
provider = ::Provider::ProviderFactory.get(env.provider)
logger.debug "Provider: #{provider.inspect}"
servers = extract_servers(provider, project, env, {}, user, mongo)
result = {:servers => []}
project.deploy_envs = [ env ]