scalarium_cli 0.0.1
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/.gitignore +4 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +41 -0
- data/README.md +78 -0
- data/Rakefile +9 -0
- data/bin/sca +8 -0
- data/lib/scalarium/application.rb +36 -0
- data/lib/scalarium/cli.rb +30 -0
- data/lib/scalarium/version.rb +3 -0
- data/lib/scalarium.rb +10 -0
- data/scalarium.gemspec +27 -0
- data/spec/fixtures/new_deploy.html +291 -0
- data/spec/fixtures/session_new.html +149 -0
- data/spec/scalarium/application_spec.rb +75 -0
- data/spec/spec_helper.rb +18 -0
- metadata +149 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
scalarium_cli (0.0.1)
|
5
|
+
mechanize (~> 1.0.0)
|
6
|
+
thor (~> 0.14.6)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
addressable (2.2.2)
|
12
|
+
crack (0.1.8)
|
13
|
+
diff-lcs (1.1.2)
|
14
|
+
mechanize (1.0.0)
|
15
|
+
nokogiri (>= 1.2.1)
|
16
|
+
nokogiri (1.4.4)
|
17
|
+
rspec (2.3.0)
|
18
|
+
rspec-core (~> 2.3.0)
|
19
|
+
rspec-expectations (~> 2.3.0)
|
20
|
+
rspec-mocks (~> 2.3.0)
|
21
|
+
rspec-core (2.3.1)
|
22
|
+
rspec-expectations (2.3.0)
|
23
|
+
diff-lcs (~> 1.1.2)
|
24
|
+
rspec-mocks (2.3.0)
|
25
|
+
thor (0.14.6)
|
26
|
+
webmock (1.6.1)
|
27
|
+
addressable (>= 2.2.2)
|
28
|
+
crack (>= 0.1.7)
|
29
|
+
|
30
|
+
PLATFORMS
|
31
|
+
ruby
|
32
|
+
|
33
|
+
DEPENDENCIES
|
34
|
+
mechanize (~> 1.0.0)
|
35
|
+
rspec (~> 2.3.0)
|
36
|
+
scalarium_cli!
|
37
|
+
thor (~> 0.14.6)
|
38
|
+
webmock (~> 1.6.1)
|
39
|
+
|
40
|
+
METADATA
|
41
|
+
version: 1.0.6
|
data/README.md
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# Gem Name
|
2
|
+
|
3
|
+
Allows you to deploy apps hosted on Scalarium from the command line.
|
4
|
+
|
5
|
+
## How To Install
|
6
|
+
|
7
|
+
sudo gem install scalarium_cli
|
8
|
+
|
9
|
+
## Example
|
10
|
+
|
11
|
+
### Rails
|
12
|
+
|
13
|
+
Add `scalarium.yml` in your config folder. It should look something like:
|
14
|
+
|
15
|
+
staging:
|
16
|
+
email: test@test.com
|
17
|
+
password: password
|
18
|
+
slug: YYY
|
19
|
+
|
20
|
+
production:
|
21
|
+
email: test@test.com
|
22
|
+
password: password
|
23
|
+
slug: XXX
|
24
|
+
|
25
|
+
You will find the slug of the application inside the URL:
|
26
|
+
|
27
|
+

|
28
|
+
|
29
|
+
Then from the Root directory, just run
|
30
|
+
|
31
|
+
sca deploy staging
|
32
|
+
|
33
|
+
Or to run migrations
|
34
|
+
|
35
|
+
sca deploy staging --migrate
|
36
|
+
|
37
|
+
### Non Rails
|
38
|
+
|
39
|
+
By default the CLI will look at `./config/scalarium.yml` for the config.
|
40
|
+
|
41
|
+
If you wish to specify a different config file just type:
|
42
|
+
|
43
|
+
sca deploy staging --config="path/to/config.yml"
|
44
|
+
|
45
|
+
## Note on Patches/Pull Requests
|
46
|
+
|
47
|
+
* Fork the project.
|
48
|
+
* Create a feature branch
|
49
|
+
* Make your feature addition or bug fix.
|
50
|
+
* Add tests.
|
51
|
+
* Commit, do not mess with RakeFile, version, or history.
|
52
|
+
* Send me a pull request.
|
53
|
+
|
54
|
+
## Copyright
|
55
|
+
|
56
|
+
Copyright (c) 2010 Red Davis.
|
57
|
+
|
58
|
+
## License
|
59
|
+
|
60
|
+
The MIT License
|
61
|
+
|
62
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
63
|
+
of this software and associated documentation files (the "Software"), to deal
|
64
|
+
in the Software without restriction, including without limitation the rights
|
65
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
66
|
+
copies of the Software, and to permit persons to whom the Software is
|
67
|
+
furnished to do so, subject to the following conditions:
|
68
|
+
|
69
|
+
The above copyright notice and this permission notice shall be included in
|
70
|
+
all copies or substantial portions of the Software.
|
71
|
+
|
72
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
73
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
74
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
75
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
76
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
77
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
78
|
+
THE SOFTWARE.
|
data/Rakefile
ADDED
data/bin/sca
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module Scalarium
|
2
|
+
class Application
|
3
|
+
attr_accessor :email, :password, :slug, :run_migrations
|
4
|
+
|
5
|
+
def deploy
|
6
|
+
login do
|
7
|
+
agent.get("https://manage.scalarium.com/applications/#{slug}/deployments/new") do |page|
|
8
|
+
form = page.forms.first
|
9
|
+
form["deployment[migrate]"] = 1 if run_migrations
|
10
|
+
form.click_button
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def config
|
16
|
+
yield(self)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def login
|
22
|
+
agent.get("https://manage.scalarium.com/session/new") do |page|
|
23
|
+
manage_page = page.form_with(:action => "/session") do |f|
|
24
|
+
f["user[email]"] = email
|
25
|
+
f["user[password]"] = password
|
26
|
+
end.click_button
|
27
|
+
|
28
|
+
yield
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def agent
|
33
|
+
@agent ||= Mechanize.new
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "thor"
|
2
|
+
|
3
|
+
module Scalarium
|
4
|
+
class CLI < Thor
|
5
|
+
desc "deploy [staging|production]", "deploy to specified env"
|
6
|
+
method_options :migrate => :boolean, :config => :string
|
7
|
+
def deploy(env="production")
|
8
|
+
application = Scalarium::Application.new
|
9
|
+
|
10
|
+
application.config do |x|
|
11
|
+
x.email = config[env]["email"]
|
12
|
+
x.password = config[env]["password"]
|
13
|
+
x.slug = config[env]["slug"]
|
14
|
+
x.run_migrations = options.migrate?
|
15
|
+
end
|
16
|
+
|
17
|
+
application.deploy
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def config
|
23
|
+
@config ||= begin
|
24
|
+
config_path = options[:config] || "config/scalarium.yml"
|
25
|
+
|
26
|
+
YAML.load_file(config_path)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/scalarium.rb
ADDED
data/scalarium.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "scalarium/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "scalarium_cli"
|
7
|
+
s.version = Scalarium::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Red Davis"]
|
10
|
+
s.email = ["red@railslove.com"]
|
11
|
+
s.homepage = "https://github.com/railslove/Scalarium-CLI"
|
12
|
+
s.summary = %q{Allows you to deploy apps hosted on Scalarium from the command line}
|
13
|
+
s.description = %q{Allows you to deploy apps hosted on Scalarium from the command line}
|
14
|
+
|
15
|
+
s.rubyforge_project = "scalarium_cli"
|
16
|
+
|
17
|
+
s.add_dependency "mechanize", "~> 1.0.0"
|
18
|
+
s.add_dependency "thor", "~> 0.14.6"
|
19
|
+
|
20
|
+
s.add_development_dependency "rspec", "~> 2.3.0"
|
21
|
+
s.add_development_dependency "webmock", "~> 1.6.1"
|
22
|
+
|
23
|
+
s.files = `git ls-files`.split("\n")
|
24
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
25
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
26
|
+
s.require_paths = ["lib"]
|
27
|
+
end
|
@@ -0,0 +1,291 @@
|
|
1
|
+
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
3
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
4
|
+
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
6
|
+
<head>
|
7
|
+
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
|
8
|
+
<link rel="icon" href="/images/favicon.png" type="image/png" />
|
9
|
+
<title> New Deployment for Application railslove
|
10
|
+
</title>
|
11
|
+
<link href="/stylesheets/layout.css?1292617034" media="screen" rel="stylesheet" type="text/css" />
|
12
|
+
<link href="/stylesheets/facebox.css?1292617034" media="screen" rel="stylesheet" type="text/css" />
|
13
|
+
<script src="/javascripts/jquery/jquery.min.js?1292617034" type="text/javascript"></script>
|
14
|
+
<script src="/javascripts/jquery/jquery-ui-1.7.2.custom.min.js?1292617034" type="text/javascript"></script>
|
15
|
+
<script src="/javascripts/jquery/jquery.bgiframe.min.js?1292617034" type="text/javascript"></script>
|
16
|
+
<script src="/javascripts/superfish/superfish.js?1292617034" type="text/javascript"></script>
|
17
|
+
<script src="/javascripts/superfish/supersubs.js?1292617034" type="text/javascript"></script>
|
18
|
+
<script src="/javascripts/application.js?1292617034" type="text/javascript"></script>
|
19
|
+
<script src="/javascripts/jquery/jquery.tipTip-mod.js?1292617034" type="text/javascript"></script>
|
20
|
+
<script src="/javascripts/jquery/jquery.easing.1.3.js?1292617034" type="text/javascript"></script>
|
21
|
+
<script src="/javascripts/jquery/jquery.sparkline.js?1292617034" type="text/javascript"></script>
|
22
|
+
<script src="/javascripts/jquery/jquery.color.js?1292617034" type="text/javascript"></script>
|
23
|
+
<script src="/javascripts/jquery/jquery.flot_patch.js?1292617034" type="text/javascript"></script>
|
24
|
+
<script src="/javascripts/jquery/jquery.flot.selection.min.js?1292617034" type="text/javascript"></script>
|
25
|
+
<script src="/javascripts/jquery/jquery.flot.stack.min.js?1292617034" type="text/javascript"></script>
|
26
|
+
|
27
|
+
<script type="text/javascript">
|
28
|
+
$(document).ready(function(){
|
29
|
+
Scalarium.initMenus();
|
30
|
+
|
31
|
+
$("ul.sf-menu .sf-right a").live("click", function(){
|
32
|
+
$(this).parents("ul.sf-menu").hideSuperfishUl();
|
33
|
+
});
|
34
|
+
|
35
|
+
});
|
36
|
+
|
37
|
+
var $scalarium = {
|
38
|
+
instanceRefreshInterval: 10000,
|
39
|
+
logLoadingTimeout: 15000,
|
40
|
+
debug: false
|
41
|
+
};
|
42
|
+
</script>
|
43
|
+
|
44
|
+
<script type="text/javascript">
|
45
|
+
var host = document.location.host;
|
46
|
+
if (host == 'manage.scalarium.com') {
|
47
|
+
var _gaq = _gaq || [];
|
48
|
+
_gaq.push(['_setAccount', 'UA-6003901-5']);
|
49
|
+
_gaq.push(['_setDomainName', host]);
|
50
|
+
_gaq.push(['_trackPageview']);
|
51
|
+
|
52
|
+
(function() {
|
53
|
+
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
54
|
+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
55
|
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
56
|
+
})();
|
57
|
+
}
|
58
|
+
</script>
|
59
|
+
</head>
|
60
|
+
|
61
|
+
<body>
|
62
|
+
|
63
|
+
<div id="page">
|
64
|
+
<div id="center">
|
65
|
+
<a href="/" style="height:80px; width:120px; display:block; position:absolute; outline: none;" title="Home"></a>
|
66
|
+
<div id="header">
|
67
|
+
<ul class="horizontal-menu">
|
68
|
+
<li>
|
69
|
+
<a href="/users/7fe7e51f77da9bce74e9f5adaa9f21c0/login_settings">Settings</a>
|
70
|
+
</li>
|
71
|
+
<li><a href="#" id="feedback">Support</a></li>
|
72
|
+
<li><a href="http://support.scalarium.com/faqs" target="_blank">FAQ</a></li>
|
73
|
+
<li><a href="/logout">Logout (Red Davis)</a></li>
|
74
|
+
</ul>
|
75
|
+
</div>
|
76
|
+
|
77
|
+
<div id="nav">
|
78
|
+
<ul class="sf-menu">
|
79
|
+
<li>
|
80
|
+
<a href="/clouds" class="">Clouds</a>
|
81
|
+
<ul>
|
82
|
+
</ul>
|
83
|
+
</li>
|
84
|
+
<li>
|
85
|
+
<a href="/applications" class="active">Applications</a>
|
86
|
+
<ul>
|
87
|
+
|
88
|
+
</ul>
|
89
|
+
</li>
|
90
|
+
<li><a href="/events" class="">Events</a></li>
|
91
|
+
<li><a href="http://www.scalarium.com/blog" target="_blank">Blog</a></li>
|
92
|
+
</ul>
|
93
|
+
<span style="float: right">
|
94
|
+
<a href="/"><img alt="Zeppelin" height="75" id="zeppelin" longdesc="/images/zeppelin.png" src="/images/zeppelin.png?1292617034" width="150" /></a>
|
95
|
+
</span>
|
96
|
+
</div>
|
97
|
+
|
98
|
+
<div id="content">
|
99
|
+
|
100
|
+
|
101
|
+
<div class="row">
|
102
|
+
<div class="snd-nav">
|
103
|
+
<h2 class="grey"><a href="/clouds/asd">Railslove</a>: </h2>
|
104
|
+
<h2 class="grey"><a href="/applications/railslove">railslove</a>: </h2>
|
105
|
+
<h2>New Deployment</h2>
|
106
|
+
</div>
|
107
|
+
<div class="column width_12 no-padding">
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
<div class="flashnotice" style="display:none" id="notice_if_no_instances_selected">
|
112
|
+
Please select at least one instance to deploy to.
|
113
|
+
</div>
|
114
|
+
</div>
|
115
|
+
|
116
|
+
<form action="/applications/railslove/deployments" class="new_deployment" id="new_deployment" method="post"><div style="margin:0;padding:0;display:inline"><input name="authenticity_token" type="hidden" value="KhQg/0sbvK2LsGV1cvIjeEOB+TxFsRGsIa6naLrJ5z8=" /></div> <input id="deployment_instances_to_deploy_for_html" name="deployment[instances_to_deploy_for_html]" type="hidden" value="asd" />
|
117
|
+
<input id="deployment_instances_to_skip_for_html" name="deployment[instances_to_skip_for_html]" type="hidden" value="" />
|
118
|
+
<div class="column width_6">
|
119
|
+
<div class="table2">
|
120
|
+
<table>
|
121
|
+
<colgroup>
|
122
|
+
<col width="155"/>
|
123
|
+
<col width="309"/>
|
124
|
+
</colgroup>
|
125
|
+
<thead>
|
126
|
+
<tr>
|
127
|
+
<th colspan="2">Options</th>
|
128
|
+
</tr>
|
129
|
+
</thead>
|
130
|
+
<tbody>
|
131
|
+
<tr>
|
132
|
+
<td style="border-bottom:#FFF;">
|
133
|
+
<label for="deployment_command">Command</label>
|
134
|
+
</td>
|
135
|
+
<td style="border-bottom:#FFF;">
|
136
|
+
<select id="deployment_command" name="deployment[command]"><option value="deploy">deploy</option>
|
137
|
+
<option value="rollback">rollback</option>
|
138
|
+
<option value="start">start</option>
|
139
|
+
<option value="stop">stop</option>
|
140
|
+
<option value="restart">restart</option>
|
141
|
+
<option value="undeploy">undeploy</option></select>
|
142
|
+
</td>
|
143
|
+
</tr>
|
144
|
+
<tr>
|
145
|
+
<td></td>
|
146
|
+
<td id="deploy_command_helper" class="helper"></td>
|
147
|
+
</tr>
|
148
|
+
<tr>
|
149
|
+
<td>
|
150
|
+
<label for="deployment_comment">Comment</label>
|
151
|
+
</td>
|
152
|
+
<td>
|
153
|
+
<textarea cols="40" id="deployment_comment" name="deployment[comment]" rows="5"></textarea>
|
154
|
+
</td>
|
155
|
+
</tr>
|
156
|
+
<tr>
|
157
|
+
<td>
|
158
|
+
<label for="deployment_migrate">Migrate Database</label>
|
159
|
+
</td>
|
160
|
+
<td>
|
161
|
+
<input name="deployment[migrate]" type="hidden" value="0" /><input id="deployment_migrate" name="deployment[migrate]" type="checkbox" value="1" />
|
162
|
+
</td>
|
163
|
+
</tr>
|
164
|
+
<tr>
|
165
|
+
<td>
|
166
|
+
<label for="deployment_shift_between_restarts">Shift between restarts</label>
|
167
|
+
</td>
|
168
|
+
<td>
|
169
|
+
<input class="align-right inline" id="deployment_shift_between_restarts" name="deployment[shift_between_restarts]" size="30" style="width: 24px;" type="text" value="0" /> seconds
|
170
|
+
</td>
|
171
|
+
</tr>
|
172
|
+
</tbody>
|
173
|
+
</table>
|
174
|
+
</div>
|
175
|
+
</div>
|
176
|
+
|
177
|
+
<div class="column width_6">
|
178
|
+
<div class="table2" id="choose_instances_to_deploy">
|
179
|
+
<table>
|
180
|
+
<colgroup>
|
181
|
+
<col width="155"/>
|
182
|
+
<col width="309"/>
|
183
|
+
</colgroup>
|
184
|
+
<thead>
|
185
|
+
<tr>
|
186
|
+
<th>Roles</th>
|
187
|
+
<th>Instances</th>
|
188
|
+
</tr>
|
189
|
+
</thead>
|
190
|
+
<tbody>
|
191
|
+
<tr>
|
192
|
+
|
193
|
+
<span class="status_preview deploy_switch_instance green_status" data-instance-id="Railslove" title="webtwo - Large - online"></span>
|
194
|
+
</td>
|
195
|
+
</tr>
|
196
|
+
<tr>
|
197
|
+
<td style="border-bottom: none;"></td>
|
198
|
+
<td style="border-bottom: none;" class="helper">
|
199
|
+
You can exclude individual instances and entire roles from a deployment simply by (de-)selecting them.
|
200
|
+
</td>
|
201
|
+
</tr>
|
202
|
+
</tbody>
|
203
|
+
</table>
|
204
|
+
</div>
|
205
|
+
</div>
|
206
|
+
<hr/>
|
207
|
+
<input name="commit" type="submit" value="Run" />
|
208
|
+
<input class="link_button greybutton" type="submit" value="Cancel" name="Cancel" data-target="/applications/railslove" />
|
209
|
+
<noscript><a href="/applications/railslove">Cancel</a></noscript>
|
210
|
+
|
211
|
+
</form></div>
|
212
|
+
|
213
|
+
|
214
|
+
<script src="/javascripts/deployments.js?1292617034" type="text/javascript"></script>
|
215
|
+
<script type="text/javascript">
|
216
|
+
$('.deploy_switch_instance').live('click', function(event) {
|
217
|
+
event.preventDefault();
|
218
|
+
var instanceId = $(this).attr("data-instance-id");
|
219
|
+
ScalariumDeployment.switchInstances(instanceId);
|
220
|
+
ScalariumDeployment.countInstances();
|
221
|
+
});
|
222
|
+
|
223
|
+
$('.deploy_switch_role').live('click', function(event) {
|
224
|
+
event.preventDefault();
|
225
|
+
var role = $(this);
|
226
|
+
var roleInstances = $(role.next()).children('.deploy_switch_instance');
|
227
|
+
var firstInstance = roleInstances[0]
|
228
|
+
|
229
|
+
if ( firstInstance ){
|
230
|
+
if ( ScalariumDeployment.switchedOn(firstInstance) ) {
|
231
|
+
|
232
|
+
$.each(roleInstances, function(index, instance) {
|
233
|
+
var instanceId = $(instance).attr("data-instance-id");
|
234
|
+
ScalariumDeployment.switchOffInstance(instanceId);
|
235
|
+
});
|
236
|
+
|
237
|
+
} else {
|
238
|
+
$.each(roleInstances, function(index, instance) {
|
239
|
+
var instanceId = $(instance).attr("data-instance-id");
|
240
|
+
ScalariumDeployment.switchOnInstance(instanceId);
|
241
|
+
});
|
242
|
+
}
|
243
|
+
}
|
244
|
+
|
245
|
+
ScalariumDeployment.countInstances();
|
246
|
+
});
|
247
|
+
|
248
|
+
$('#deployment_command').change(function() {
|
249
|
+
update_deploy_command_helper();
|
250
|
+
});
|
251
|
+
|
252
|
+
function update_deploy_command_helper(){
|
253
|
+
var command = $('#deployment_command').val();
|
254
|
+
$('#deploy_command_helper').html(ScalariumDeployment.commandDescriptions[command])
|
255
|
+
};
|
256
|
+
update_deploy_command_helper();
|
257
|
+
|
258
|
+
</script>
|
259
|
+
|
260
|
+
|
261
|
+
</div>
|
262
|
+
<div id="push"></div>
|
263
|
+
</div>
|
264
|
+
</div>
|
265
|
+
|
266
|
+
|
267
|
+
|
268
|
+
<div id="footer">
|
269
|
+
<div>
|
270
|
+
<ul class="horizontal-menu">
|
271
|
+
<li style="margin-top:0px;"><a href="http://www.peritor.com"><img alt="Peritor Logo" height="40" longdesc="/images/logo-peritor.png" src="/images/logo-peritor.png?1292617034" width="115" /></a></li>
|
272
|
+
<li><a href="http://www.scalarium.com/blog">Blog</a></li>
|
273
|
+
<li><a href="http://support.scalarium.com">Support</a></li>
|
274
|
+
<li><a href="http://www.peritor.com/de/contact/index.html">Contact</a></li>
|
275
|
+
<li><a href="http://twitter.com/scalarium">Twitter</a></li>
|
276
|
+
<li><a href="http://www.peritor.com/de/shared/legal.html">Imprint</a></li>
|
277
|
+
<li><a href="http://www.peritor.com/de/shared/legal.html">Legal</a></li>
|
278
|
+
</ul>
|
279
|
+
</div>
|
280
|
+
</div>
|
281
|
+
|
282
|
+
<script type="text/javascript" charset="utf-8">
|
283
|
+
Tender = {
|
284
|
+
hideToggle: true,
|
285
|
+
widgetToggles: $('#feedback')
|
286
|
+
};
|
287
|
+
</script>
|
288
|
+
<script src="https://scalarium.tenderapp.com/tender_widget.js" type="text/javascript"></script>
|
289
|
+
|
290
|
+
</body>
|
291
|
+
</html>
|
@@ -0,0 +1,149 @@
|
|
1
|
+
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
3
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
4
|
+
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
6
|
+
<head>
|
7
|
+
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
|
8
|
+
<link rel="icon" href="/images/favicon.png" type="image/png" />
|
9
|
+
<title>Scalarium Login</title>
|
10
|
+
<link href="/stylesheets/layout.css?1291053194" media="screen" rel="stylesheet" type="text/css" />
|
11
|
+
<link href="/stylesheets/facebox.css?1291053194" media="screen" rel="stylesheet" type="text/css" />
|
12
|
+
<script src="/javascripts/jquery/jquery.min.js?1291053194" type="text/javascript"></script>
|
13
|
+
<script src="/javascripts/jquery/jquery-ui-1.7.2.custom.min.js?1291053194" type="text/javascript"></script>
|
14
|
+
<script src="/javascripts/jquery/jquery.bgiframe.min.js?1291053194" type="text/javascript"></script>
|
15
|
+
<script src="/javascripts/superfish/superfish.js?1291053194" type="text/javascript"></script>
|
16
|
+
<script src="/javascripts/superfish/supersubs.js?1291053194" type="text/javascript"></script>
|
17
|
+
<script src="/javascripts/application.js?1291053194" type="text/javascript"></script>
|
18
|
+
<script src="/javascripts/jquery/jquery.tipTip-mod.js?1291053194" type="text/javascript"></script>
|
19
|
+
<script src="/javascripts/jquery/jquery.easing.1.3.js?1291053194" type="text/javascript"></script>
|
20
|
+
<script src="/javascripts/jquery/jquery.sparkline.js?1291053194" type="text/javascript"></script>
|
21
|
+
<script src="/javascripts/jquery/jquery.color.js?1291053194" type="text/javascript"></script>
|
22
|
+
<script src="/javascripts/jquery/jquery.flot_patch.js?1291053194" type="text/javascript"></script>
|
23
|
+
<script src="/javascripts/jquery/jquery.flot.selection.min.js?1291053194" type="text/javascript"></script>
|
24
|
+
<script src="/javascripts/jquery/jquery.flot.stack.min.js?1291053194" type="text/javascript"></script>
|
25
|
+
|
26
|
+
<script type="text/javascript">
|
27
|
+
$(document).ready(function(){
|
28
|
+
Scalarium.initMenus();
|
29
|
+
|
30
|
+
$("ul.sf-menu .sf-right a").live("click", function(){
|
31
|
+
$(this).parents("ul.sf-menu").hideSuperfishUl();
|
32
|
+
});
|
33
|
+
|
34
|
+
});
|
35
|
+
|
36
|
+
var $scalarium = {
|
37
|
+
instanceRefreshInterval: 10000,
|
38
|
+
logLoadingTimeout: 15000,
|
39
|
+
debug: false
|
40
|
+
};
|
41
|
+
</script>
|
42
|
+
|
43
|
+
<script type="text/javascript">
|
44
|
+
var host = document.location.host;
|
45
|
+
if (host == 'manage.scalarium.com') {
|
46
|
+
var _gaq = _gaq || [];
|
47
|
+
_gaq.push(['_setAccount', 'UA-6003901-5']);
|
48
|
+
_gaq.push(['_setDomainName', host]);
|
49
|
+
_gaq.push(['_trackPageview']);
|
50
|
+
|
51
|
+
(function() {
|
52
|
+
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
53
|
+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
54
|
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
55
|
+
})();
|
56
|
+
}
|
57
|
+
</script>
|
58
|
+
</head>
|
59
|
+
|
60
|
+
<body>
|
61
|
+
|
62
|
+
<div id="page">
|
63
|
+
<div id="center">
|
64
|
+
<a href="/" style="height:80px; width:120px; display:block; position:absolute; outline: none;" title="Home"></a>
|
65
|
+
<div id="header">
|
66
|
+
<ul class="horizontal-menu">
|
67
|
+
<li><a href="#" id="feedback">Support</a></li>
|
68
|
+
<li><a href="http://support.scalarium.com/faqs" target="_blank">FAQ</a></li>
|
69
|
+
<li><a href="/login">Login</a></li>
|
70
|
+
</ul>
|
71
|
+
</div>
|
72
|
+
|
73
|
+
<div id="nav">
|
74
|
+
<ul class="sf-menu">
|
75
|
+
</ul>
|
76
|
+
<span style="float: right">
|
77
|
+
<a href="/"><img alt="Zeppelin" height="75" id="zeppelin" longdesc="/images/zeppelin.png" src="/images/zeppelin.png?1291053194" width="150" /></a>
|
78
|
+
</span>
|
79
|
+
</div>
|
80
|
+
|
81
|
+
<div id="content">
|
82
|
+
|
83
|
+
|
84
|
+
<div class="row">
|
85
|
+
<form action="/session" method="post"><div style="margin:0;padding:0;display:inline"><input name="authenticity_token" type="hidden" value="QVlCYGRzSoYF2govWqvwjP1Ac8kIZQTfgJFImWdssQY=" /></div>
|
86
|
+
<div class="column width_4">
|
87
|
+
<h2>Login</h2>
|
88
|
+
<fieldset>
|
89
|
+
<label for="user_email">Email</label>
|
90
|
+
<input id="user_email" name="user[email]" size="30" tabindex="1" type="text" />
|
91
|
+
<label for="user_password">Password <span style="color:#999999"> - </span><a href="/password_resets/new" style="color:#999999">Forgot Password?</a></label>
|
92
|
+
<input id="user_password" name="user[password]" size="30" tabindex="2" type="password" />
|
93
|
+
</fieldset>
|
94
|
+
</div>
|
95
|
+
|
96
|
+
<div class="column width_8">
|
97
|
+
<h2>Sign up</h2>
|
98
|
+
<p>If you don't have an account yet, <a href="/users/new" class="strong">sign up now</a>.</p>
|
99
|
+
<p>A valid <a href="http://www.amazon.com/gp/aws/registration/registration-form.html" class="strong">Amazon Web Services account</a> is required. Make sure it's enabled for use with EC2.</p>
|
100
|
+
<p>To learn more about Scalarium, <a href="http://www.scalarium.com/tour" class="text-link">check out our screencasts</a>.
|
101
|
+
</div>
|
102
|
+
|
103
|
+
<div class="column width_4 clear">
|
104
|
+
<hr/>
|
105
|
+
<input name="commit" type="submit" value="Login" />
|
106
|
+
</div>
|
107
|
+
|
108
|
+
<div class="column width_8">
|
109
|
+
<hr/>
|
110
|
+
<input class="link_button " type="submit" value="Sign up" name="Sign up" data-target="/account/new" />
|
111
|
+
<noscript><a href="/account/new">Sign up</a></noscript>
|
112
|
+
|
113
|
+
</div>
|
114
|
+
|
115
|
+
</form></div>
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
</div>
|
120
|
+
<div id="push"></div>
|
121
|
+
</div>
|
122
|
+
</div>
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
<div id="footer">
|
127
|
+
<div>
|
128
|
+
<ul class="horizontal-menu">
|
129
|
+
<li style="margin-top:0px;"><a href="http://www.peritor.com"><img alt="Peritor Logo" height="40" longdesc="/images/logo-peritor.png" src="/images/logo-peritor.png?1291053194" width="115" /></a></li>
|
130
|
+
<li><a href="http://www.scalarium.com/blog">Blog</a></li>
|
131
|
+
<li><a href="http://support.scalarium.com">Support</a></li>
|
132
|
+
<li><a href="http://www.peritor.com/de/contact/index.html">Contact</a></li>
|
133
|
+
<li><a href="http://twitter.com/scalarium">Twitter</a></li>
|
134
|
+
<li><a href="http://www.peritor.com/de/shared/legal.html">Imprint</a></li>
|
135
|
+
<li><a href="http://www.peritor.com/de/shared/legal.html">Legal</a></li>
|
136
|
+
</ul>
|
137
|
+
</div>
|
138
|
+
</div>
|
139
|
+
|
140
|
+
<script type="text/javascript" charset="utf-8">
|
141
|
+
Tender = {
|
142
|
+
hideToggle: true,
|
143
|
+
widgetToggles: $('#feedback')
|
144
|
+
};
|
145
|
+
</script>
|
146
|
+
<script src="https://scalarium.tenderapp.com/tender_widget.js" type="text/javascript"></script>
|
147
|
+
|
148
|
+
</body>
|
149
|
+
</html>
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Scalarium::Application do
|
4
|
+
describe "Configuring an application" do
|
5
|
+
before(:all) do
|
6
|
+
@application = Scalarium::Application.new
|
7
|
+
@application.config do |c|
|
8
|
+
c.email = "test@email.com"
|
9
|
+
c.password = "password"
|
10
|
+
c.slug = "railslove"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
subject { @application }
|
15
|
+
|
16
|
+
its(:email) { should eql("test@email.com") }
|
17
|
+
its(:password) { should eql("password") }
|
18
|
+
its(:slug) { should eql("railslove") }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "Deploying an application" do
|
22
|
+
before do
|
23
|
+
stub_request(:any, /scalarium/)
|
24
|
+
|
25
|
+
@application = Scalarium::Application.new
|
26
|
+
|
27
|
+
# WebMock stubs
|
28
|
+
stub_request(:get, "https://manage.scalarium.com/session/new").
|
29
|
+
to_return(:body => fixture("session_new.html"),
|
30
|
+
:headers => {"Content-Type" => "text/html"})
|
31
|
+
|
32
|
+
stub_request(:post, "https://manage.scalarium.com/session")
|
33
|
+
|
34
|
+
stub_request(:get, "https://manage.scalarium.com/applications/railslove/deployments/new").
|
35
|
+
to_return(:body => fixture("new_deploy.html"),
|
36
|
+
:headers => {"Content-Type" => "text/html"})
|
37
|
+
end
|
38
|
+
|
39
|
+
context "when basic deploy" do
|
40
|
+
before do
|
41
|
+
@application.config do |c|
|
42
|
+
c.email = "test@email.com"
|
43
|
+
c.password = "password"
|
44
|
+
c.slug = "railslove"
|
45
|
+
end
|
46
|
+
|
47
|
+
@application.deploy
|
48
|
+
end
|
49
|
+
|
50
|
+
subject { WebMock::API }
|
51
|
+
|
52
|
+
it { should have_requested(:get, "https://manage.scalarium.com/session/new") }
|
53
|
+
it { should have_requested(:get, "https://manage.scalarium.com/applications/railslove/deployments/new") }
|
54
|
+
it { should have_requested(:post, "https://manage.scalarium.com/applications/railslove/deployments") }
|
55
|
+
end
|
56
|
+
|
57
|
+
context "when deploying with a migration" do
|
58
|
+
before do
|
59
|
+
@application.config do |c|
|
60
|
+
c.email = "test@email.com"
|
61
|
+
c.password = "password"
|
62
|
+
c.slug = "railslove"
|
63
|
+
c.run_migrations = true
|
64
|
+
end
|
65
|
+
|
66
|
+
@application.deploy
|
67
|
+
end
|
68
|
+
|
69
|
+
subject { WebMock::API }
|
70
|
+
|
71
|
+
it { should have_requested(:post, "https://manage.scalarium.com/applications/railslove/deployments").
|
72
|
+
with {|req| req.body.match(/migrate%5D=1/) } }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
2
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
|
4
|
+
require "scalarium"
|
5
|
+
require "rspec"
|
6
|
+
require "webmock/rspec"
|
7
|
+
|
8
|
+
def fixture(file_name)
|
9
|
+
File.read(fixture_path(file_name))
|
10
|
+
end
|
11
|
+
|
12
|
+
def fixture_path(file_name)
|
13
|
+
File.expand_path(File.dirname(__FILE__)) + "/fixtures/#{file_name}"
|
14
|
+
end
|
15
|
+
|
16
|
+
RSpec.configure do |config|
|
17
|
+
config.include(WebMock::API)
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: scalarium_cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Red Davis
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-12-29 00:00:00 +00:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: mechanize
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 23
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
version: 1.0.0
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: thor
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 43
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 14
|
49
|
+
- 6
|
50
|
+
version: 0.14.6
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rspec
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 3
|
62
|
+
segments:
|
63
|
+
- 2
|
64
|
+
- 3
|
65
|
+
- 0
|
66
|
+
version: 2.3.0
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webmock
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 13
|
78
|
+
segments:
|
79
|
+
- 1
|
80
|
+
- 6
|
81
|
+
- 1
|
82
|
+
version: 1.6.1
|
83
|
+
type: :development
|
84
|
+
version_requirements: *id004
|
85
|
+
description: Allows you to deploy apps hosted on Scalarium from the command line
|
86
|
+
email:
|
87
|
+
- red@railslove.com
|
88
|
+
executables:
|
89
|
+
- sca
|
90
|
+
extensions: []
|
91
|
+
|
92
|
+
extra_rdoc_files: []
|
93
|
+
|
94
|
+
files:
|
95
|
+
- .gitignore
|
96
|
+
- .rspec
|
97
|
+
- Gemfile
|
98
|
+
- Gemfile.lock
|
99
|
+
- README.md
|
100
|
+
- Rakefile
|
101
|
+
- bin/sca
|
102
|
+
- lib/scalarium.rb
|
103
|
+
- lib/scalarium/application.rb
|
104
|
+
- lib/scalarium/cli.rb
|
105
|
+
- lib/scalarium/version.rb
|
106
|
+
- scalarium.gemspec
|
107
|
+
- spec/fixtures/new_deploy.html
|
108
|
+
- spec/fixtures/session_new.html
|
109
|
+
- spec/scalarium/application_spec.rb
|
110
|
+
- spec/spec_helper.rb
|
111
|
+
has_rdoc: true
|
112
|
+
homepage: https://github.com/railslove/Scalarium-CLI
|
113
|
+
licenses: []
|
114
|
+
|
115
|
+
post_install_message:
|
116
|
+
rdoc_options: []
|
117
|
+
|
118
|
+
require_paths:
|
119
|
+
- lib
|
120
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
hash: 3
|
126
|
+
segments:
|
127
|
+
- 0
|
128
|
+
version: "0"
|
129
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
hash: 3
|
135
|
+
segments:
|
136
|
+
- 0
|
137
|
+
version: "0"
|
138
|
+
requirements: []
|
139
|
+
|
140
|
+
rubyforge_project: scalarium_cli
|
141
|
+
rubygems_version: 1.3.7
|
142
|
+
signing_key:
|
143
|
+
specification_version: 3
|
144
|
+
summary: Allows you to deploy apps hosted on Scalarium from the command line
|
145
|
+
test_files:
|
146
|
+
- spec/fixtures/new_deploy.html
|
147
|
+
- spec/fixtures/session_new.html
|
148
|
+
- spec/scalarium/application_spec.rb
|
149
|
+
- spec/spec_helper.rb
|