torquebox-backstage 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +18 -0
- data/Gemfile.lock +69 -0
- data/README.md +164 -0
- data/Rakefile +32 -0
- data/TODO +9 -0
- data/TORQUEBOX_VERSION +1 -0
- data/VERSION +1 -0
- data/backstage.rb +84 -0
- data/bin/backstage +78 -0
- data/config.ru +3 -0
- data/config/torquebox.yml +14 -0
- data/lib/apps.rb +18 -0
- data/lib/apps/models/app.rb +33 -0
- data/lib/apps/routes.rb +18 -0
- data/lib/authentication.rb +64 -0
- data/lib/destinations.rb +21 -0
- data/lib/destinations/models/destination.rb +80 -0
- data/lib/destinations/models/message.rb +67 -0
- data/lib/destinations/models/queue.rb +33 -0
- data/lib/destinations/models/topic.rb +59 -0
- data/lib/destinations/routes.rb +44 -0
- data/lib/has_mbean.rb +59 -0
- data/lib/helpers.rb +142 -0
- data/lib/jobs.rb +19 -0
- data/lib/jobs/models/job.rb +35 -0
- data/lib/jobs/routes.rb +18 -0
- data/lib/message_processors.rb +18 -0
- data/lib/message_processors/models/message_processor.rb +40 -0
- data/lib/message_processors/routes.rb +18 -0
- data/lib/pools.rb +18 -0
- data/lib/pools/models/pool.rb +51 -0
- data/lib/pools/routes.rb +41 -0
- data/lib/resource.rb +53 -0
- data/lib/resource_helpers.rb +63 -0
- data/lib/runtimes.rb +19 -0
- data/lib/runtimes/models/job.rb +35 -0
- data/lib/runtimes/routes.rb +18 -0
- data/lib/services.rb +18 -0
- data/lib/services/models/service.rb +35 -0
- data/lib/services/routes.rb +17 -0
- data/lib/torquebox_managed.rb +36 -0
- data/lib/util.rb +33 -0
- data/spec/api_spec.rb +136 -0
- data/spec/auth_spec.rb +70 -0
- data/spec/spec_helper.rb +39 -0
- data/views/apps/index.haml +15 -0
- data/views/apps/show.haml +12 -0
- data/views/css/_mixins.sass +51 -0
- data/views/css/html5reset.sass +82 -0
- data/views/css/style.sass +152 -0
- data/views/destinations/index.haml +37 -0
- data/views/destinations/show.haml +18 -0
- data/views/jobs/index.haml +23 -0
- data/views/jobs/show.haml +13 -0
- data/views/layout.haml +31 -0
- data/views/message_processors/index.haml +28 -0
- data/views/message_processors/show.haml +12 -0
- data/views/messages/index.haml +20 -0
- data/views/messages/properties.haml +3 -0
- data/views/messages/show.haml +19 -0
- data/views/pools/index.haml +32 -0
- data/views/pools/show.haml +44 -0
- data/views/services/index.haml +21 -0
- data/views/services/show.haml +13 -0
- metadata +289 -0
data/config.ru
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
web:
|
2
|
+
context: /backstage
|
3
|
+
|
4
|
+
tasks:
|
5
|
+
Backgroundable:
|
6
|
+
concurrency: 0
|
7
|
+
|
8
|
+
ruby:
|
9
|
+
version: 1.9
|
10
|
+
|
11
|
+
environment:
|
12
|
+
# Add users to $JBOSS_HOME/server/default/conf/props/torquebox-users.properties
|
13
|
+
# or just call rake torquebox:auth:adduser CREDENTIALS=user:pass from the command line
|
14
|
+
# REQUIRE_AUTHENTICATION: true
|
data/lib/apps.rb
ADDED
@@ -0,0 +1,18 @@
|
|
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 'apps/models/app'
|
18
|
+
require 'apps/routes'
|
@@ -0,0 +1,33 @@
|
|
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
|
+
module Backstage
|
18
|
+
class App
|
19
|
+
include HasMBean
|
20
|
+
include TorqueBoxManaged
|
21
|
+
include Resource
|
22
|
+
|
23
|
+
def self.filter
|
24
|
+
"torquebox.apps:*"
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.to_hash_attributes
|
28
|
+
super + [:name, :environment_name, :root_path, :deployed_at]
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
data/lib/apps/routes.rb
ADDED
@@ -0,0 +1,18 @@
|
|
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
|
+
Backstage::Application.resource :app
|
18
|
+
|
@@ -0,0 +1,64 @@
|
|
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 'torquebox'
|
18
|
+
require 'org/torquebox/auth/authentication'
|
19
|
+
|
20
|
+
module Backstage
|
21
|
+
module Authentication
|
22
|
+
|
23
|
+
def auth
|
24
|
+
@auth ||= Rack::Auth::Basic::Request.new(request.env)
|
25
|
+
end
|
26
|
+
|
27
|
+
def unauthorized!(realm=request.host)
|
28
|
+
headers 'WWW-Authenticate' => %(Basic realm="#{realm}")
|
29
|
+
throw :halt, [ 401, 'Authentication Required' ]
|
30
|
+
end
|
31
|
+
|
32
|
+
def bad_request!
|
33
|
+
throw :halt, [ 400, 'Bad Request' ]
|
34
|
+
end
|
35
|
+
|
36
|
+
def login_path
|
37
|
+
"#{request.script_name}/login"
|
38
|
+
end
|
39
|
+
|
40
|
+
def authenticated?
|
41
|
+
!request.env['REMOTE_USER'].nil?
|
42
|
+
end
|
43
|
+
|
44
|
+
def authenticate(username, password)
|
45
|
+
return false if username.nil? || password.nil?
|
46
|
+
authenticator = TorqueBox::Authentication.default
|
47
|
+
authenticator.authenticate(username, password)
|
48
|
+
end
|
49
|
+
|
50
|
+
def skip_authentication
|
51
|
+
request.env['SKIP_AUTH'] = true
|
52
|
+
end
|
53
|
+
|
54
|
+
def require_authentication
|
55
|
+
return if request.env['SKIP_AUTH']
|
56
|
+
return if authenticated?
|
57
|
+
unauthorized! unless auth.provided?
|
58
|
+
bad_request! unless auth.basic?
|
59
|
+
unauthorized! unless authenticate(*auth.credentials)
|
60
|
+
request.env['REMOTE_USER'] = auth.username
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
data/lib/destinations.rb
ADDED
@@ -0,0 +1,21 @@
|
|
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 'destinations/models/destination'
|
18
|
+
require 'destinations/models/queue'
|
19
|
+
require 'destinations/models/topic'
|
20
|
+
require 'destinations/models/message'
|
21
|
+
require 'destinations/routes'
|
@@ -0,0 +1,80 @@
|
|
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 'json'
|
18
|
+
|
19
|
+
module Backstage
|
20
|
+
class Destination
|
21
|
+
include Enumerable
|
22
|
+
include HasMBean
|
23
|
+
include Resource
|
24
|
+
|
25
|
+
attr_accessor :enumerable_options
|
26
|
+
|
27
|
+
def self.filter
|
28
|
+
"org.hornetq:address=\"#{jms_prefix}\",*,type=Queue"
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.to_hash_attributes
|
32
|
+
super + [:display_name, :app, :app_name, :status, :message_count, :delivering_count, :scheduled_count, :messages_added, :consumer_count]
|
33
|
+
end
|
34
|
+
|
35
|
+
def jms_destination
|
36
|
+
TorqueBox::Messaging::Queue.new( jndi_name, nil, enumerable_options )
|
37
|
+
end
|
38
|
+
|
39
|
+
def each
|
40
|
+
jms_destination.each do |message|
|
41
|
+
message = Message.new( message )
|
42
|
+
message.parent = self
|
43
|
+
yield message
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def display_name
|
48
|
+
self.class.display_name( name )
|
49
|
+
end
|
50
|
+
|
51
|
+
def jndi_name
|
52
|
+
jndi_name = name.gsub( self.class.jms_prefix, '' )
|
53
|
+
jndi_name = "/queue/#{jndi_name}" if %w{ DLQ ExpiryQueue }.include?( jndi_name )
|
54
|
+
jndi_name
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.display_name(name)
|
58
|
+
display_name = name.gsub( /jms\..*?\./, '' )
|
59
|
+
display_name = 'Backgroundable' if display_name =~ %r{/queues/torquebox/.*/backgroundable}
|
60
|
+
display_name = "#{$1.classify}Task" if display_name =~ %r{/queues/torquebox/.*/tasks/(.*)$}
|
61
|
+
display_name
|
62
|
+
end
|
63
|
+
|
64
|
+
def app
|
65
|
+
name =~ %r{/queues/torquebox/(.*?)/} ? App.find( "torquebox.apps:app=#{$1}" ) : nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def app_name
|
69
|
+
name =~ %r{/queues/torquebox/(.*)} ? $1 : 'n/a'
|
70
|
+
end
|
71
|
+
|
72
|
+
def status
|
73
|
+
mbean.paused ? 'Paused' : 'Running'
|
74
|
+
end
|
75
|
+
|
76
|
+
def available_actions
|
77
|
+
status == 'Running' ? %w{ pause } : %w{ resume }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,67 @@
|
|
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 'torquebox/messaging/javax_jms_text_message'
|
18
|
+
|
19
|
+
module Backstage
|
20
|
+
class Message
|
21
|
+
include Resource
|
22
|
+
|
23
|
+
attr_reader :jms_message
|
24
|
+
|
25
|
+
IGNORED_PROPERTIES = %w{ torquebox_encoding JMSXDeliveryCount }
|
26
|
+
def initialize(message)
|
27
|
+
@jms_message = message
|
28
|
+
end
|
29
|
+
|
30
|
+
def content
|
31
|
+
jms_message.decode.inspect
|
32
|
+
rescue Exception => ex
|
33
|
+
# we may not have access to a serialized class. Just show the
|
34
|
+
# Marshal string in that case
|
35
|
+
jms_message.get_string_property( 'torquebox_encoding' ) ? Base64.decode64( jms_message.text ) : jms_message.text
|
36
|
+
end
|
37
|
+
|
38
|
+
def jms_id
|
39
|
+
jms_message.jms_message_id
|
40
|
+
end
|
41
|
+
alias_method :full_name, :jms_id
|
42
|
+
|
43
|
+
def properties
|
44
|
+
@properties ||= jms_message.property_names.inject( {} ) do |properties, name|
|
45
|
+
properties[name] = jms_message.get_string_property( name ) unless IGNORED_PROPERTIES.include?( name )
|
46
|
+
properties
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
JMS_PROPERTIES = %w{ JMS_Correlation_ID JMS_Priority JMS_Type JMS_Reply_To JMS_Redelivered }
|
51
|
+
def jms_properties
|
52
|
+
@jms_properties ||= JMS_PROPERTIES.inject( {} ) do |props,name|
|
53
|
+
value = jms_message.send(name.downcase)
|
54
|
+
props[name.gsub('_',' ')] = value.to_s if value # Ignore empty values
|
55
|
+
props
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def delivery_count
|
60
|
+
jms_message.get_string_property( 'JMSXDeliveryCount' )
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.to_hash_attributes
|
64
|
+
super + [:jms_id, :delivery_count, :properties, :content]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,33 @@
|
|
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
|
+
module Backstage
|
18
|
+
class Queue < Destination
|
19
|
+
|
20
|
+
def self.jms_prefix
|
21
|
+
'jms.queue.'
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.filter
|
25
|
+
'org.hornetq:address="jms.queue.*",*,type=Queue'
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.to_hash_attributes
|
29
|
+
super + [:durable]
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,59 @@
|
|
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
|
+
module Backstage
|
18
|
+
class Topic < Destination
|
19
|
+
attr_accessor :consumer_topic
|
20
|
+
|
21
|
+
def self.jms_prefix
|
22
|
+
'jms.topic.'
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.filter
|
26
|
+
'org.hornetq:address="jms.topic.*",*,name="jms.topic.*",type=Queue'
|
27
|
+
end
|
28
|
+
|
29
|
+
def consumer_topics
|
30
|
+
unless @consumer_topics
|
31
|
+
@consumer_topics = self.class.all( %Q{org.hornetq:address="#{name}",*,type=Queue} )
|
32
|
+
@consumer_topics = @consumer_topics.reject { |t| t.full_name == full_name }
|
33
|
+
@consumer_topics.each { |t| t.consumer_topic = true }
|
34
|
+
end
|
35
|
+
@consumer_topics
|
36
|
+
end
|
37
|
+
|
38
|
+
%w{ message_count delivering_count scheduled_count messages_added }.each do |method|
|
39
|
+
define_method method do
|
40
|
+
if consumer_topic
|
41
|
+
super
|
42
|
+
else
|
43
|
+
consumer_topics.collect(&(method.to_sym)).max || 0
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def consumer_count
|
49
|
+
consumer_topics.size
|
50
|
+
end
|
51
|
+
|
52
|
+
%w{ pause resume }.each do |action|
|
53
|
+
define_method action do
|
54
|
+
super
|
55
|
+
consumer_topics.each { |t| t.__send__( action ) } unless consumer_topic
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,44 @@
|
|
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
|
+
|
18
|
+
module Backstage
|
19
|
+
class Application < Sinatra::Base
|
20
|
+
resource :queue, :topic, :view_path => :destinations, :actions => [:pause, :resume]
|
21
|
+
|
22
|
+
get "/queue/:name/messages" do
|
23
|
+
@destination = Queue.find( Util.decode_name( params[:name] ) )
|
24
|
+
if html_requested?
|
25
|
+
haml :'messages/index'
|
26
|
+
else
|
27
|
+
content_type :json
|
28
|
+
collection_to_json( @destination.entries )
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
get "/queue/:name/message/:id" do
|
33
|
+
@destination = Queue.find( Util.decode_name( params[:name] ) )
|
34
|
+
@object = @destination.find { |m| m.jms_id == Util.decode_name( params[:id] ) }
|
35
|
+
if html_requested?
|
36
|
+
haml :'messages/show'
|
37
|
+
else
|
38
|
+
object_to_json( @object )
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|