diff --git a/devops-client/lib/devops-client/handler/stack.rb b/devops-client/lib/devops-client/handler/stack.rb index b006fc7..eaabb1d 100644 --- a/devops-client/lib/devops-client/handler/stack.rb +++ b/devops-client/lib/devops-client/handler/stack.rb @@ -28,6 +28,8 @@ class Stack < Handler when :sync sync_handler output + when :deploy + deploy_handler when :resources resources_handler if @args[3] @@ -112,6 +114,12 @@ class Stack < Handler end end + def deploy_handler + stack_id = @args[2] + response = post "/stack/#{stack_id}/deploy" + puts response.inspect + end + private def provider_stacks(provider) diff --git a/devops-client/lib/devops-client/options/stack_options.rb b/devops-client/lib/devops-client/options/stack_options.rb index 9a853e5..b8742c2 100644 --- a/devops-client/lib/devops-client/options/stack_options.rb +++ b/devops-client/lib/devops-client/options/stack_options.rb @@ -2,7 +2,7 @@ require "devops-client/options/common_options" class StackOptions < CommonOptions - commands :create, :delete, :list, :show, :sync, :resources + commands :create, :delete, :list, :show, :sync, :resources, :deploy def initialize args, def_options super(args, def_options) @@ -13,6 +13,7 @@ class StackOptions < CommonOptions self.delete_params = ["STACK"] self.sync_params = ["STACK"] self.resources_params = ["STACK"] + self.deploy_params = ["STACK"] end def create_options diff --git a/devops-service/app/api2/handlers/deploy.rb b/devops-service/app/api2/handlers/deploy.rb index da989ec..d5e97a9 100644 --- a/devops-service/app/api2/handlers/deploy.rb +++ b/devops-service/app/api2/handlers/deploy.rb @@ -33,18 +33,20 @@ module Devops end begin deploy_info = create_deploy_info(s, project, body["build_number"]) - jid = DeployWorker.perform_async(dir, s.to_hash, tags, owner, DevopsConfig.config, deploy_info) - Worker.set_status jid, Worker::STATUS::IN_QUEUE - DevopsLogger.logger.info "Job '#{jid}' has been queued" + + uri = Worker.start_async(DeployWorker, @request, + server_attrs: s.to_hash, + owner: owner, + tags: tags, + deploy_info: deploy_info + ) + rescue DeployInfoError => e msg = "Can not get deploy info: " + e.message DevopsLogger.logger.error msg jid = "error_#{s.chef_node_name}_#{Time.new.to_i}" file = File.jon(dir, jid) File.open(file, "w") do |out| - #unless attributes.nil? - # out << "Report attributes: #{attributes.inspect}\n" - #end out.write msg end o = { @@ -59,8 +61,7 @@ module Devops } Devops::Db.connector.save_report(Report.new(o)) end - uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid - files.push uri.to_s + files.push(uri) end files end @@ -106,11 +107,12 @@ module Devops end def create_deploy_info server, project, build_number + deploy_env_model = project.deploy_env(server.deploy_env) buf_key = "#{server.project}_#{server.deploy_env}" deploy_info = if @deploy_info_buf.key?(buf_key) @deploy_info_buf[buf_key] else - @deploy_info_buf[buf_key] = project.deploy_info(server.deploy_env, build_number) + @deploy_info_buf[buf_key] = project.deploy_info(deploy_env_model, build_number) end end end diff --git a/devops-service/app/api2/handlers/project.rb b/devops-service/app/api2/handlers/project.rb index 7b37875..d45fbd1 100644 --- a/devops-service/app/api2/handlers/project.rb +++ b/devops-service/app/api2/handlers/project.rb @@ -147,18 +147,29 @@ module Devops def deploy_project id deploy_env, servers = parser.deploy - dir = DevopsConfig[:report_dir_v2] files = [] - uri = URI.parse(request.url) servers(id, deploy_env, servers).each do |s| - project = begin + begin Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user rescue InvalidPrivileges, RecordNotFound => e next end - jid = DeployWorker.perform_async(dir, s.to_hash, [], DevopsConfig.config) - uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid - files.push uri.to_s + + project_model = project(s.project) + deploy_env_model = project_model.deploy_env(deploy_env) + + puts '!!! WARNING !!!' + puts 'build_number is set to empty string' + build_number = '' + deploy_info = project_model.deploy_info(deploy_env_model, build_number) + + uri = Worker.start_async(DeployWorker, @request, + server_attrs: s.to_hash, + owner: parser.current_user, + tags: [], + deploy_info: deploy_info + ) + files.push uri end files end diff --git a/devops-service/app/api2/handlers/server.rb b/devops-service/app/api2/handlers/server.rb index c03791e..dd538d7 100644 --- a/devops-service/app/api2/handlers/server.rb +++ b/devops-service/app/api2/handlers/server.rb @@ -67,11 +67,11 @@ module Devops user = parser.current_user check_if_server_attrs_are_valid(body, user) - file = Worker.start_async(CreateServerWorker, @request, + uri = Worker.start_async(CreateServerWorker, @request, server_attrs: body, owner: user ) - [file] + [uri] end def pause_server node_name diff --git a/devops-service/app/api2/handlers/stack.rb b/devops-service/app/api2/handlers/stack.rb index a8a695d..20837f8 100644 --- a/devops-service/app/api2/handlers/stack.rb +++ b/devops-service/app/api2/handlers/stack.rb @@ -26,12 +26,12 @@ module Devops object["stack_template"] = env.stack_template object["owner"] = parser.current_user - file = Worker.start_async(StackBootstrapWorker, @request, + uri = Worker.start_async(StackBootstrapWorker, @request, provider_name: env.provider, stack_attributes: object ) - puts "Syncing report is located here: #{file}" - [file] + puts "Syncing report is located here: #{uri}" + [uri] end def stack id @@ -77,29 +77,29 @@ module Devops owner = parser.current_user status = [] project = Devops::Db.connector.check_project_auth(stack.project, stack.deploy_env, owner) + deploy_env_model = project.deploy_env(stack.deploy_env) body = parser.deploy names = body["names"] tags = body["tags"] || [] - dir = DevopsConfig.config[:report_dir_v2] files = [] jid = nil - uri = URI.parse(parser.request.url) - servers = Devops::Db.connector.stack_servers(stack_id, true) - deploy_info = project.deploy_info(stack.deploy_env, nil) + servers = Devops::Db.connector.stack_servers(id, true) servers.each do |s| begin - jid = DeployWorker.perform_async(dir, s.to_hash, tags, owner, DevopsConfig.config, deploy_info) - Worker.set_status jid, Worker::STATUS::IN_QUEUE - DevopsLogger.logger.info "Job '#{jid}' has been queued" + deploy_info = project.deploy_info(deploy_env_model, nil) + uri = Worker.start_async(DeployWorker, @request, + server_attrs: s.to_hash, + owner: owner, + tags: tags, + deploy_info: deploy_info + ) rescue DeployInfoError => e msg = "Can not get deploy info: " + e.message DevopsLogger.logger.error msg jid = "error_#{s.chef_node_name}_#{Time.new.to_i}" + dir = DevopsConfig.config[:report_dir_v2] file = File.jon(dir, jid) File.open(file, "w") do |out| - #unless attributes.nil? - # out << "Report attributes: #{attributes.inspect}\n" - #end out.write msg end o = { @@ -110,15 +110,12 @@ module Devops "deploy_env" => s.deploy_env, "type" => Report::DEPLOY_TYPE, "status" => Worker::STATUS::FAILED -# "attributes" => attributes } Devops::Db.connector.save_report(Report.new(o)) end - uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid - files.push uri.to_s + files.push uri end files - end def deploy_stream id, out diff --git a/devops-service/app/api2/routes/stack.rb b/devops-service/app/api2/routes/stack.rb index b04c06f..ec14acc 100644 --- a/devops-service/app/api2/routes/stack.rb +++ b/devops-service/app/api2/routes/stack.rb @@ -91,7 +91,7 @@ module Devops # # * *Returns* : # 200 - Updated - app.patch_with_headers "/stack/:id/deploy", :headers => [:accept, :content_type] do |id| + app.post_with_headers "/stack/:id/deploy", :headers => [:accept, :content_type] do |id| check_privileges("stack", "x") if request["X-Stream"] stream() do |out| diff --git a/devops-service/config.ru b/devops-service/config.ru index d64be0c..3d953fe 100644 --- a/devops-service/config.ru +++ b/devops-service/config.ru @@ -21,7 +21,7 @@ unless File.exists?(config[:devops_dir]) puts "Directory '#{config[:devops_dir]}' has been created" end -[:report_dir_v2].each do |key| +[:report_dir_v2, :project_info_dir].each do |key| directory = config[key] FileUtils.mkdir_p(directory) unless File.exists?(directory) end diff --git a/devops-service/core/devops-config.rb b/devops-service/core/devops-config.rb index c319ba9..395b3ba 100644 --- a/devops-service/core/devops-config.rb +++ b/devops-service/core/devops-config.rb @@ -28,6 +28,7 @@ class DevopsConfig end config[:report_dir_v2] = File.expand_path(File.join(config[:devops_dir], "report", "v2")) + config[:project_info_dir] = File.expand_path(File.join(config[:devops_dir], "project_info", "v2")) DevopsConfig.config = config end diff --git a/devops-service/db/mongo/connectors/server.rb b/devops-service/db/mongo/connectors/server.rb index fa1eb7b..b90a3a0 100644 --- a/devops-service/db/mongo/connectors/server.rb +++ b/devops-service/db/mongo/connectors/server.rb @@ -29,7 +29,7 @@ module Connectors servers_find(q, f) end - def stack_servers(stack_id, reserver=nil, options={}) + def stack_servers(stack_id, reserved=nil, options={}) q = {'stack' => stack_id} q['reserved_by'] = {'$ne' => nil} unless reserved.nil? list(q, options) diff --git a/devops-service/workers/deploy_worker.rb b/devops-service/workers/deploy_worker.rb index 6aa2181..e5851d9 100644 --- a/devops-service/workers/deploy_worker.rb +++ b/devops-service/workers/deploy_worker.rb @@ -6,25 +6,36 @@ require "db/mongo/models/report" class DeployWorker < Worker - def perform(dir, server, tags, owner, conf, deploy_info) - call(conf, nil, dir) do |provider, out, file| - mongo = Devops::Db.connector - s = Devops::Model::Server.new(server) - o = { - "file" => file, - "_id" => jid, - "created_by" => owner, - "project" => s.project, - "deploy_env" => s.deploy_env, - "type" => Devops::Model::Report::DEPLOY_TYPE, - "status" => STATUS::RUNNING, - "chef_node_name" => s.chef_node_name, - "host" => s.public_ip || s.private_ip - } - mongo.save_report(Devops::Model::Report.new(o)) + def perform(options) + server_attrs = options.fetch('server_attrs') + owner = options.fetch('owner') + tags = options.fetch('tags') + deploy_info = options.fetch('deploy_info') - status = Devops::Executor::ServerExecutor.new(s, out).deploy_server_with_tags(tags, deploy_info) - status + call(nil) do |not_used, out, file| + server = Devops::Model::Server.new(server_attrs) + save_report(file, owner, server) + + executor = Devops::Executor::ServerExecutor.new(server, out) + executor.deploy_server_with_tags(tags, deploy_info) end end + + private + + def save_report(file, owner, server) + report = { + "file" => file, + "_id" => jid, + "created_by" => owner, + "project" => server.project, + "deploy_env" => server.deploy_env, + "type" => Devops::Model::Report::DEPLOY_TYPE, + "status" => STATUS::RUNNING, + "chef_node_name" => server.chef_node_name, + "host" => server.public_ip || server.private_ip + } + mongo.save_report(Devops::Model::Report.new(report)) + end + end