diff --git a/devops-client/lib/devops-client/options/server_options.rb b/devops-client/lib/devops-client/options/server_options.rb index e5bfdbc..71461d0 100644 --- a/devops-client/lib/devops-client/options/server_options.rb +++ b/devops-client/lib/devops-client/options/server_options.rb @@ -103,7 +103,7 @@ class ServerOptions < CommonOptions options do |parser, options| parser.banner << self.create_banner - parser.recognize_option_value('without-bootstrap', 'server', + parser.recognize_option_value('without_bootstrap', 'server', type: :switch, switch_value: true, option_key: :without_bootstrap, diff --git a/devops-service/Gemfile b/devops-service/Gemfile index 91f848c..7cc7ac9 100644 --- a/devops-service/Gemfile +++ b/devops-service/Gemfile @@ -13,7 +13,7 @@ gem "chef", ">=12" gem "mongo" gem "bson_ext" gem "multi_json", "1.7.8" -gem "rufus-scheduler", "2.0.24" +# gem "rufus-scheduler", "2.0.24" gem "sidekiq", "3.2.6" gem 'wisper' gem 'rake', '10.2.0' diff --git a/devops-service/Gemfile.lock b/devops-service/Gemfile.lock index eb3077a..173fa21 100644 --- a/devops-service/Gemfile.lock +++ b/devops-service/Gemfile.lock @@ -244,8 +244,6 @@ GEM rspec_junit_formatter (0.2.3) builder (< 4) rspec-core (>= 2, < 4, != 2.12.0) - rufus-scheduler (2.0.24) - tzinfo (>= 0.3.22) serverspec (2.19.0) multi_json rspec (~> 3.0) @@ -283,11 +281,8 @@ GEM daemons (>= 1.0.9) eventmachine (>= 0.12.6) rack (>= 1.0.0) - thread_safe (0.3.5) tilt (1.4.1) timers (1.1.0) - tzinfo (1.2.2) - thread_safe (~> 0.1) uber (0.0.13) uuidtools (2.1.5) wisper (1.6.0) @@ -311,7 +306,6 @@ DEPENDENCIES rack (= 1.5.2) rack-accept-media-types rake (= 10.2.0) - rufus-scheduler (= 2.0.24) sidekiq (= 3.2.6) sinatra (= 1.4.5) sinatra-contrib @@ -319,3 +313,6 @@ DEPENDENCIES test-unit thin (~> 1.5.1) wisper + +BUNDLED WITH + 1.10.5 diff --git a/devops-service/app/devops-api2.rb b/devops-service/app/devops-api2.rb index 7a42782..c97d24c 100644 --- a/devops-service/app/devops-api2.rb +++ b/devops-service/app/devops-api2.rb @@ -1,4 +1,3 @@ -require "lib/expire_handler" module Devops class DevopsApi2Application < Application @@ -49,7 +48,6 @@ module Devops mongo.key_insert k end end - ExpireHandler.init Stubber.stub_providers!(config[:stub_providers]) end diff --git a/devops-service/db/mongo/models/report.rb b/devops-service/db/mongo/models/report.rb index 770e028..4d9a253 100644 --- a/devops-service/db/mongo/models/report.rb +++ b/devops-service/db/mongo/models/report.rb @@ -9,6 +9,7 @@ module Devops BOOTSTRAP_TYPE = 3 PROJECT_TEST_TYPE = 4 STACK_TYPE = 5 + DELETE_SERVER_TYPE = 6 attr_accessor :id, :file, :created_at, :updated_at, :created_by, :project, :deploy_env, :type, :chef_node_name, :host, :status diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index 1a5022c..83d82a0 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -1,4 +1,6 @@ require "lib/knife/knife_factory" +require "workers/worker" +require "workers/delete_server_worker" require "hooks" module Devops @@ -73,6 +75,9 @@ module Devops @out << "Done\n" @out.flush DevopsLogger.logger.info "Server with parameters: #{@server.to_hash.inspect} is running" + + schedule_expiration(@server) + unless options["without_bootstrap"] bootstrap_options = { bootstrap_template: i.bootstrap_template @@ -388,6 +393,33 @@ module Devops 120 end + def schedule_expiration(server) + expires = @deploy_env.expires + return unless expires + interval = interval_in_seconds(expires) + @out << "Planning expiration in #{expires}" + DeleteServerWorker.perform_in(interval, server_chef_node_name: server.chef_node_name) + end + + def interval_in_seconds(interval_as_string) + interval = interval_as_string.to_i + measure_unit = interval_as_string.chars.last + case measure_unit + when 's' + interval + when 'm' + interval * 60 + when 'h' + interval * 60 * 60 + when 'd' + interval * 60 * 60 * 24 + when 'w' + interval * 60 * 60 * 24 * 7 + else + raise 'Wrong interval format' + end + end + end end end diff --git a/devops-service/lib/expire_handler.rb b/devops-service/lib/expire_handler.rb deleted file mode 100644 index 1eba9df..0000000 --- a/devops-service/lib/expire_handler.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'rufus-scheduler' - -class ExpireHandler - - @@scheduler = Rufus::Scheduler.start_new - - def self.add server - unless server.expires_at.nil? - if server.expires_at < Time.now.to_i - ExpireHandler.do_it server - else - time = Time.at(server.expires_at) - @@scheduler.at time, ExpireHandler.new(server, chef_env) - DevopsLogger.logger "Server '#{server.chef_node_name}' will be expired at '#{time}'" - end - end - end - - def self.init - Devops::Db.connector.servers_find({"expires_at" => {"$ne" => nil}}, nil).each do |s| - ExpireHandler.add s - end - end - - def initialize server - @server = server - end - - def call(job) - ExpireHandler.do_it @server - end - - def self.do_it server - logger = DevopsLogger.logger - logger.info("Removing node '#{server.chef_node_name}' form project '#{server.project}' and env '#{server.deploy_env}'") - begin - delete_server(server, DevopsService.mongo, logger) - rescue => e - logger.error "ExpiredHandler error: " + e.message - end - end -end - diff --git a/devops-service/workers/delete_server_worker.rb b/devops-service/workers/delete_server_worker.rb new file mode 100644 index 0000000..ce607d3 --- /dev/null +++ b/devops-service/workers/delete_server_worker.rb @@ -0,0 +1,34 @@ +require "db/mongo/models/server" +require "db/mongo/models/report" +require "lib/executors/server_executor" + +class DeleteServerWorker < Worker + + def perform(options) + chef_node_name = options.fetch('server_chef_node_name') + puts "Expire server '#{chef_node_name}'." + + call(nil) do |not_used, out, file| + server = mongo.server_by_chef_node_name(chef_node_name) + save_report(file, server) + + e = Devops::Executor::ServerExecutor.new(server, out) + e.delete_server + end + end + + private + + def save_report(file, server) + report = Devops::Model::Report.new( + "file" => file, + "_id" => jid, + "created_by" => 'SYSTEM', + "project" => server.project, + "deploy_env" => server.deploy_env, + "type" => Devops::Model::Report::DELETE_SERVER_TYPE + ) + mongo.save_report(report) + end + +end