trinidad_sandbox_extension 0.4.2 → 1.0.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.
- data/Gemfile +4 -0
- data/Gemfile.lock +56 -0
- data/History.txt +6 -0
- data/README +27 -0
- data/git-hooks/post-commit +7 -0
- data/lib/trinidad_sandbox_extension.rb +24 -3
- data/lib/trinidad_sandbox_extension/app/helpers/{sandbox.rb → auth.rb} +20 -19
- data/lib/trinidad_sandbox_extension/app/helpers/context.rb +72 -0
- data/lib/trinidad_sandbox_extension/app/helpers/deploy.rb +106 -0
- data/lib/trinidad_sandbox_extension/app/helpers/view.rb +39 -0
- data/lib/trinidad_sandbox_extension/app/model/application_context.rb +48 -4
- data/lib/trinidad_sandbox_extension/app/public/css/sandbox.css +187 -0
- data/lib/trinidad_sandbox_extension/app/sandbox.rb +56 -39
- data/lib/trinidad_sandbox_extension/app/views/actions.html.haml +2 -2
- data/lib/trinidad_sandbox_extension/app/views/applications.html.haml +17 -0
- data/lib/trinidad_sandbox_extension/app/views/applications.xml.haml +13 -0
- data/lib/trinidad_sandbox_extension/app/views/deploy.html.haml +16 -0
- data/lib/trinidad_sandbox_extension/app/views/layout.html.haml +10 -6
- data/lib/trinidad_sandbox_extension/app/views/navigation.html.haml +10 -0
- data/spec/trinidad_sandbox_extension_spec.rb +12 -2
- data/trinidad-libs/trinidad-sandbox-extension.jar +0 -0
- data/trinidad_sandbox_extension.gemspec +16 -9
- metadata +52 -41
- data/lib/trinidad_sandbox_extension/app/public/css/main.css +0 -137
- data/lib/trinidad_sandbox_extension/app/views/app.html.haml +0 -8
- data/lib/trinidad_sandbox_extension/app/views/app.xml.haml +0 -11
- data/lib/trinidad_sandbox_extension/app/views/index.html.haml +0 -6
- data/lib/trinidad_sandbox_extension/app/views/index.xml.haml +0 -3
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'delegate'
|
2
2
|
require 'cgi'
|
3
|
+
require 'trinidad'
|
3
4
|
|
4
|
-
require File.expand_path('../../helpers/
|
5
|
+
require File.expand_path('../../helpers/context', __FILE__)
|
5
6
|
|
6
7
|
module Trinidad
|
7
8
|
module Sandbox
|
@@ -10,9 +11,12 @@ module Trinidad
|
|
10
11
|
|
11
12
|
def self.all
|
12
13
|
apps = host ? host.find_children : []
|
13
|
-
apps.select {|app| app.name != sandbox_context.name }.
|
14
|
+
a = apps.select {|app| app.name != sandbox_context.name }.
|
14
15
|
map {|app| ApplicationContext.new(app) }.
|
15
16
|
sort {|app1, app2| app1.slug <=> app2.slug }
|
17
|
+
|
18
|
+
a = a.select {|app| app.name != 'default'} unless enable_default?
|
19
|
+
a
|
16
20
|
end
|
17
21
|
|
18
22
|
def self.find(name)
|
@@ -25,6 +29,39 @@ module Trinidad
|
|
25
29
|
ApplicationContext.new(context) if context
|
26
30
|
end
|
27
31
|
|
32
|
+
def self.find_by_doc_base(base)
|
33
|
+
if (apps = host.find_children)
|
34
|
+
apps.select {|app| app.doc_base == File.basename(base)}.first
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.create(url, path)
|
39
|
+
web_app = Trinidad::WebApp.create({
|
40
|
+
:jruby_min_runtimes => 1,
|
41
|
+
:jruby_max_runtimes => 1
|
42
|
+
}, {
|
43
|
+
:context_path => (url == 'default' ? '' : "/#{url}"),
|
44
|
+
:web_app_dir => File.basename(path),
|
45
|
+
:environment => 'production'
|
46
|
+
})
|
47
|
+
|
48
|
+
context = Trinidad::Tomcat::StandardContext.new
|
49
|
+
context.path = web_app.context_path
|
50
|
+
context.doc_base = web_app.web_app_dir
|
51
|
+
|
52
|
+
context.add_lifecycle_listener Trinidad::Tomcat::Tomcat::DefaultWebXmlListener.new
|
53
|
+
|
54
|
+
config = Trinidad::Tomcat::ContextConfig.new
|
55
|
+
config.default_web_xml = 'org/apache/catalin/startup/NO_DEFAULT_XML'
|
56
|
+
context.add_lifecycle_listener config
|
57
|
+
|
58
|
+
context.add_lifecycle_listener Trinidad::Lifecycle::Default.new(web_app)
|
59
|
+
|
60
|
+
host.add_child context
|
61
|
+
|
62
|
+
ApplicationContext.new(context)
|
63
|
+
end
|
64
|
+
|
28
65
|
def initialize(context)
|
29
66
|
super(context)
|
30
67
|
end
|
@@ -49,12 +86,19 @@ module Trinidad
|
|
49
86
|
[
|
50
87
|
{:rel => 'start', :href => "#{self_path}/start"},
|
51
88
|
{:rel => 'stop', :href => "#{self_path}/stop"},
|
52
|
-
{:rel => '
|
89
|
+
{:rel => 'restart', :href => "#{self_path}/restart"}
|
53
90
|
]
|
54
91
|
end
|
55
92
|
|
56
93
|
def parameters
|
57
|
-
@parameters ||=
|
94
|
+
@parameters ||= begin
|
95
|
+
parameters = {}
|
96
|
+
find_parameters.each do |param|
|
97
|
+
value = find_parameter(param)
|
98
|
+
parameters[param] = value if !value.nil? && !value.empty?
|
99
|
+
end
|
100
|
+
parameters
|
101
|
+
end
|
58
102
|
end
|
59
103
|
end
|
60
104
|
end
|
@@ -0,0 +1,187 @@
|
|
1
|
+
ul {
|
2
|
+
padding: 0px;
|
3
|
+
}
|
4
|
+
|
5
|
+
li {
|
6
|
+
list-style: none;
|
7
|
+
margin: 0px;
|
8
|
+
padding: 0px;
|
9
|
+
display: list-item;
|
10
|
+
}
|
11
|
+
|
12
|
+
/* End: Reset */
|
13
|
+
|
14
|
+
body {
|
15
|
+
font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif;
|
16
|
+
font-size:10.5pt;
|
17
|
+
margin: 0;
|
18
|
+
}
|
19
|
+
|
20
|
+
h1 {
|
21
|
+
color: #383838;
|
22
|
+
}
|
23
|
+
|
24
|
+
a {
|
25
|
+
color: silver;
|
26
|
+
font-weight: bold;
|
27
|
+
text-decoration: none;
|
28
|
+
}
|
29
|
+
|
30
|
+
a:hover {
|
31
|
+
color: #383838;
|
32
|
+
}
|
33
|
+
|
34
|
+
p {
|
35
|
+
color: #383838;
|
36
|
+
font-size: 1.5em;
|
37
|
+
padding-left: .5em;
|
38
|
+
}
|
39
|
+
|
40
|
+
.site {
|
41
|
+
width: 50em;
|
42
|
+
margin: 0 auto;
|
43
|
+
padding: 2em 5em;
|
44
|
+
}
|
45
|
+
|
46
|
+
nav {
|
47
|
+
position: relative;
|
48
|
+
}
|
49
|
+
|
50
|
+
nav h1 {
|
51
|
+
font-size: 4em;
|
52
|
+
}
|
53
|
+
|
54
|
+
#nav {
|
55
|
+
position: absolute;
|
56
|
+
text-align: right;
|
57
|
+
right: 0em;
|
58
|
+
top: 2.8em;
|
59
|
+
}
|
60
|
+
|
61
|
+
#nav a {
|
62
|
+
padding-left: .8em;
|
63
|
+
}
|
64
|
+
|
65
|
+
span.nav {
|
66
|
+
color: #383838;
|
67
|
+
font-weight: bold;
|
68
|
+
padding-left: .8em;
|
69
|
+
}
|
70
|
+
|
71
|
+
|
72
|
+
.container {
|
73
|
+
border: 1px solid silver;
|
74
|
+
background: #EEE;
|
75
|
+
padding: .3em;
|
76
|
+
}
|
77
|
+
|
78
|
+
#applications li {
|
79
|
+
position: relative;
|
80
|
+
}
|
81
|
+
|
82
|
+
.application {
|
83
|
+
padding: 0em 1em;
|
84
|
+
}
|
85
|
+
|
86
|
+
.actions {
|
87
|
+
position: absolute;
|
88
|
+
top: 1.3em;
|
89
|
+
right: 2em;
|
90
|
+
text-align: right;
|
91
|
+
}
|
92
|
+
|
93
|
+
.actions form {
|
94
|
+
display: inline;
|
95
|
+
}
|
96
|
+
|
97
|
+
.app {
|
98
|
+
margin-bottom: 1em;
|
99
|
+
padding: 1em;
|
100
|
+
}
|
101
|
+
|
102
|
+
.header {
|
103
|
+
color: #383838;
|
104
|
+
font-size: 1.5em;
|
105
|
+
}
|
106
|
+
|
107
|
+
|
108
|
+
.started {
|
109
|
+
border: 1px solid #32cd32;
|
110
|
+
background: #D0EDC7;
|
111
|
+
}
|
112
|
+
|
113
|
+
.stopped {
|
114
|
+
border: 1px solid #b22222;
|
115
|
+
background: #E6BCB5;
|
116
|
+
}
|
117
|
+
|
118
|
+
.detail {
|
119
|
+
border: 1px solid #383838;
|
120
|
+
margin-top: .6em;
|
121
|
+
background: #silver;
|
122
|
+
color: #383838;
|
123
|
+
}
|
124
|
+
|
125
|
+
.detail ul {
|
126
|
+
margin: .5em;
|
127
|
+
}
|
128
|
+
|
129
|
+
.detail ul li {
|
130
|
+
line-height: 1.2em;
|
131
|
+
margin: .3em;
|
132
|
+
}
|
133
|
+
|
134
|
+
.detail ul li.reset {
|
135
|
+
margin-top: -4.3em;
|
136
|
+
}
|
137
|
+
|
138
|
+
|
139
|
+
.detail ul li.column1 {
|
140
|
+
margin-left: .3em;
|
141
|
+
}
|
142
|
+
|
143
|
+
.detail ul li.column2 {
|
144
|
+
margin-left: 22em;
|
145
|
+
}
|
146
|
+
|
147
|
+
#git-hook {
|
148
|
+
margin-top: 1em;
|
149
|
+
border: 1px solid #FF9900;
|
150
|
+
background: #FFFF99;
|
151
|
+
}
|
152
|
+
|
153
|
+
#git-hook p {
|
154
|
+
padding-left: 2em;
|
155
|
+
font-size: .8em;
|
156
|
+
}
|
157
|
+
|
158
|
+
#git-hook p span {
|
159
|
+
font-weight: bold;
|
160
|
+
font-style: italic;
|
161
|
+
}
|
162
|
+
|
163
|
+
form div {
|
164
|
+
padding: .5em 1em;
|
165
|
+
}
|
166
|
+
|
167
|
+
label {
|
168
|
+
color: #383838;
|
169
|
+
display:block;
|
170
|
+
font-size: 1.5em;
|
171
|
+
}
|
172
|
+
|
173
|
+
input {
|
174
|
+
background: silver;
|
175
|
+
font-size: 2.5em;
|
176
|
+
padding: .5em;
|
177
|
+
border: 1px solid grey;
|
178
|
+
color: #383838;
|
179
|
+
}
|
180
|
+
|
181
|
+
#flash {
|
182
|
+
border: 1px solid #b22222;
|
183
|
+
background: #E6BCB5;
|
184
|
+
color: #383838;
|
185
|
+
padding: 1em 1.5em;
|
186
|
+
margin-bottom: 1em;
|
187
|
+
}
|
@@ -1,70 +1,68 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'sinatra'
|
3
3
|
require 'haml'
|
4
|
-
require File.expand_path('../helpers/
|
4
|
+
require File.expand_path('../helpers/auth', __FILE__)
|
5
|
+
require File.expand_path('../helpers/context', __FILE__)
|
6
|
+
require File.expand_path('../helpers/deploy', __FILE__)
|
7
|
+
require File.expand_path('../helpers/view', __FILE__)
|
5
8
|
require File.expand_path('../model/application_context', __FILE__)
|
6
9
|
require 'sinatra/respond_to'
|
7
10
|
require 'sinatra/flash'
|
8
11
|
|
12
|
+
include Trinidad::Sandbox
|
13
|
+
|
9
14
|
enable :sessions
|
10
15
|
|
11
16
|
set :views, File.expand_path('../views', __FILE__)
|
12
17
|
|
13
18
|
Sinatra::Application.register Sinatra::RespondTo
|
14
19
|
|
15
|
-
helpers
|
16
|
-
include
|
17
|
-
include
|
18
|
-
|
19
|
-
|
20
|
+
helpers do
|
21
|
+
include Helpers::Auth
|
22
|
+
include Helpers::Context
|
23
|
+
include Helpers::Deploy
|
24
|
+
include Helpers::View
|
25
|
+
end
|
26
|
+
|
27
|
+
before do
|
28
|
+
login_required if !readonly? && basic_auth_required?(request)
|
29
|
+
|
30
|
+
render_readonly if readonly? &&
|
31
|
+
(!request.get? || request.path =~ /deploy$/)
|
32
|
+
end
|
20
33
|
|
21
34
|
get '/' do
|
22
35
|
redirect sandbox_context.path + '/apps'
|
23
36
|
end
|
24
37
|
|
25
38
|
get '/apps' do
|
26
|
-
@applications =
|
27
|
-
|
28
|
-
respond_to do |wants|
|
29
|
-
wants.html { haml :index }
|
30
|
-
wants.xml { haml :index }
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
get '/apps/:name' do
|
35
|
-
@app = Trinidad::Sandbox::ApplicationContext.find(params[:name])
|
36
|
-
context_not_found(params[:name]) unless @app
|
39
|
+
@applications = ApplicationContext.all
|
40
|
+
@page_id = 'applications'
|
37
41
|
|
38
42
|
respond_to do |wants|
|
39
|
-
wants.html
|
40
|
-
wants.xml
|
43
|
+
wants.html { haml :applications }
|
44
|
+
wants.xml { haml :applications }
|
41
45
|
end
|
42
46
|
end
|
43
47
|
|
44
48
|
post '/apps/:name/stop' do
|
45
|
-
context =
|
49
|
+
context = ApplicationContext.find(params[:name])
|
46
50
|
|
47
51
|
context_not_found(params[:name]) unless context
|
48
52
|
|
49
|
-
|
50
|
-
$servet_context.log "can't stop the
|
51
|
-
|
52
|
-
wants.html { redirect sandbox_context.path }
|
53
|
-
wants.xml { status 500 }
|
54
|
-
end
|
53
|
+
unless available_context?(context)
|
54
|
+
$servet_context.log "can't stop the application"
|
55
|
+
redirect_to_home 500
|
55
56
|
end
|
56
57
|
|
57
58
|
context.stop
|
58
59
|
$servlet_context.log "#{context.name} stopped"
|
59
60
|
|
60
|
-
|
61
|
-
wants.html { redirect sandbox_context.path }
|
62
|
-
wants.xml { status 204 }
|
63
|
-
end
|
61
|
+
redirect_to_home 204
|
64
62
|
end
|
65
63
|
|
66
64
|
post '/apps/:name/start' do
|
67
|
-
context =
|
65
|
+
context = ApplicationContext.find(params[:name])
|
68
66
|
|
69
67
|
context_not_found(params[:name]) unless context
|
70
68
|
|
@@ -75,21 +73,40 @@ post '/apps/:name/start' do
|
|
75
73
|
$servlet_context.log "#{context.name} start failed"
|
76
74
|
end
|
77
75
|
|
78
|
-
|
79
|
-
wants.html { redirect sandbox_context.path }
|
80
|
-
wants.xml { status 204 }
|
81
|
-
end
|
76
|
+
redirect_to_home 204
|
82
77
|
end
|
83
78
|
|
84
|
-
post '/apps/:name/
|
85
|
-
context =
|
79
|
+
post '/apps/:name/restart' do
|
80
|
+
context = ApplicationContext.find(params[:name])
|
86
81
|
|
87
82
|
context_not_found(params[:name]) unless context
|
88
83
|
|
84
|
+
unless available_context?(context)
|
85
|
+
$servet_context.log "can't restart the application"
|
86
|
+
redirect_to_home 500
|
87
|
+
end
|
88
|
+
|
89
89
|
context.reload
|
90
90
|
|
91
|
+
redirect_to_home 204
|
92
|
+
end
|
93
|
+
|
94
|
+
get '/deploy' do
|
95
|
+
@page_id = 'deploy'
|
96
|
+
|
91
97
|
respond_to do |wants|
|
92
|
-
wants.html {
|
93
|
-
|
98
|
+
wants.html { haml :deploy }
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
post '/deploy' do
|
103
|
+
token_required(params)
|
104
|
+
|
105
|
+
if params['payload']
|
106
|
+
deploy_from_web_hook(params)
|
107
|
+
elsif params['repo']
|
108
|
+
deploy_from_form(params)
|
109
|
+
else
|
110
|
+
redirect_to_home 204
|
94
111
|
end
|
95
112
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
.actions
|
2
2
|
- if app.available
|
3
|
+
%form(method="post" action="#{app.self_path}/restart")
|
4
|
+
%button(type="submit") Restart
|
3
5
|
%form(method="post" action="#{app.self_path}/stop")
|
4
6
|
%button(type="submit") Stop
|
5
|
-
%form(method="post" action="#{app.self_path}/redeploy")
|
6
|
-
%button(type="submit") Redeploy
|
7
7
|
- else
|
8
8
|
%form(method="post" action="#{app.self_path}/start")
|
9
9
|
%button(type="submit") Start
|
@@ -0,0 +1,17 @@
|
|
1
|
+
%div(id="applications" class="container")
|
2
|
+
- unless @applications.empty?
|
3
|
+
%ul
|
4
|
+
- @applications.each do |app|
|
5
|
+
%li(class="application")
|
6
|
+
%div(class="app #{app.state.to_s.downcase}")
|
7
|
+
%a(class="header" href="#{app.path}")= app.name
|
8
|
+
- unless readonly?
|
9
|
+
= haml :actions, :locals => {:app => app}, :layout => false
|
10
|
+
- unless app.parameters.empty?
|
11
|
+
.detail
|
12
|
+
%ul(class="parameters")
|
13
|
+
= render_parameters(app.parameters)
|
14
|
+
- else
|
15
|
+
%p It seems there're not applications running on Trinidad.
|
16
|
+
- unless readonly?
|
17
|
+
%p You can use Git to #{link_to_deploy} them without stopping the server.
|