diff --git a/devops-service/Gemfile b/devops-service/Gemfile index 377a458..fd15df2 100644 --- a/devops-service/Gemfile +++ b/devops-service/Gemfile @@ -4,7 +4,7 @@ source 'https://rubygems.org' gem "thin", "~>1.5.1" gem "mime-types", "~>1.25.1" -gem "sinatra", "1.4.3" +gem "sinatra", "1.4.5" gem "sinatra-contrib"#, "1.4.1" gem "sinatra-websocket"#, "~>0.3.0" gem "fog", "~>1.20" @@ -17,6 +17,7 @@ gem "rufus-scheduler", "2.0.24" gem "sidekiq", "3.2.6" gem 'wisper' gem 'rake', '10.2.0' +gem 'rack-accept-media-types' gem 'rack', '1.5.2' gem 'hooks' diff --git a/devops-service/Gemfile.lock b/devops-service/Gemfile.lock index e5c2f34..eb3077a 100644 --- a/devops-service/Gemfile.lock +++ b/devops-service/Gemfile.lock @@ -12,11 +12,11 @@ GEM columnize (= 0.9.0) celluloid (0.15.2) timers (~> 1.1.0) - chef (12.3.0) - chef-zero (~> 4.1) + chef (12.1.2) + chef-zero (~> 4.0) diff-lcs (~> 1.2, >= 1.2.4) erubis (~> 2.7) - ffi-yajl (>= 1.2, < 3.0) + ffi-yajl (~> 1.2) highline (~> 1.6, >= 1.6.9) mixlib-authentication (~> 1.3) mixlib-cli (~> 1.4) @@ -52,7 +52,7 @@ GEM multi_test (>= 0.1.2) cucumber-core (1.1.3) gherkin (~> 2.12.0) - daemons (1.2.2) + daemons (1.2.3) diff-lcs (1.2.5) em-websocket (0.3.8) addressable (>= 2.1.1) @@ -60,7 +60,7 @@ GEM erubis (2.7.0) eventmachine (1.0.7) excon (0.45.3) - ffi (1.9.8) + ffi (1.9.9) ffi-yajl (1.4.0) ffi (~> 1.5) libyajl2 (~> 1.2) @@ -92,12 +92,12 @@ GEM fog-atmos (0.1.0) fog-core fog-xml - fog-aws (0.5.0) + fog-aws (0.6.0) fog-core (~> 1.27) fog-json (~> 1.0) fog-xml (~> 0.1) ipaddress (~> 0.8) - fog-brightbox (0.7.1) + fog-brightbox (0.7.2) fog-core (~> 1.22) fog-json inflecto (~> 0.0.2) @@ -108,10 +108,10 @@ GEM mime-types net-scp (~> 1.1) net-ssh (>= 2.1.3) - fog-ecloud (0.1.3) + fog-ecloud (0.3.0) fog-core fog-xml - fog-google (0.0.5) + fog-google (0.0.6) fog-core fog-json fog-xml @@ -142,7 +142,7 @@ GEM fog-serverlove (0.1.2) fog-core fog-json - fog-softlayer (0.4.6) + fog-softlayer (0.4.7) fog-core fog-json fog-storm_on_demand (0.1.1) @@ -216,6 +216,7 @@ GEM method_source (~> 0.8.1) slop (~> 3.4) rack (1.5.2) + rack-accept-media-types (0.9) rack-protection (1.5.3) rack rack-test (0.6.3) @@ -256,7 +257,7 @@ GEM json redis (>= 3.0.6) redis-namespace (>= 1.3.1) - sinatra (1.4.3) + sinatra (1.4.5) rack (~> 1.4) rack-protection (~> 1.4) tilt (~> 1.3, >= 1.3.4) @@ -272,7 +273,7 @@ GEM eventmachine thin (>= 1.3.1, < 2.0.0) slop (3.6.0) - specinfra (2.36.1) + specinfra (2.36.6) net-scp net-ssh systemu (2.6.5) @@ -308,10 +309,11 @@ DEPENDENCIES mongo multi_json (= 1.7.8) rack (= 1.5.2) + rack-accept-media-types rake (= 10.2.0) rufus-scheduler (= 2.0.24) sidekiq (= 3.2.6) - sinatra (= 1.4.3) + sinatra (= 1.4.5) sinatra-contrib sinatra-websocket test-unit diff --git a/devops-service/app/devops-api2.rb b/devops-service/app/devops-api2.rb index c24c532..e69e705 100644 --- a/devops-service/app/devops-api2.rb +++ b/devops-service/app/devops-api2.rb @@ -21,6 +21,7 @@ module Devops require "routes/v2.0/handlers/server" require "routes/v2.0/handlers/stack_template" require "routes/v2.0/handlers/stack" + require "routes/v2.0/handlers/report" end def init @@ -56,6 +57,7 @@ module Devops require "routes/v2.0/bootstrap_templates" require "routes/v2.0/stack_template" require "routes/v2.0/stack" + require "routes/v2.0/report" routes = Devops::Version2_0::Routes.constants.collect{|s| Devops::Version2_0::Routes.const_get(s)}.select {|const| const.class == Module} routes.each do |r| diff --git a/devops-service/config.ru b/devops-service/config.ru index 4205988..4354bf3 100644 --- a/devops-service/config.ru +++ b/devops-service/config.ru @@ -32,4 +32,3 @@ Devops::Routes.routes.each do |p, c| run c end end -#run Rack::URLMap.new(Devops::Routes.routes) diff --git a/devops-service/devops-service.rb b/devops-service/devops-service.rb index 9a5e61f..7ecf411 100644 --- a/devops-service/devops-service.rb +++ b/devops-service/devops-service.rb @@ -52,7 +52,7 @@ class DevopsService a.prepare end - Devops::Loader.load_plugins + Devops::Loader.prepare_plugins apps.each do |a| a.init end diff --git a/devops-service/devops_loader.rb b/devops-service/devops_loader.rb deleted file mode 100644 index 0f63c4c..0000000 --- a/devops-service/devops_loader.rb +++ /dev/null @@ -1,7 +0,0 @@ -class DevopsLoader - - def self.load - #Devops::Routes.route "/version", DevopsVersion - end - -end diff --git a/devops-service/loader.rb b/devops-service/loader.rb index 175d710..429e299 100644 --- a/devops-service/loader.rb +++ b/devops-service/loader.rb @@ -2,7 +2,13 @@ module Devops module Loader class << self - def load_plugins + def prepare_plugins + plugins do |plugin| + plugin.prepare + end + end + + def init_plugins plugins do |plugin| plugin.init end diff --git a/devops-service/routes/routes.rb b/devops-service/routes/routes.rb deleted file mode 100644 index 66a8c56..0000000 --- a/devops-service/routes/routes.rb +++ /dev/null @@ -1,4 +0,0 @@ -require_relative "sidekiq_web" -require_relative "devops_version" -require_relative "devops-client" -require_relative "api_v2" diff --git a/devops-service/routes/v2.0.rb b/devops-service/routes/v2.0.rb index 0d91e1e..dbe1346 100644 --- a/devops-service/routes/v2.0.rb +++ b/devops-service/routes/v2.0.rb @@ -14,17 +14,6 @@ module Devops register Sinatra::DevopsAuth -=begin - use Rack::Auth::Basic do |username, password| - begin - settings.mongo.user_auth(username, password) - true - rescue RecordNotFound => e - false - end - end -=end - configure :production do disable :dump_errors disable :show_exceptions diff --git a/devops-service/routes/v2.0/handlers/report.rb b/devops-service/routes/v2.0/handlers/report.rb new file mode 100644 index 0000000..66e2a99 --- /dev/null +++ b/devops-service/routes/v2.0/handlers/report.rb @@ -0,0 +1,63 @@ +module Devops + module Version2_0 + module Handler + class Report + + def self.reports_all + lambda { + options = {} + ["project", "deploy_env", "type", "created_by", "date_from", "date_to", "sort", "status", "max_number", "chef_node_name"].each do |k| + options[k] = params[k] unless params[k].nil? + end + attributes_keys = params.keys.select{|k| k =~ /attributes\.*/} + attributes_keys.each do |ak| + options[ak] = params[ak] + end + json Devops::Db.connector.reports(options).map{|r| r.to_hash} + } + end + + def self.reports_latest + lambda { + options = {} + ["project", "deploy_env", "type", "created_by", "date_from", "date_to", "sort", "status", "chef_node_name"].each do |k| + options[k] = params[k] unless params[k].nil? + end + attributes_keys = params.keys.select{|k| k =~ /attributes\.*/} + attributes_keys.each do |ak| + options[ak] = params[ak] + end + json Devops::Db.connector.latest_reports(options).map{|r| r.to_hash} + } + end + + def self.attributes_all + lambda{ + json Devops::Db.connector.reports_attributes_values(params["name"]) + } + end + + def self.report + lambda{ + begin + r = Devops::Db.connector.report(params[:id]) + file = r.file + return [404, "Report '#{params[:id]}' does not exist"] unless File.exists? file + @text = Rack::Utils.escape_html(File.read(file)) + @done = completed?(params[:id]) + rescue RecordNotFound => e + if task_status(params[:id]) == Worker::STATUS::IN_QUEUE + @text = "Task '#{params[:id]}' has been queued" + @done = false + else + raise e + end + end + erb :index + } + end + end + end + end +end + diff --git a/devops-service/routes/v2.0/report.rb b/devops-service/routes/v2.0/report.rb new file mode 100644 index 0000000..f9c345c --- /dev/null +++ b/devops-service/routes/v2.0/report.rb @@ -0,0 +1,53 @@ +module Devops + module Version2_0 + module Routes + module ReportRoutes + + def self.registered(app) + + app.get_with_headers "/report/all", headers: [:accept], &Devops::Version2_0::Handler::Report.reports_all + app.get_with_headers "/report/all/latest", headers: [:accept], &Devops::Version2_0::Handler::Report.reports_latest + app.get_with_headers "/report/all/attributes/:name", headers: [:accept], &Devops::Version2_0::Handler::Report.attributes_all + app.get_with_headers "/report/:id", headers: [:accept], &Devops::Version2_0::Handler::Report.report + puts "Report routes initialized" + end + + def completed? id + r = task_status(id) + r == "completed" or r == "failed" + end + + def task_status id + r = Sidekiq.redis do |connection| + connection.hget("devops", id) + end + end + + end + end + end +end + +__END__ + +@@ layout + + + <% unless @done %> + + <% end %> + + + <%= yield %> + + + +@@ index +
+<%= @text %>
+
diff --git a/devops-service/sinatra/methods_with_headers.rb b/devops-service/sinatra/methods_with_headers.rb index 095b421..aeafdf9 100644 --- a/devops-service/sinatra/methods_with_headers.rb +++ b/devops-service/sinatra/methods_with_headers.rb @@ -1,4 +1,5 @@ require "sinatra/base" +require 'rack/accept_media_types' module Sinatra @@ -99,15 +100,11 @@ module Sinatra # # Can client works with JSON? def accept_json - logger.debug(request.accept) - unless request.accept? 'application/json' + types = request.accept_media_types + unless types.include?('application/json') or types.include?("*/*") response.headers['Accept'] = 'application/json' halt_response("Accept header should contains 'application/json' type", 406) end - rescue NoMethodError => e - #error in sinatra 1.4.4 (https://github.com/sinatra/sinatra/issues/844, https://github.com/sinatra/sinatra/pull/805) - response.headers['Accept'] = 'application/json' - halt_response("Accept header should contains 'application/json' type", 406) end # Check Content-Type header