Merge branch 'dev' of http://git.stu.neva.ru/cloudtechlab/devops-service into dev
This commit is contained in:
commit
c47b10c952
@ -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({
|
||||
|
||||
34
devops-service/db/mongo/models/report.rb
Normal file
34
devops-service/db/mongo/models/report.rb
Normal 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
|
||||
@ -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]
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 ]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user