pagoda 0.3.2 → 0.5.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/.DS_Store +0 -0
- data/Gemfile +3 -3
- data/Gemfile.lock +33 -24
- data/README.md +68 -0
- data/Rakefile +4 -7
- data/bin/pagoda +100 -8
- data/lib/pagoda/cli/commands/clone.rb +13 -0
- data/lib/pagoda/cli/commands/create.rb +13 -0
- data/lib/pagoda/cli/commands/deploy.rb +12 -0
- data/lib/pagoda/cli/commands/destroy.rb +16 -0
- data/lib/pagoda/cli/commands/info.rb +13 -0
- data/lib/pagoda/cli/commands/init.rb +13 -0
- data/lib/pagoda/cli/commands/list.rb +20 -0
- data/lib/pagoda/cli/commands/rename.rb +17 -0
- data/lib/pagoda/cli/commands/rollback.rb +12 -0
- data/lib/pagoda/cli/commands/ssh_key.rb +27 -0
- data/lib/pagoda/cli/commands/tunnel.rb +18 -0
- data/lib/pagoda/cli/commands.rb +11 -0
- data/lib/pagoda/{helpers.rb → cli/core_ext.rb} +10 -118
- data/lib/pagoda/cli/helpers/app.rb +143 -0
- data/lib/pagoda/cli/helpers/base.rb +199 -0
- data/lib/pagoda/cli/helpers/key.rb +69 -0
- data/lib/pagoda/cli/helpers/tunnel.rb +36 -0
- data/lib/pagoda/cli/helpers.rb +127 -0
- data/lib/pagoda/cli/override.rb +23 -0
- data/lib/pagoda/cli/version.rb +5 -0
- data/lib/pagoda/cli.rb +11 -0
- data/lib/pagoda-cli.rb +1 -0
- data/pagoda.gemspec +20 -24
- data/pagoda.rdoc +139 -0
- data/pkg/newpagoda-0.1.10.gem +0 -0
- data/pkg/newpagoda-0.1.11.gem +0 -0
- data/pkg/newpagoda-0.1.12.gem +0 -0
- data/pkg/newpagoda-0.1.13.gem +0 -0
- data/pkg/newpagoda-0.1.15.gem +0 -0
- data/pkg/newpagoda-0.1.4.gem +0 -0
- data/pkg/newpagoda-0.1.6.gem +0 -0
- data/pkg/newpagoda-0.1.7.gem +0 -0
- data/pkg/newpagoda-0.1.8.gem +0 -0
- data/pkg/newpagoda-0.1.9.gem +0 -0
- data/pkg/newpagoda-0.5.0.gem +0 -0
- data/spec/lib/helper_spec.rb +32 -0
- data/spec/lib/helpers/app_spec.rb +104 -0
- data/spec/lib/helpers/base_spec.rb +27 -0
- data/spec/lib/helpers/key_spec.rb +42 -0
- data/spec/lib/helpers/tunnel_spec.rb +30 -0
- data/spec/spec_helper.rb +17 -0
- metadata +74 -50
- data/.bundle/config +0 -1
- data/README +0 -3
- data/lib/pagoda/client.rb +0 -225
- data/lib/pagoda/command.rb +0 -96
- data/lib/pagoda/commands/app.rb +0 -247
- data/lib/pagoda/commands/auth.rb +0 -149
- data/lib/pagoda/commands/base.rb +0 -184
- data/lib/pagoda/commands/db.rb +0 -18
- data/lib/pagoda/commands/help.rb +0 -100
- data/lib/pagoda/commands/tunnel.rb +0 -49
- data/lib/pagoda/tunnel_proxy.rb +0 -130
- data/lib/pagoda/version.rb +0 -3
- data/lib/pagoda.rb +0 -3
- data/spec/base.rb +0 -21
- data/spec/client_spec.rb +0 -255
- data/spec/command_spec.rb +0 -26
- data/spec/commands/auth_spec.rb +0 -57
data/spec/client_spec.rb
DELETED
@@ -1,255 +0,0 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/base"
|
2
|
-
require "#{File.dirname(__FILE__)}/../lib/pagoda/client"
|
3
|
-
|
4
|
-
describe Pagoda::Client do
|
5
|
-
|
6
|
-
before do
|
7
|
-
@client = Pagoda::Client.new(nil, nil)
|
8
|
-
end
|
9
|
-
|
10
|
-
describe "app" do
|
11
|
-
|
12
|
-
# errors come back like this:
|
13
|
-
# <?xml version="1.0" encoding="UTF-8"?>
|
14
|
-
# <errors>
|
15
|
-
# <error>Username can't be blank</error>
|
16
|
-
# <error>Email can't be blank</error>
|
17
|
-
# <error>Password can't be blank</error>
|
18
|
-
# </errors>
|
19
|
-
|
20
|
-
it "should display information" do
|
21
|
-
stub = %{
|
22
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
23
|
-
<app>
|
24
|
-
<name>testapp</name>
|
25
|
-
<git-url>git@github.com:tylerflint/pagoda-pilot.git</git-url>
|
26
|
-
<owner>
|
27
|
-
<username>owner1</username>
|
28
|
-
<email>owner1@test.com</email>
|
29
|
-
</owner>
|
30
|
-
<collaborators type="array">
|
31
|
-
<collaborator>
|
32
|
-
<username>guy1</username>
|
33
|
-
<email>guy1@test.com</email>
|
34
|
-
</collaborator>
|
35
|
-
<collaborator>
|
36
|
-
<username>guy2</username>
|
37
|
-
<email>guy2@test.com</email>
|
38
|
-
</collaborator>
|
39
|
-
</collaborators>
|
40
|
-
<transactions type="array">
|
41
|
-
<transaction>
|
42
|
-
<id>1</id>
|
43
|
-
<name>app.init</name>
|
44
|
-
<description>Deploying app to the Pagoda grid</description>
|
45
|
-
<state>started</state>
|
46
|
-
<status></status>
|
47
|
-
</transaction>
|
48
|
-
</transactions>
|
49
|
-
</app>
|
50
|
-
}
|
51
|
-
stub_api_request(:get, "/apps/testapp.xml").to_return(:body => stub)
|
52
|
-
@client.app_info('testapp').should == {
|
53
|
-
:name => 'testapp',
|
54
|
-
:git_url => 'git@github.com:tylerflint/pagoda-pilot.git',
|
55
|
-
:owner => {
|
56
|
-
:username => 'owner1',
|
57
|
-
:email => 'owner1@test.com'
|
58
|
-
},
|
59
|
-
:collaborators => [
|
60
|
-
{:username => 'guy1', :email => 'guy1@test.com'},
|
61
|
-
{:username => 'guy2', :email => 'guy2@test.com'}
|
62
|
-
],
|
63
|
-
:transactions => [
|
64
|
-
{:id => '1', :name => 'app.init', :description => 'Deploying app to the Pagoda grid', :state => 'started', :status => nil}
|
65
|
-
]
|
66
|
-
}
|
67
|
-
end
|
68
|
-
|
69
|
-
it "lists incomplete transactions" do
|
70
|
-
stub = %{
|
71
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
72
|
-
<transactions type="array">
|
73
|
-
<transaction>
|
74
|
-
<id>1</id>
|
75
|
-
<name>app.increment</name>
|
76
|
-
<description>spawn new instance of app</description>
|
77
|
-
<state>started</state>
|
78
|
-
<status></status>
|
79
|
-
</transaction>
|
80
|
-
<transaction>
|
81
|
-
<id>2</id>
|
82
|
-
<name>app.deploy</name>
|
83
|
-
<description>deploy code</description>
|
84
|
-
<state>ready</state>
|
85
|
-
<status></status>
|
86
|
-
</transaction>
|
87
|
-
</transactions>
|
88
|
-
}
|
89
|
-
stub_api_request(:get, "/apps/testapp/transactions.xml").to_return(:body => stub)
|
90
|
-
@client.transaction_list('testapp').should == [
|
91
|
-
{:id => '1', :name => 'app.increment', :description => 'spawn new instance of app', :state => 'started', :status => nil},
|
92
|
-
{:id => '2', :name => 'app.deploy', :description => 'deploy code', :state => 'ready', :status => nil}
|
93
|
-
]
|
94
|
-
end
|
95
|
-
|
96
|
-
it "lists details of a transaction" do
|
97
|
-
stub = %{
|
98
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
99
|
-
<transaction>
|
100
|
-
<id>1</id>
|
101
|
-
<name>app.increment</name>
|
102
|
-
<description>spawn new instance of app</description>
|
103
|
-
<state>started</state>
|
104
|
-
<status></status>
|
105
|
-
</transaction>
|
106
|
-
}
|
107
|
-
stub_api_request(:get, "/apps/testapp/transactions/123.xml").to_return(:body => stub)
|
108
|
-
@client.transaction_status('testapp', '123').should == {:id => '1', :name => 'app.increment', :description => 'spawn new instance of app', :state => 'started', :status => nil}
|
109
|
-
end
|
110
|
-
|
111
|
-
it "deploys" do
|
112
|
-
stub = %{
|
113
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
114
|
-
<transaction>
|
115
|
-
<id>1</id>
|
116
|
-
<name>app.deploy</name>
|
117
|
-
<description>deploy new code</description>
|
118
|
-
<state>started</state>
|
119
|
-
<status></status>
|
120
|
-
</transaction>
|
121
|
-
}
|
122
|
-
stub_api_request(:put, "/apps/testapp/deploy.xml").to_return(:body => stub)
|
123
|
-
@client.deploy('testapp').should == {:id => '1', :name => 'app.deploy', :description => 'deploy new code', :state => 'started', :status => nil}
|
124
|
-
end
|
125
|
-
|
126
|
-
it "rewinds deploy list" do
|
127
|
-
stub = %{
|
128
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
129
|
-
<transaction>
|
130
|
-
<id>1</id>
|
131
|
-
<name>app.traverse</name>
|
132
|
-
<description>traverse the code</description>
|
133
|
-
<state>started</state>
|
134
|
-
<status></status>
|
135
|
-
</transaction>
|
136
|
-
}
|
137
|
-
stub_api_request(:put, "/apps/testapp/rewind.xml").to_return(:body => stub)
|
138
|
-
@client.rewind('testapp', 1).should == {:id => '1', :name => 'app.traverse', :description => 'traverse the code', :state => 'started', :status => nil}
|
139
|
-
end
|
140
|
-
|
141
|
-
it "fast-forwards deploy list" do
|
142
|
-
stub = %{
|
143
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
144
|
-
<transaction>
|
145
|
-
<id>1</id>
|
146
|
-
<name>app.traverse</name>
|
147
|
-
<description>traverse the code</description>
|
148
|
-
<state>started</state>
|
149
|
-
<status></status>
|
150
|
-
</transaction>
|
151
|
-
}
|
152
|
-
stub_api_request(:put, "/apps/testapp/fast-forward.xml").to_return(:body => stub)
|
153
|
-
@client.fast_forward('testapp', 1).should == {:id => '1', :name => 'app.traverse', :description => 'traverse the code', :state => 'started', :status => nil}
|
154
|
-
end
|
155
|
-
|
156
|
-
it "scales up" do
|
157
|
-
stub = %{
|
158
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
159
|
-
<transaction>
|
160
|
-
<id>1</id>
|
161
|
-
<name>app.scaleup</name>
|
162
|
-
<description>scaling app</description>
|
163
|
-
<state>started</state>
|
164
|
-
<status></status>
|
165
|
-
</transaction>
|
166
|
-
}
|
167
|
-
stub_api_request(:put, "/apps/testapp/scale-up.xml").to_return(:body => stub)
|
168
|
-
@client.scale_up('testapp', 1).should == {:id => '1', :name => 'app.scaleup', :description => 'scaling app', :state => 'started', :status => nil}
|
169
|
-
end
|
170
|
-
|
171
|
-
it "scales down" do
|
172
|
-
stub = %{
|
173
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
174
|
-
<transaction>
|
175
|
-
<id>1</id>
|
176
|
-
<name>app.scaledown</name>
|
177
|
-
<description>scaling app</description>
|
178
|
-
<state>started</state>
|
179
|
-
<status></status>
|
180
|
-
</transaction>
|
181
|
-
}
|
182
|
-
stub_api_request(:put, "/apps/testapp/scale-down.xml").to_return(:body => stub)
|
183
|
-
@client.scale_down('testapp', 1).should == {:id => '1', :name => 'app.scaledown', :description => 'scaling app', :state => 'started', :status => nil}
|
184
|
-
end
|
185
|
-
|
186
|
-
end
|
187
|
-
|
188
|
-
describe "user" do
|
189
|
-
|
190
|
-
it "should list all active apps" do
|
191
|
-
stub = %{
|
192
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
193
|
-
<apps type="array">
|
194
|
-
<app>
|
195
|
-
<id>1</id>
|
196
|
-
<name>burt</name>
|
197
|
-
<git-url>git@github.com:tylerflint/pagoda-pilot.git</git-url>
|
198
|
-
</app>
|
199
|
-
<app>
|
200
|
-
<id>2</id>
|
201
|
-
<name>ernie</name>
|
202
|
-
<git-url>git@github.com:tylerflint/pagoda-pilot.git</git-url>
|
203
|
-
</app>
|
204
|
-
</apps>
|
205
|
-
}
|
206
|
-
stub_api_request(:get, "/apps.xml").to_return(:body => stub)
|
207
|
-
@client.app_list.should == [{:id => '1', :name => 'burt', :git_url => 'git@github.com:tylerflint/pagoda-pilot.git'}, {:id => '2', :name => 'ernie', :git_url => 'git@github.com:tylerflint/pagoda-pilot.git'}]
|
208
|
-
end
|
209
|
-
|
210
|
-
it "should create a new app" do
|
211
|
-
stub = %{
|
212
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
213
|
-
<app>
|
214
|
-
<name>testapp</name>
|
215
|
-
<git-url>git@github.com:tylerflint/pagoda-pilot.git</git-url>
|
216
|
-
<owner>
|
217
|
-
<username>tylerflint</username>
|
218
|
-
<email>tylerflint@gmail.com</email>
|
219
|
-
</owner>
|
220
|
-
<collaborators>
|
221
|
-
</collaborators>
|
222
|
-
<transactions type="array">
|
223
|
-
<transaction>
|
224
|
-
<id>1</id>
|
225
|
-
<name>app.init</name>
|
226
|
-
<description>Deploying app to the Pagoda grid</description>
|
227
|
-
<state>started</state>
|
228
|
-
<status></status>
|
229
|
-
</transaction>
|
230
|
-
</transactions>
|
231
|
-
</app>
|
232
|
-
}
|
233
|
-
stub_api_request(:post, '/apps.xml').with(:body => "app[name]=testapp&app[git_url]=git%40github.com%3Atylerflint%2Fpagoda-pilot.git").to_return(:body => stub)
|
234
|
-
@client.app_create('testapp', 'git@github.com:tylerflint/pagoda-pilot.git').should == {
|
235
|
-
:name => 'testapp',
|
236
|
-
:git_url => 'git@github.com:tylerflint/pagoda-pilot.git',
|
237
|
-
:owner => {
|
238
|
-
:username => 'tylerflint',
|
239
|
-
:email => 'tylerflint@gmail.com'
|
240
|
-
},
|
241
|
-
:collaborators => [],
|
242
|
-
:transactions => [
|
243
|
-
{:id => '1', :name => 'app.init', :description => 'Deploying app to the Pagoda grid', :state => 'started', :status => nil}
|
244
|
-
]
|
245
|
-
}
|
246
|
-
end
|
247
|
-
|
248
|
-
it "should destroy an active app" do
|
249
|
-
stub_api_request(:delete, '/apps/testapp.xml')
|
250
|
-
@client.app_destroy('testapp')
|
251
|
-
end
|
252
|
-
|
253
|
-
end
|
254
|
-
|
255
|
-
end
|
data/spec/command_spec.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
|
2
|
-
describe Pagoda::Command do
|
3
|
-
|
4
|
-
it "extracts error messages from response when available in XML" do
|
5
|
-
Pagoda::Command.extract_error('<errors><error>Invalid app name</error></errors>').should == ' ! Invalid app name'
|
6
|
-
end
|
7
|
-
|
8
|
-
it "shows Internal Server Error when the response doesn't contain a XML" do
|
9
|
-
Pagoda::Command.extract_error('<h1>HTTP 500</h1>').should == ' ! Internal server error'
|
10
|
-
end
|
11
|
-
|
12
|
-
it "handles a nil body in parse_error_xml" do
|
13
|
-
lambda { Pagoda::Command.parse_error_xml(nil) }.should_not raise_error
|
14
|
-
end
|
15
|
-
|
16
|
-
it "correctly resolves commands" do
|
17
|
-
class Pagoda::Command::Test; end
|
18
|
-
class Pagoda::Command::Test::Multiple; end
|
19
|
-
|
20
|
-
Pagoda::Command.parse("foo").should == [ Pagoda::Command::App, :foo ]
|
21
|
-
Pagoda::Command.parse("test").should == [ Pagoda::Command::Test, :index ]
|
22
|
-
Pagoda::Command.parse("test:foo").should == [ Pagoda::Command::Test, :foo ]
|
23
|
-
Pagoda::Command.parse("test:multiple:foo").should == [ Pagoda::Command::Test::Multiple, :foo ]
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
data/spec/commands/auth_spec.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
module Pagoda::Command
|
2
|
-
describe Auth do
|
3
|
-
before do
|
4
|
-
@cli = prepare_command(Auth)
|
5
|
-
@sandbox = "#{Dir.tmpdir}/cli_spec_#{Process.pid}"
|
6
|
-
File.open(@sandbox, "w") { |f| f.write "user\npass\n" }
|
7
|
-
@cli.stub!(:credentials_file).and_return(@sandbox)
|
8
|
-
@cli.stub!(:running_on_a_mac?).and_return(false)
|
9
|
-
end
|
10
|
-
|
11
|
-
after do
|
12
|
-
FileUtils.rm_rf(@sandbox)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "reads credentials from the credentials file" do
|
16
|
-
@cli.read_credentials.should == %w(user pass)
|
17
|
-
end
|
18
|
-
|
19
|
-
it "takes the user from the first line and the password from the second line" do
|
20
|
-
@cli.user.should == 'user'
|
21
|
-
@cli.password.should == 'pass'
|
22
|
-
end
|
23
|
-
|
24
|
-
it "asks for credentials when the file doesn't exist" do
|
25
|
-
FileUtils.rm_rf(@sandbox)
|
26
|
-
@cli.should_receive(:ask_for_credentials).and_return([ 'u', 'p'])
|
27
|
-
@cli.should_receive(:save_credentials)
|
28
|
-
@cli.get_credentials.should == [ 'u', 'p' ]
|
29
|
-
end
|
30
|
-
|
31
|
-
it "writes the credentials to a file" do
|
32
|
-
@cli.stub!(:credentials).and_return(['one', 'two'])
|
33
|
-
@cli.should_receive(:set_credentials_permissions)
|
34
|
-
@cli.write_credentials
|
35
|
-
File.read(@sandbox).should == "one\ntwo\n"
|
36
|
-
end
|
37
|
-
|
38
|
-
it "sets ~/.pagoda/credentials to be readable only by the user" do
|
39
|
-
unless RUBY_PLATFORM =~ /mswin32|mingw32/
|
40
|
-
sandbox = "#{Dir.tmpdir}/cli_spec_#{Process.pid}"
|
41
|
-
FileUtils.rm_rf(sandbox)
|
42
|
-
FileUtils.mkdir_p(sandbox)
|
43
|
-
fname = "#{sandbox}/file"
|
44
|
-
system "touch #{fname}"
|
45
|
-
@cli.stub!(:credentials_file).and_return(fname)
|
46
|
-
@cli.set_credentials_permissions
|
47
|
-
File.stat(sandbox).mode.should == 040700
|
48
|
-
File.stat(fname).mode.should == 0100600
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
it "deletes the credentials file" do
|
53
|
-
FileUtils.should_receive(:rm_f).with(@cli.credentials_file)
|
54
|
-
@cli.delete_credentials
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|