torquebox-backstage 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. data/Gemfile +18 -0
  2. data/Gemfile.lock +69 -0
  3. data/README.md +164 -0
  4. data/Rakefile +32 -0
  5. data/TODO +9 -0
  6. data/TORQUEBOX_VERSION +1 -0
  7. data/VERSION +1 -0
  8. data/backstage.rb +84 -0
  9. data/bin/backstage +78 -0
  10. data/config.ru +3 -0
  11. data/config/torquebox.yml +14 -0
  12. data/lib/apps.rb +18 -0
  13. data/lib/apps/models/app.rb +33 -0
  14. data/lib/apps/routes.rb +18 -0
  15. data/lib/authentication.rb +64 -0
  16. data/lib/destinations.rb +21 -0
  17. data/lib/destinations/models/destination.rb +80 -0
  18. data/lib/destinations/models/message.rb +67 -0
  19. data/lib/destinations/models/queue.rb +33 -0
  20. data/lib/destinations/models/topic.rb +59 -0
  21. data/lib/destinations/routes.rb +44 -0
  22. data/lib/has_mbean.rb +59 -0
  23. data/lib/helpers.rb +142 -0
  24. data/lib/jobs.rb +19 -0
  25. data/lib/jobs/models/job.rb +35 -0
  26. data/lib/jobs/routes.rb +18 -0
  27. data/lib/message_processors.rb +18 -0
  28. data/lib/message_processors/models/message_processor.rb +40 -0
  29. data/lib/message_processors/routes.rb +18 -0
  30. data/lib/pools.rb +18 -0
  31. data/lib/pools/models/pool.rb +51 -0
  32. data/lib/pools/routes.rb +41 -0
  33. data/lib/resource.rb +53 -0
  34. data/lib/resource_helpers.rb +63 -0
  35. data/lib/runtimes.rb +19 -0
  36. data/lib/runtimes/models/job.rb +35 -0
  37. data/lib/runtimes/routes.rb +18 -0
  38. data/lib/services.rb +18 -0
  39. data/lib/services/models/service.rb +35 -0
  40. data/lib/services/routes.rb +17 -0
  41. data/lib/torquebox_managed.rb +36 -0
  42. data/lib/util.rb +33 -0
  43. data/spec/api_spec.rb +136 -0
  44. data/spec/auth_spec.rb +70 -0
  45. data/spec/spec_helper.rb +39 -0
  46. data/views/apps/index.haml +15 -0
  47. data/views/apps/show.haml +12 -0
  48. data/views/css/_mixins.sass +51 -0
  49. data/views/css/html5reset.sass +82 -0
  50. data/views/css/style.sass +152 -0
  51. data/views/destinations/index.haml +37 -0
  52. data/views/destinations/show.haml +18 -0
  53. data/views/jobs/index.haml +23 -0
  54. data/views/jobs/show.haml +13 -0
  55. data/views/layout.haml +31 -0
  56. data/views/message_processors/index.haml +28 -0
  57. data/views/message_processors/show.haml +12 -0
  58. data/views/messages/index.haml +20 -0
  59. data/views/messages/properties.haml +3 -0
  60. data/views/messages/show.haml +19 -0
  61. data/views/pools/index.haml +32 -0
  62. data/views/pools/show.haml +44 -0
  63. data/views/services/index.haml +21 -0
  64. data/views/services/show.haml +13 -0
  65. metadata +289 -0
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ source :rubygems
2
+
3
+ gem "sinatra", "1.1.2"
4
+ gem "rack-flash"
5
+ gem 'haml', '~>3.0'
6
+ gem "jmx", '0.7'
7
+ gem 'json'
8
+ gem 'torquebox', '1.0.0.CR1'
9
+ gem 'tobias-sinatra-url-for'
10
+ gem 'rack-accept'
11
+
12
+ group :development do
13
+ gem 'thor'
14
+ gem 'jeweler'
15
+ gem 'watchr'
16
+ gem 'rspec'
17
+ gem 'rack-test'
18
+ end
@@ -0,0 +1,69 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ diff-lcs (1.1.2)
5
+ git (1.2.5)
6
+ haml (3.0.25)
7
+ jeweler (1.5.2)
8
+ bundler (~> 1.0.0)
9
+ git (>= 1.2.5)
10
+ rake
11
+ jmx (0.7)
12
+ json (1.5.1-java)
13
+ rack (1.2.1)
14
+ rack-accept (0.4.3)
15
+ rack (>= 0.4)
16
+ rack-flash (0.1.1)
17
+ rack
18
+ rack-test (0.5.7)
19
+ rack (>= 1.0)
20
+ rake (0.8.7)
21
+ rspec (2.5.0)
22
+ rspec-core (~> 2.5.0)
23
+ rspec-expectations (~> 2.5.0)
24
+ rspec-mocks (~> 2.5.0)
25
+ rspec-core (2.5.1)
26
+ rspec-expectations (2.5.0)
27
+ diff-lcs (~> 1.1.2)
28
+ rspec-mocks (2.5.0)
29
+ sinatra (1.1.2)
30
+ rack (~> 1.1)
31
+ tilt (~> 1.2)
32
+ thor (0.14.6)
33
+ tilt (1.2.2)
34
+ tobias-sinatra-url-for (0.2.1)
35
+ sinatra (>= 0.9.1.1)
36
+ torquebox (1.0.0.CR1)
37
+ torquebox-base (= 1.0.0.CR1)
38
+ torquebox-messaging (= 1.0.0.CR1)
39
+ torquebox-naming (= 1.0.0.CR1)
40
+ torquebox-rake-support (= 1.0.0.CR1)
41
+ torquebox-vfs (= 1.0.0.CR1)
42
+ torquebox-web (= 1.0.0.CR1)
43
+ torquebox-base (1.0.0.CR1-java)
44
+ torquebox-messaging (1.0.0.CR1-java)
45
+ torquebox-base (= 1.0.0.CR1)
46
+ torquebox-naming (= 1.0.0.CR1)
47
+ torquebox-naming (1.0.0.CR1-java)
48
+ torquebox-rake-support (1.0.0.CR1)
49
+ torquebox-vfs (1.0.0.CR1-java)
50
+ torquebox-web (1.0.0.CR1-java)
51
+ watchr (0.7)
52
+
53
+ PLATFORMS
54
+ java
55
+
56
+ DEPENDENCIES
57
+ haml (~> 3.0)
58
+ jeweler
59
+ jmx (= 0.7)
60
+ json
61
+ rack-accept
62
+ rack-flash
63
+ rack-test
64
+ rspec
65
+ sinatra (= 1.1.2)
66
+ thor
67
+ tobias-sinatra-url-for
68
+ torquebox (= 1.0.0.CR1)
69
+ watchr
@@ -0,0 +1,164 @@
1
+ # TorqueBox BackStage #
2
+
3
+ BackStage is a Sinatra application that when deployed into a TorqueBox
4
+ server gives you visibility into the apps, queues, topics, message
5
+ processors, jobs, and services, allowing you to browse settings and stats,
6
+ and exposes some actions to allow you to change the operational state of
7
+ the components:
8
+
9
+ * pause/resume queues and topics
10
+ * stop/start message processors, services, and jobs
11
+ * execute debug ruby code inside a runtime pool
12
+ * view stats on all of the above
13
+
14
+ In addition, BackStage allows you to browse messages on a queue, and hides
15
+ some of the underlying complexity of how topics are implemented in HornetQ.
16
+
17
+ It basically acts as an friendly overlay for JMX, so is very easy to
18
+ extend if there is more data you want to see. The data/actions that are
19
+ available from BackStage are also available from `/jmx-console` (with
20
+ the exception of queue message browsing), but are more accessible in
21
+ BackStage.
22
+
23
+ ## Authentication ##
24
+
25
+ By default, access to BackStage is wide open. You can secure it by setting
26
+ `REQUIRE_AUTHENTICATION: true` in the environment section of `torquebox.yml`:
27
+
28
+ environment:
29
+ REQUIRE_AUTHENTICATION: true
30
+
31
+ This will enable basic JAAS authentication through TorqueBox. Use the
32
+ rake task to add usernames and password:
33
+
34
+ $ rake torquebox:auth:adduser CREDENTIALS=username:password
35
+
36
+ ## Installation ##
37
+
38
+ BackStage can either be installed and deployed as a gem, or deployed from the
39
+ application source.
40
+
41
+ ### As A Gem ###
42
+
43
+
44
+ First, install the gem:
45
+
46
+ jruby -S gem install torquebox-backstage
47
+
48
+ *Note:* the torquebox-backstage gem cannot be made available on rubygems.org
49
+ until an official release of the torquebox gems is made. Until then, you will
50
+ need to check out the source and run `jruby -S rake install` to install the gem.
51
+
52
+ Then, deploy backstage using the `backstage` command. You can deploy with security
53
+ disabled:
54
+
55
+ jruby -S backstage deploy
56
+
57
+ Or enable security by providing a username/password pair:
58
+
59
+ jruby -S backstage deploy --secure=username:password
60
+
61
+ ### From Source ###
62
+
63
+ Clone the [git repo](https://github.com/torquebox/backstage),
64
+ then run bundler to install the needed gems (listed in the
65
+ [Gemfile](https://github.com/torquebox/backstage/blob/master/Gemfile)):
66
+
67
+ jruby -S gem install bundler # if you haven't done so already
68
+ jruby -S bundle install
69
+
70
+ Once that's done, you can either deploy a deployment descriptor pointing at
71
+ the checked out repo:
72
+
73
+ jruby -S rake torquebox:deploy
74
+
75
+ or archive and deploy it as a .knob (zipfile):
76
+
77
+ jruby -S rake torquebox:deploy:archive
78
+
79
+ By default, BackStage is deployed to the `/backstage` context (see the `context:`
80
+ setting in `torquebox.yml`).
81
+
82
+ ## API ##
83
+
84
+ BackStage also provides a RESTful API that allows you to access almost any of the
85
+ data or actions of the web UI (browsing messages via the API is not yet available).
86
+ The API provides a top level entry point at `/api` that returns a list of collection
87
+ urls. The data is returned as JSON, and you must either pass `format=json` as a
88
+ query parameter, or set the `Accept:` header to `application/json`. `/api` always
89
+ returns JSON, no matter what `Accept:` header or format param you use, and all of
90
+ the urls returned in the JSON include the `format=json` parameter.
91
+
92
+ ### Example ###
93
+
94
+ First, we retrieve the API entry point:
95
+
96
+ curl http://localhost:8080/backstage/api
97
+
98
+ Returns:
99
+
100
+ {
101
+ "collections":{
102
+ "apps":"http://localhost:8080/backstage/apps?format=json",
103
+ "queues":"http://localhost:8080/backstage/queues?format=json",
104
+ "topics":"http://localhost:8080/backstage/topics?format=json",
105
+ "message_processors":"http://localhost:8080/backstage/message_processors?format=json",
106
+ "jobs":"http://localhost:8080/backstage/jobs?format=json",
107
+ "services":"http://localhost:8080/backstage/services?format=json"
108
+ }
109
+ }
110
+
111
+ Then, we'll use the url for services to retrieve the service index:
112
+
113
+ curl http://localhost:8080/backstage/services?format=json
114
+
115
+ Returns:
116
+
117
+ [
118
+ {
119
+ "resource":"http://localhost:8080/backstage/service/dG9ycXVlYm94LnNlcnZpY2VzOmFwcD1raXRjaGVuLXNpbmsudHJxLG5hbWU9QVNlcnZpY2U=?format=json",
120
+ "name":"AService",
121
+ "app":"http://localhost:8080/backstage/app/dG9ycXVlYm94LmFwcHM6YXBwPWtpdGNoZW4tc2luay50cnE=?format=json",
122
+ "app_name":"kitchen-sink",
123
+ "status":"Started",
124
+ "actions":{
125
+ "stop":"http://localhost:8080/backstage/service/dG9ycXVlYm94LnNlcnZpY2VzOmFwcD1raXRjaGVuLXNpbmsudHJxLG5hbWU9QVNlcnZpY2U=/stop?format=json"
126
+ }
127
+ }
128
+ ]
129
+
130
+ Each index entry contains the full contents of the entry, along with URL
131
+ to access the resource itself. URLs to associated resources are included as
132
+ well (the app in this case).
133
+
134
+ If a resource has actions that can be performed on it, they will appear in
135
+ the results under `actions`. Action urls must be called via POST, and
136
+ return the JSON encoded resource:
137
+
138
+ curl -X POST http://localhost:8080/backstage/service/dG9ycXVlYm94LnNlcnZpY2VzOmFwcD1raXRjaGVuLXNpbmsudHJxLG5hbWU9QVNlcnZpY2U=/stop?format=json
139
+
140
+ Returns:
141
+
142
+ {
143
+ "resource":"http://localhost:8080/backstage/service/dG9ycXVlYm94LnNlcnZpY2VzOmFwcD1raXRjaGVuLXNpbmsudHJxLG5hbWU9QVNlcnZpY2U=?format=json",
144
+ "name":"AService",
145
+ "app":"http://localhost:8080/backstage/app/dG9ycXVlYm94LmFwcHM6YXBwPWtpdGNoZW4tc2luay50cnE=?format=json",
146
+ "app_name":"kitchen-sink",
147
+ "status":"Stopped",
148
+ "actions":{
149
+ "start'":"http://localhost:8080/backstage/service/dG9ycXVlYm94LnNlcnZpY2VzOmFwcD1raXRjaGVuLXNpbmsudHJxLG5hbWU9QVNlcnZpY2U=/start'?format=json"
150
+ }
151
+ }
152
+
153
+ ## Contributing ##
154
+
155
+ Bug reports, feature requests, and patches are always welcome! See
156
+ http://torquebox.org/community/ on how to get in touch with the TorqueBox
157
+ crew.
158
+
159
+ ## License ##
160
+
161
+ Copyright 2011 Red Hat, Inc.
162
+
163
+ Licensed under the Apache Software License version 2. See
164
+ http://www.apache.org/licenses/LICENSE-2.0 for details.
@@ -0,0 +1,32 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+ require 'torquebox-rake-support'
12
+
13
+ require 'jeweler'
14
+ Jeweler::Tasks.new do |gem|
15
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
16
+ gem.name = "torquebox-backstage"
17
+ gem.homepage = "http://github.com/torquebox/backstage"
18
+ gem.license = "MIT"
19
+ gem.summary = %Q{BackStage - Queue/Topic/Job viewer for TorqueBox}
20
+ gem.description = %Q{BackStage - Queue/Topic/Job viewer for TorqueBox}
21
+ gem.email = "tcrawley@redhat.com"
22
+ gem.authors = ["Tobias Crawley"]
23
+ gem.files = FileList["[A-Z]*", 'backstage.rb', 'config.ru', 'bin/*.rb', "{config,lib,spec,views}/**/*"]
24
+ gem.executables = %w{backstage}
25
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
26
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
27
+ gem.add_runtime_dependency 'thor', '> 0.14'
28
+ gem.add_runtime_dependency 'bundler', '> 1.0.12'
29
+ end
30
+ Jeweler::RubygemsDotOrgTasks.new
31
+
32
+
data/TODO ADDED
@@ -0,0 +1,9 @@
1
+ TODO
2
+
3
+ * allow queue browsing from the API
4
+ * link queues/topics to their apps
5
+ * see how backstage behaves in a cluster
6
+ * allow resending DLQ and ExpiryQueue messages
7
+ * store failure backtraces for jobs/tasks in TorqueBox, and display here
8
+ * improve test coverage
9
+ * add stats collection, with memory usage and other bits? ruby runtime stats?
@@ -0,0 +1 @@
1
+ 1.0.0.RC1-SNAPSHOT
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,84 @@
1
+ #
2
+ # Copyright 2011 Red Hat, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'bundler/setup'
18
+ require 'sinatra/base'
19
+ require 'rack-flash'
20
+ require 'rack/accept'
21
+ require 'haml'
22
+ require 'sass'
23
+ require 'jmx'
24
+
25
+ $:.unshift File.join( File.dirname( __FILE__ ), 'lib' )
26
+
27
+ require 'torquebox'
28
+ require 'resource_helpers'
29
+ require 'resource'
30
+ require 'helpers'
31
+ require 'has_mbean'
32
+ require 'torquebox_managed'
33
+ require 'pools'
34
+ require 'apps'
35
+ require 'destinations'
36
+ require 'message_processors'
37
+ require 'jobs'
38
+ require 'services'
39
+
40
+
41
+ puts "ENV['REQUIRE_AUTHENTICATION'] is not set, *disabling* authentication" unless ENV['REQUIRE_AUTHENTICATION']
42
+
43
+ module Backstage
44
+ BACKSTAGE_VERSION = File.readlines( File.join( File.dirname( __FILE__ ), 'VERSION' ) ).first.strip
45
+ TORQUEBOX_VERSION = File.readlines( File.join( File.dirname( __FILE__ ), 'TORQUEBOX_VERSION' ) ).first.strip
46
+
47
+ class Application < Sinatra::Base
48
+ enable :logging, :sessions
49
+ use Rack::Accept
50
+ use Rack::Flash
51
+
52
+ include Backstage::Authentication
53
+
54
+ set :views, Proc.new { File.join( File.dirname( __FILE__ ), "views" ) }
55
+
56
+ before do
57
+ require_authentication if ENV['REQUIRE_AUTHENTICATION']
58
+ end
59
+
60
+ get '/api' do
61
+ content_type :json
62
+
63
+ {
64
+ :collections => [:pools, :apps, :queues, :topics, :message_processors, :jobs, :services].inject({}) do |collections, collection|
65
+ collections[collection] = json_url_for( collection_path( collection ) )
66
+ collections
67
+ end
68
+ }.to_json
69
+ end
70
+
71
+ get '/' do
72
+ redirect_to collection_path( :apps )
73
+ end
74
+
75
+ get '/css/style.css' do
76
+ sass :'css/style'
77
+ end
78
+
79
+ get '/css/html5reset.css' do
80
+ sass :'css/html5reset'
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env jruby
2
+ #-*-ruby-*-
3
+ #
4
+ # Copyright 2011 Red Hat, Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ require 'thor'
19
+ require 'torquebox-rake-support'
20
+
21
+ class BackstageCommand < Thor
22
+
23
+ DEPLOYMENT_NAME = 'backstage-knob.yml'
24
+
25
+ desc "deploy [--secure=username:password[,username:password]*]", "Deploys backstage to $TORQUEBOX_HOME/apps"
26
+ method_option :secure, :type => :hash, :default => nil
27
+ def deploy
28
+ check
29
+ descriptor = TorqueBox::DeployUtils.basic_deployment_descriptor( :root => root_dir,
30
+ :env => 'production' )
31
+ if options[:secure]
32
+ descriptor['environment'] = { 'REQUIRE_AUTHENTICATION' => true }
33
+ credentials = []
34
+ options[:secure].each do |user, pass|
35
+ credentials << [user, pass]
36
+ end
37
+ prop_file = TorqueBox::DeployUtils.write_credentials( credentials )
38
+ puts ">> Wrote user/password entries to #{prop_file}"
39
+ else
40
+ puts ">> WARNING: deploying BackStage with no security - use the --secure=username:password option to secure it"
41
+ end
42
+
43
+ name, dir = TorqueBox::DeployUtils.deploy_yaml( descriptor, DEPLOYMENT_NAME )
44
+
45
+ puts ">> Deployed #{name} to #{dir}"
46
+ end
47
+
48
+ desc "undeploy", "Removes backstage from $TORQUEBOX_HOME/apps"
49
+ def undeploy
50
+ check
51
+ name, dir = TorqueBox::DeployUtils.undeploy( DEPLOYMENT_NAME )
52
+
53
+ puts ">> Undeployed #{name} from #{dir}"
54
+ end
55
+
56
+ desc "info", "Prints info about BackStage's status"
57
+ def info
58
+ check
59
+ path = File.join( ENV['TORQUEBOX_HOME'], 'apps', DEPLOYMENT_NAME )
60
+ if File.exists?( path )
61
+ puts ">> BackStage deployed to #{path}"
62
+ else
63
+ puts ">> BackStage is not deployed"
64
+ end
65
+ end
66
+
67
+ protected
68
+ def check
69
+ raise Exception.new("$TORQUEBOX_HOME must be set") unless ENV['TORQUEBOX_HOME']
70
+ end
71
+
72
+ def root_dir
73
+ File.expand_path( File.join( File.dirname( __FILE__ ), '..' ) )
74
+ end
75
+
76
+ end
77
+
78
+ BackstageCommand.start