diff --git a/devops-service/config.ru b/devops-service/config.ru index 150f5b9..363ad93 100644 --- a/devops-service/config.ru +++ b/devops-service/config.ru @@ -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({ diff --git a/devops-service/db/mongo/models/report.rb b/devops-service/db/mongo/models/report.rb new file mode 100644 index 0000000..8b22c7a --- /dev/null +++ b/devops-service/db/mongo/models/report.rb @@ -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 diff --git a/devops-service/db/mongo/mongo_connector.rb b/devops-service/db/mongo/mongo_connector.rb index aec3533..3aa6375 100644 --- a/devops-service/db/mongo/mongo_connector.rb +++ b/devops-service/db/mongo/mongo_connector.rb @@ -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] diff --git a/devops-service/report.rb b/devops-service/report.rb index f824fb0..66c0456 100644 --- a/devops-service/report.rb +++ b/devops-service/report.rb @@ -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 diff --git a/devops-service/routes/v2.0/deploy.rb b/devops-service/routes/v2.0/deploy.rb index 31eca99..9bec4c6 100644 --- a/devops-service/routes/v2.0/deploy.rb +++ b/devops-service/routes/v2.0/deploy.rb @@ -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 diff --git a/devops-service/routes/v2.0/project.rb b/devops-service/routes/v2.0/project.rb index 72c2e00..b8f667e 100644 --- a/devops-service/routes/v2.0/project.rb +++ b/devops-service/routes/v2.0/project.rb @@ -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 diff --git a/devops-service/routes/v2.0/server.rb b/devops-service/routes/v2.0/server.rb index 89a435c..d8732e5 100644 --- a/devops-service/routes/v2.0/server.rb +++ b/devops-service/routes/v2.0/server.rb @@ -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 diff --git a/devops-service/workers/bootstrap_worker.rb b/devops-service/workers/bootstrap_worker.rb index ea7bd06..23da374 100644 --- a/devops-service/workers/bootstrap_worker.rb +++ b/devops-service/workers/bootstrap_worker.rb @@ -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) diff --git a/devops-service/workers/create_server_worker.rb b/devops-service/workers/create_server_worker.rb index c4ef9b6..972720c 100644 --- a/devops-service/workers/create_server_worker.rb +++ b/devops-service/workers/create_server_worker.rb @@ -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 diff --git a/devops-service/workers/deploy_worker.rb b/devops-service/workers/deploy_worker.rb index 3f1fb36..da386cf 100644 --- a/devops-service/workers/deploy_worker.rb +++ b/devops-service/workers/deploy_worker.rb @@ -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 diff --git a/devops-service/workers/project_test_worker.rb b/devops-service/workers/project_test_worker.rb index 8c24f47..9f78f47 100644 --- a/devops-service/workers/project_test_worker.rb +++ b/devops-service/workers/project_test_worker.rb @@ -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 ]