some fixes, report in api_v2

This commit is contained in:
amartynov 2015-06-30 14:27:42 +03:00
parent 22663ec30c
commit 9b9050939e
12 changed files with 146 additions and 45 deletions

View File

@ -4,7 +4,7 @@ source 'https://rubygems.org'
gem "thin", "~>1.5.1" gem "thin", "~>1.5.1"
gem "mime-types", "~>1.25.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-contrib"#, "1.4.1"
gem "sinatra-websocket"#, "~>0.3.0" gem "sinatra-websocket"#, "~>0.3.0"
gem "fog", "~>1.20" gem "fog", "~>1.20"
@ -17,6 +17,7 @@ gem "rufus-scheduler", "2.0.24"
gem "sidekiq", "3.2.6" gem "sidekiq", "3.2.6"
gem 'wisper' gem 'wisper'
gem 'rake', '10.2.0' gem 'rake', '10.2.0'
gem 'rack-accept-media-types'
gem 'rack', '1.5.2' gem 'rack', '1.5.2'
gem 'hooks' gem 'hooks'

View File

@ -12,11 +12,11 @@ GEM
columnize (= 0.9.0) columnize (= 0.9.0)
celluloid (0.15.2) celluloid (0.15.2)
timers (~> 1.1.0) timers (~> 1.1.0)
chef (12.3.0) chef (12.1.2)
chef-zero (~> 4.1) chef-zero (~> 4.0)
diff-lcs (~> 1.2, >= 1.2.4) diff-lcs (~> 1.2, >= 1.2.4)
erubis (~> 2.7) erubis (~> 2.7)
ffi-yajl (>= 1.2, < 3.0) ffi-yajl (~> 1.2)
highline (~> 1.6, >= 1.6.9) highline (~> 1.6, >= 1.6.9)
mixlib-authentication (~> 1.3) mixlib-authentication (~> 1.3)
mixlib-cli (~> 1.4) mixlib-cli (~> 1.4)
@ -52,7 +52,7 @@ GEM
multi_test (>= 0.1.2) multi_test (>= 0.1.2)
cucumber-core (1.1.3) cucumber-core (1.1.3)
gherkin (~> 2.12.0) gherkin (~> 2.12.0)
daemons (1.2.2) daemons (1.2.3)
diff-lcs (1.2.5) diff-lcs (1.2.5)
em-websocket (0.3.8) em-websocket (0.3.8)
addressable (>= 2.1.1) addressable (>= 2.1.1)
@ -60,7 +60,7 @@ GEM
erubis (2.7.0) erubis (2.7.0)
eventmachine (1.0.7) eventmachine (1.0.7)
excon (0.45.3) excon (0.45.3)
ffi (1.9.8) ffi (1.9.9)
ffi-yajl (1.4.0) ffi-yajl (1.4.0)
ffi (~> 1.5) ffi (~> 1.5)
libyajl2 (~> 1.2) libyajl2 (~> 1.2)
@ -92,12 +92,12 @@ GEM
fog-atmos (0.1.0) fog-atmos (0.1.0)
fog-core fog-core
fog-xml fog-xml
fog-aws (0.5.0) fog-aws (0.6.0)
fog-core (~> 1.27) fog-core (~> 1.27)
fog-json (~> 1.0) fog-json (~> 1.0)
fog-xml (~> 0.1) fog-xml (~> 0.1)
ipaddress (~> 0.8) ipaddress (~> 0.8)
fog-brightbox (0.7.1) fog-brightbox (0.7.2)
fog-core (~> 1.22) fog-core (~> 1.22)
fog-json fog-json
inflecto (~> 0.0.2) inflecto (~> 0.0.2)
@ -108,10 +108,10 @@ GEM
mime-types mime-types
net-scp (~> 1.1) net-scp (~> 1.1)
net-ssh (>= 2.1.3) net-ssh (>= 2.1.3)
fog-ecloud (0.1.3) fog-ecloud (0.3.0)
fog-core fog-core
fog-xml fog-xml
fog-google (0.0.5) fog-google (0.0.6)
fog-core fog-core
fog-json fog-json
fog-xml fog-xml
@ -142,7 +142,7 @@ GEM
fog-serverlove (0.1.2) fog-serverlove (0.1.2)
fog-core fog-core
fog-json fog-json
fog-softlayer (0.4.6) fog-softlayer (0.4.7)
fog-core fog-core
fog-json fog-json
fog-storm_on_demand (0.1.1) fog-storm_on_demand (0.1.1)
@ -216,6 +216,7 @@ GEM
method_source (~> 0.8.1) method_source (~> 0.8.1)
slop (~> 3.4) slop (~> 3.4)
rack (1.5.2) rack (1.5.2)
rack-accept-media-types (0.9)
rack-protection (1.5.3) rack-protection (1.5.3)
rack rack
rack-test (0.6.3) rack-test (0.6.3)
@ -256,7 +257,7 @@ GEM
json json
redis (>= 3.0.6) redis (>= 3.0.6)
redis-namespace (>= 1.3.1) redis-namespace (>= 1.3.1)
sinatra (1.4.3) sinatra (1.4.5)
rack (~> 1.4) rack (~> 1.4)
rack-protection (~> 1.4) rack-protection (~> 1.4)
tilt (~> 1.3, >= 1.3.4) tilt (~> 1.3, >= 1.3.4)
@ -272,7 +273,7 @@ GEM
eventmachine eventmachine
thin (>= 1.3.1, < 2.0.0) thin (>= 1.3.1, < 2.0.0)
slop (3.6.0) slop (3.6.0)
specinfra (2.36.1) specinfra (2.36.6)
net-scp net-scp
net-ssh net-ssh
systemu (2.6.5) systemu (2.6.5)
@ -308,10 +309,11 @@ DEPENDENCIES
mongo mongo
multi_json (= 1.7.8) multi_json (= 1.7.8)
rack (= 1.5.2) rack (= 1.5.2)
rack-accept-media-types
rake (= 10.2.0) rake (= 10.2.0)
rufus-scheduler (= 2.0.24) rufus-scheduler (= 2.0.24)
sidekiq (= 3.2.6) sidekiq (= 3.2.6)
sinatra (= 1.4.3) sinatra (= 1.4.5)
sinatra-contrib sinatra-contrib
sinatra-websocket sinatra-websocket
test-unit test-unit

View File

@ -21,6 +21,7 @@ module Devops
require "routes/v2.0/handlers/server" require "routes/v2.0/handlers/server"
require "routes/v2.0/handlers/stack_template" require "routes/v2.0/handlers/stack_template"
require "routes/v2.0/handlers/stack" require "routes/v2.0/handlers/stack"
require "routes/v2.0/handlers/report"
end end
def init def init
@ -56,6 +57,7 @@ module Devops
require "routes/v2.0/bootstrap_templates" require "routes/v2.0/bootstrap_templates"
require "routes/v2.0/stack_template" require "routes/v2.0/stack_template"
require "routes/v2.0/stack" 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 = Devops::Version2_0::Routes.constants.collect{|s| Devops::Version2_0::Routes.const_get(s)}.select {|const| const.class == Module}
routes.each do |r| routes.each do |r|

View File

@ -32,4 +32,3 @@ Devops::Routes.routes.each do |p, c|
run c run c
end end
end end
#run Rack::URLMap.new(Devops::Routes.routes)

View File

@ -52,7 +52,7 @@ class DevopsService
a.prepare a.prepare
end end
Devops::Loader.load_plugins Devops::Loader.prepare_plugins
apps.each do |a| apps.each do |a|
a.init a.init
end end

View File

@ -1,7 +0,0 @@
class DevopsLoader
def self.load
#Devops::Routes.route "/version", DevopsVersion
end
end

View File

@ -2,7 +2,13 @@ module Devops
module Loader module Loader
class << self class << self
def load_plugins def prepare_plugins
plugins do |plugin|
plugin.prepare
end
end
def init_plugins
plugins do |plugin| plugins do |plugin|
plugin.init plugin.init
end end

View File

@ -1,4 +0,0 @@
require_relative "sidekiq_web"
require_relative "devops_version"
require_relative "devops-client"
require_relative "api_v2"

View File

@ -14,17 +14,6 @@ module Devops
register Sinatra::DevopsAuth 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 configure :production do
disable :dump_errors disable :dump_errors
disable :show_exceptions disable :show_exceptions

View File

@ -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

View File

@ -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
<html>
<head>
<% unless @done %>
<script>
function reload() {
location.reload();
}
setTimeout(reload, 5000);
</script>
<% end %>
</head>
<body>
<%= yield %>
</body>
</html>
@@ index
<pre>
<%= @text %>
</pre>

View File

@ -1,4 +1,5 @@
require "sinatra/base" require "sinatra/base"
require 'rack/accept_media_types'
module Sinatra module Sinatra
@ -99,15 +100,11 @@ module Sinatra
# #
# Can client works with JSON? # Can client works with JSON?
def accept_json def accept_json
logger.debug(request.accept) types = request.accept_media_types
unless request.accept? 'application/json' unless types.include?('application/json') or types.include?("*/*")
response.headers['Accept'] = 'application/json' response.headers['Accept'] = 'application/json'
halt_response("Accept header should contains 'application/json' type", 406) halt_response("Accept header should contains 'application/json' type", 406)
end 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 end
# Check Content-Type header # Check Content-Type header