rhc 1.2.7 → 1.3.8
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/bin/rhc +6 -8
- data/bin/rhc-chk +23 -10
- data/features/domain.feature +1 -1
- data/features/lib/rhc_helper.rb +3 -2
- data/features/lib/rhc_helper/api.rb +7 -0
- data/features/lib/rhc_helper/app.rb +8 -10
- data/features/lib/rhc_helper/domain.rb +2 -1
- data/features/lib/rhc_helper/runnable.rb +2 -24
- data/features/sshkey.feature +3 -3
- data/features/step_definitions/cartridge_steps.rb +6 -6
- data/features/step_definitions/client_steps.rb +0 -1
- data/features/step_definitions/sshkey_steps.rb +2 -2
- data/features/support/before_hooks.rb +0 -1
- data/features/support/env.rb +5 -3
- data/lib/rhc-common.rb +1 -1
- data/lib/rhc.rb +9 -8
- data/lib/rhc/auth.rb +3 -0
- data/lib/rhc/auth/basic.rb +54 -0
- data/lib/rhc/cartridge_helpers.rb +11 -5
- data/lib/rhc/cli.rb +4 -2
- data/lib/rhc/command_runner.rb +35 -30
- data/lib/rhc/commands.rb +127 -18
- data/lib/rhc/commands/account.rb +24 -0
- data/lib/rhc/commands/alias.rb +1 -1
- data/lib/rhc/commands/app.rb +210 -209
- data/lib/rhc/commands/apps.rb +22 -0
- data/lib/rhc/commands/base.rb +10 -77
- data/lib/rhc/commands/cartridge.rb +35 -35
- data/lib/rhc/commands/domain.rb +20 -13
- data/lib/rhc/commands/git_clone.rb +30 -0
- data/lib/rhc/commands/{port-forward.rb → port_forward.rb} +3 -3
- data/lib/rhc/commands/server.rb +28 -16
- data/lib/rhc/commands/setup.rb +18 -1
- data/lib/rhc/commands/snapshot.rb +4 -4
- data/lib/rhc/commands/sshkey.rb +4 -18
- data/lib/rhc/commands/tail.rb +32 -9
- data/lib/rhc/config.rb +168 -99
- data/lib/rhc/context_helper.rb +22 -9
- data/lib/rhc/core_ext.rb +41 -1
- data/lib/rhc/exceptions.rb +21 -5
- data/lib/rhc/git_helpers.rb +81 -0
- data/lib/rhc/help_formatter.rb +21 -1
- data/lib/rhc/helpers.rb +222 -87
- data/lib/rhc/output_helpers.rb +94 -110
- data/lib/rhc/rest.rb +15 -198
- data/lib/rhc/rest/api.rb +88 -0
- data/lib/rhc/rest/application.rb +29 -30
- data/lib/rhc/rest/attributes.rb +27 -0
- data/lib/rhc/rest/base.rb +29 -33
- data/lib/rhc/rest/cartridge.rb +42 -20
- data/lib/rhc/rest/client.rb +351 -89
- data/lib/rhc/rest/domain.rb +7 -13
- data/lib/rhc/rest/gear_group.rb +1 -1
- data/lib/rhc/rest/key.rb +7 -2
- data/lib/rhc/rest/mock.rb +609 -0
- data/lib/rhc/rest/user.rb +6 -2
- data/lib/rhc/{ssh_key_helpers.rb → ssh_helpers.rb} +58 -28
- data/lib/rhc/{targz.rb → tar_gz.rb} +0 -0
- data/lib/rhc/usage_templates/command_help.erb +4 -1
- data/lib/rhc/usage_templates/help.erb +24 -11
- data/lib/rhc/usage_templates/options_help.erb +14 -0
- data/lib/rhc/wizard.rb +283 -213
- data/spec/keys/example.pem +23 -0
- data/spec/keys/example_private.pem +27 -0
- data/spec/keys/server.pem +19 -0
- data/spec/rest_spec_helper.rb +3 -371
- data/spec/rhc/auth_spec.rb +226 -0
- data/spec/rhc/cli_spec.rb +41 -14
- data/spec/rhc/command_spec.rb +44 -15
- data/spec/rhc/commands/account_spec.rb +41 -0
- data/spec/rhc/commands/alias_spec.rb +16 -15
- data/spec/rhc/commands/app_spec.rb +115 -92
- data/spec/rhc/commands/apps_spec.rb +39 -0
- data/spec/rhc/commands/cartridge_spec.rb +134 -112
- data/spec/rhc/commands/domain_spec.rb +31 -86
- data/spec/rhc/commands/git_clone_spec.rb +56 -0
- data/spec/rhc/commands/{port-forward_spec.rb → port_forward_spec.rb} +27 -32
- data/spec/rhc/commands/server_spec.rb +28 -3
- data/spec/rhc/commands/setup_spec.rb +29 -11
- data/spec/rhc/commands/snapshot_spec.rb +4 -3
- data/spec/rhc/commands/sshkey_spec.rb +24 -56
- data/spec/rhc/commands/tail_spec.rb +26 -9
- data/spec/rhc/commands/threaddump_spec.rb +12 -11
- data/spec/rhc/config_spec.rb +211 -164
- data/spec/rhc/context_spec.rb +2 -0
- data/spec/rhc/helpers_spec.rb +242 -46
- data/spec/rhc/rest_application_spec.rb +42 -28
- data/spec/rhc/rest_client_spec.rb +110 -93
- data/spec/rhc/rest_spec.rb +220 -131
- data/spec/rhc/targz_spec.rb +1 -1
- data/spec/rhc/wizard_spec.rb +435 -624
- data/spec/spec.opts +1 -1
- data/spec/spec_helper.rb +140 -6
- data/spec/wizard_spec_helper.rb +326 -0
- metadata +163 -143
- data/lib/rhc/client.rb +0 -17
- data/lib/rhc/git_helper.rb +0 -59
data/lib/rhc/rest/domain.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
require 'rhc/rest/base'
|
2
|
-
|
3
1
|
module RHC
|
4
2
|
module Rest
|
5
3
|
class Domain < Base
|
6
|
-
|
4
|
+
define_attr :id
|
7
5
|
|
8
6
|
#Add Application to this domain
|
9
7
|
# options
|
@@ -18,23 +16,19 @@ module RHC
|
|
18
16
|
options.each do |key, value|
|
19
17
|
payload[key] = value
|
20
18
|
end
|
21
|
-
|
22
|
-
|
23
|
-
timeout = 300 # 5 minute timeout for scalable app
|
24
|
-
end
|
25
|
-
|
26
|
-
rest_method "ADD_APPLICATION", payload, timeout
|
19
|
+
options = {:timeout => options[:scale] && 0 || nil}
|
20
|
+
rest_method "ADD_APPLICATION", payload, options
|
27
21
|
end
|
28
22
|
|
29
|
-
def applications
|
23
|
+
def applications(options = {})
|
30
24
|
debug "Getting all applications for domain #{id}"
|
31
|
-
rest_method "LIST_APPLICATIONS"
|
25
|
+
rest_method "LIST_APPLICATIONS", options
|
32
26
|
end
|
33
27
|
|
34
28
|
def update(new_id)
|
35
29
|
debug "Updating domain #{id} to #{new_id}"
|
36
30
|
# 5 minute timeout as this may take time if there are a lot of apps
|
37
|
-
rest_method "UPDATE", {:id => new_id},
|
31
|
+
rest_method "UPDATE", {:id => new_id}, {:timeout => 0}
|
38
32
|
end
|
39
33
|
alias :save :update
|
40
34
|
|
@@ -53,7 +47,7 @@ module RHC
|
|
53
47
|
|
54
48
|
debug "Finding application :name => #{name}, :framework => #{framework}"
|
55
49
|
applications.each do |app|
|
56
|
-
return app if (name.nil? or app.name == name) and (framework.nil? or app.framework == framework)
|
50
|
+
return app if (name.nil? or app.name.downcase == name.downcase) and (framework.nil? or app.framework == framework)
|
57
51
|
end
|
58
52
|
|
59
53
|
raise RHC::ApplicationNotFoundException.new("Application #{name} does not exist")
|
data/lib/rhc/rest/gear_group.rb
CHANGED
data/lib/rhc/rest/key.rb
CHANGED
@@ -3,7 +3,7 @@ require 'rhc/rest/base'
|
|
3
3
|
module RHC
|
4
4
|
module Rest
|
5
5
|
class Key < Base
|
6
|
-
|
6
|
+
define_attr :name, :type, :content
|
7
7
|
|
8
8
|
def update(type, content)
|
9
9
|
debug "Updating key #{self.name}"
|
@@ -17,13 +17,18 @@ module RHC
|
|
17
17
|
alias :delete :destroy
|
18
18
|
|
19
19
|
def fingerprint
|
20
|
-
begin
|
20
|
+
@fingerprint ||= begin
|
21
21
|
public_key = Net::SSH::KeyFactory.load_data_public_key("#{type} #{content}")
|
22
22
|
public_key.fingerprint
|
23
23
|
rescue NotImplementedError, OpenSSL::PKey::PKeyError => e
|
24
24
|
'Invalid key'
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
28
|
+
def visible_to_ssh?
|
29
|
+
Net::SSH::Authentication::Agent.connect.identities.
|
30
|
+
find{ |i| fingerprint == i.fingerprint }.present? rescue false
|
31
|
+
end
|
27
32
|
end
|
28
33
|
end
|
29
34
|
end
|
@@ -0,0 +1,609 @@
|
|
1
|
+
require "rhc/rest"
|
2
|
+
|
3
|
+
module RHC::Rest::Mock
|
4
|
+
|
5
|
+
def self.start
|
6
|
+
RHC::Helpers.warn "Running in mock mode"
|
7
|
+
MockRestClient.new.tap do |c|
|
8
|
+
d = c.add_domain("test1")
|
9
|
+
app = d.add_application('app1', 'carttype1')
|
10
|
+
app.cartridges[0].display_name = "A display name"
|
11
|
+
app.add_cartridge('mockcart2')
|
12
|
+
app2 = d.add_application('app2', 'carttype2', true)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Helpers
|
17
|
+
|
18
|
+
def mock_user
|
19
|
+
"test_user"
|
20
|
+
end
|
21
|
+
|
22
|
+
def mock_user_auth
|
23
|
+
respond_to?(:user_auth) ? self.user_auth : {:user => username, :password => password}
|
24
|
+
end
|
25
|
+
|
26
|
+
def stub_api_request(method, uri, with_auth=true)
|
27
|
+
stub_request(method, mock_href(uri, with_auth)).
|
28
|
+
with(&user_agent_header)
|
29
|
+
end
|
30
|
+
|
31
|
+
def stub_api(auth=false)
|
32
|
+
stub_api_request(:get, 'broker/rest/api', auth).
|
33
|
+
to_return({
|
34
|
+
:body => {
|
35
|
+
:data => mock_response_links(mock_real_client_links),
|
36
|
+
:supported_api_versions => [1.0, 1.1, 1.2, 1.3],
|
37
|
+
}.to_json
|
38
|
+
})
|
39
|
+
end
|
40
|
+
def stub_user(auth=mock_user_auth)
|
41
|
+
stub_api_request(:get, 'broker/rest/user', auth).to_return(simple_user(username))
|
42
|
+
end
|
43
|
+
def stub_create_default_key
|
44
|
+
stub_api_request(:post, 'broker/rest/user/keys', mock_user_auth).
|
45
|
+
with(:body => hash_including({:name => 'default', :type => 'ssh-rsa'})).
|
46
|
+
to_return({:status => 201, :body => {}.to_json})
|
47
|
+
end
|
48
|
+
def stub_update_key(name)
|
49
|
+
stub_api_request(:put, "broker/rest/user/keys/#{name}", mock_user_auth).
|
50
|
+
with(:body => hash_including({:type => 'ssh-rsa'})).
|
51
|
+
to_return({:status => 200, :body => {}.to_json})
|
52
|
+
end
|
53
|
+
def stub_create_domain(name)
|
54
|
+
stub_api_request(:post, 'broker/rest/domains', mock_user_auth).
|
55
|
+
with(:body => hash_including({:id => name})).
|
56
|
+
to_return(new_domain(name))
|
57
|
+
end
|
58
|
+
def stub_no_keys
|
59
|
+
stub_api_request(:get, 'broker/rest/user/keys', mock_user_auth).to_return(no_keys)
|
60
|
+
end
|
61
|
+
def stub_mock_ssh_keys(name='test')
|
62
|
+
stub_api_request(:get, 'broker/rest/user/keys', mock_user_auth).
|
63
|
+
to_return({
|
64
|
+
:body => {
|
65
|
+
:type => 'keys',
|
66
|
+
:data => [
|
67
|
+
{
|
68
|
+
:name => name,
|
69
|
+
:type => pub_key.split[0],
|
70
|
+
:content => pub_key.split[1],
|
71
|
+
# :links => mock_response_links([
|
72
|
+
# ['UPDATE', "broker/rest/user/keys/#{name}", 'put']
|
73
|
+
# ]),
|
74
|
+
}
|
75
|
+
],
|
76
|
+
}.to_json
|
77
|
+
})
|
78
|
+
end
|
79
|
+
def stub_one_key(name)
|
80
|
+
stub_api_request(:get, 'broker/rest/user/keys', mock_user_auth).
|
81
|
+
to_return({
|
82
|
+
:body => {
|
83
|
+
:type => 'keys',
|
84
|
+
:data => [
|
85
|
+
{
|
86
|
+
:name => name,
|
87
|
+
:type => 'ssh-rsa',
|
88
|
+
:content => rsa_key_content_public,
|
89
|
+
:links => mock_response_links([
|
90
|
+
['UPDATE', "broker/rest/user/keys/#{name}", 'put']
|
91
|
+
]),
|
92
|
+
}
|
93
|
+
],
|
94
|
+
}.to_json
|
95
|
+
})
|
96
|
+
end
|
97
|
+
def stub_no_domains
|
98
|
+
stub_api_request(:get, 'broker/rest/domains', mock_user_auth).to_return(no_domains)
|
99
|
+
end
|
100
|
+
def stub_one_domain(name)
|
101
|
+
stub_api_request(:get, 'broker/rest/domains', mock_user_auth).
|
102
|
+
to_return({
|
103
|
+
:body => {
|
104
|
+
:type => 'domains',
|
105
|
+
:data => [{:id => name, :links => mock_response_links([
|
106
|
+
['LIST_APPLICATIONS', "broker/rest/domains/#{name}/applications", 'get']
|
107
|
+
])}],
|
108
|
+
}.to_json
|
109
|
+
})
|
110
|
+
end
|
111
|
+
def stub_one_application(domain_name, name)
|
112
|
+
stub_api_request(:get, "broker/rest/domains/#{domain_name}/applications", mock_user_auth).
|
113
|
+
to_return({
|
114
|
+
:body => {
|
115
|
+
:type => 'applications',
|
116
|
+
:data => [{
|
117
|
+
:domain_id => domain_name,
|
118
|
+
:id => 1,
|
119
|
+
:name => name,
|
120
|
+
:app_url => "http://#{name}-#{domain_name}.rhcloud.com",
|
121
|
+
:links => mock_response_links([
|
122
|
+
]),
|
123
|
+
}],
|
124
|
+
}.to_json
|
125
|
+
})
|
126
|
+
end
|
127
|
+
def stub_simple_carts
|
128
|
+
stub_api_request(:get, 'broker/rest/cartridges', mock_user_auth).to_return(simple_carts)
|
129
|
+
end
|
130
|
+
|
131
|
+
def define_exceptional_test_on_wizard
|
132
|
+
RHC::Wizard.module_eval <<-EOM
|
133
|
+
private
|
134
|
+
def test_and_raise
|
135
|
+
raise
|
136
|
+
end
|
137
|
+
EOM
|
138
|
+
end
|
139
|
+
|
140
|
+
def no_keys
|
141
|
+
empty_response_list('keys')
|
142
|
+
end
|
143
|
+
def no_domains
|
144
|
+
empty_response_list('domains')
|
145
|
+
end
|
146
|
+
|
147
|
+
def empty_response_list(type)
|
148
|
+
{
|
149
|
+
:body => {
|
150
|
+
:type => type,
|
151
|
+
:data => [],
|
152
|
+
}.to_json
|
153
|
+
}
|
154
|
+
end
|
155
|
+
|
156
|
+
def new_domain(name)
|
157
|
+
{
|
158
|
+
:status => 201,
|
159
|
+
:body => {
|
160
|
+
:type => 'domain',
|
161
|
+
:data => {
|
162
|
+
:id => name,
|
163
|
+
:links => mock_response_links([
|
164
|
+
])
|
165
|
+
},
|
166
|
+
}.to_json
|
167
|
+
}
|
168
|
+
end
|
169
|
+
def simple_carts
|
170
|
+
{
|
171
|
+
:body => {
|
172
|
+
:type => 'cartridges',
|
173
|
+
:data => [
|
174
|
+
{:name => 'mock_standalone_cart-1', :type => 'standalone', :tags => ['cartridge'], :display_name => 'Mock1 Cart'},
|
175
|
+
{:name => 'mock_standalone_cart-2', :type => 'standalone', :description => 'Mock2 description'},
|
176
|
+
{:name => 'mock_embedded_cart-1', :type => 'embedded', :tags => ['scheduled'], :display_name => 'Mock1 Embedded Cart'},
|
177
|
+
],
|
178
|
+
}.to_json
|
179
|
+
}
|
180
|
+
end
|
181
|
+
def simple_user(login)
|
182
|
+
{
|
183
|
+
:body => {
|
184
|
+
:type => 'user',
|
185
|
+
:data => {
|
186
|
+
:login => login,
|
187
|
+
:plan_id => respond_to?(:user_plan_id) ? self.user_plan_id : nil,
|
188
|
+
:consumed_gears => respond_to?(:user_consumed_gears) ? self.user_consumed_gears : 0,
|
189
|
+
:max_gears => respond_to?(:user_max_gears) ? self.user_max_gears : 3,
|
190
|
+
:capabilities => respond_to?(:user_capabilities) ? self.user_capabilities : {:gear_sizes => ['small', 'medium']},
|
191
|
+
:links => mock_response_links([
|
192
|
+
['ADD_KEY', "broker/rest/user/keys", 'POST'],
|
193
|
+
['LIST_KEYS', "broker/rest/user/keys", 'GET'],
|
194
|
+
])
|
195
|
+
},
|
196
|
+
}.to_json
|
197
|
+
}
|
198
|
+
end
|
199
|
+
|
200
|
+
def mock_pass
|
201
|
+
"test pass"
|
202
|
+
end
|
203
|
+
|
204
|
+
def mock_uri
|
205
|
+
"test.domain.com"
|
206
|
+
end
|
207
|
+
|
208
|
+
# Creates consistent hrefs for testing
|
209
|
+
def mock_href(relative="", with_auth=false)
|
210
|
+
server = respond_to?(:server) ? self.server : mock_uri
|
211
|
+
uri_string =
|
212
|
+
if with_auth == true
|
213
|
+
username = respond_to?(:username) ? self.username : mock_user
|
214
|
+
password = respond_to?(:password) ? self.password : mock_pass
|
215
|
+
"#{username}:#{password}@#{mock_uri}"
|
216
|
+
elsif with_auth
|
217
|
+
"#{with_auth[:user]}:#{with_auth[:password]}@#{server}"
|
218
|
+
else
|
219
|
+
server
|
220
|
+
end
|
221
|
+
"https://#{uri_string}/#{relative}"
|
222
|
+
end
|
223
|
+
|
224
|
+
# This formats link lists for JSONification
|
225
|
+
def mock_response_links(links)
|
226
|
+
link_set = {}
|
227
|
+
links.each do |link|
|
228
|
+
operation = link[0]
|
229
|
+
href = link[1]
|
230
|
+
method = link[2]
|
231
|
+
# Note that the 'relative' key/value pair below is a convenience for testing;
|
232
|
+
# this is not used by the API classes.
|
233
|
+
link_set[operation] = { 'href' => mock_href(href), 'method' => method, 'relative' => href }
|
234
|
+
end
|
235
|
+
return link_set
|
236
|
+
end
|
237
|
+
|
238
|
+
def mock_app_links(domain_id='test_domain',app_id='test_app')
|
239
|
+
[['ADD_CARTRIDGE', "domains/#{domain_id}/apps/#{app_id}/carts/add", 'post'],
|
240
|
+
['LIST_CARTRIDGES', "domains/#{domain_id}/apps/#{app_id}/carts/", 'get' ],
|
241
|
+
['GET_GEAR_GROUPS', "domains/#{domain_id}/apps/#{app_id}/gear_groups", 'get' ],
|
242
|
+
['START', "domains/#{domain_id}/apps/#{app_id}/start", 'post'],
|
243
|
+
['STOP', "domains/#{domain_id}/apps/#{app_id}/stop", 'post'],
|
244
|
+
['RESTART', "domains/#{domain_id}/apps/#{app_id}/restart", 'post'],
|
245
|
+
['THREAD_DUMP', "domains/#{domain_id}/apps/#{app_id}/event", 'post'],
|
246
|
+
['ADD_ALIAS', "domains/#{domain_id}/apps/#{app_id}/event", 'post'],
|
247
|
+
['REMOVE_ALIAS', "domains/#{domain_id}/apps/#{app_id}/event", 'post'],
|
248
|
+
['DELETE', "domains/#{domain_id}/apps/#{app_id}/delete", 'post']]
|
249
|
+
end
|
250
|
+
|
251
|
+
def mock_cart_links(domain_id='test_domain',app_id='test_app',cart_id='test_cart')
|
252
|
+
[['START', "domains/#{domain_id}/apps/#{app_id}/carts/#{cart_id}/start", 'post'],
|
253
|
+
['STOP', "domains/#{domain_id}/apps/#{app_id}/carts/#{cart_id}/stop", 'post'],
|
254
|
+
['RESTART', "domains/#{domain_id}/apps/#{app_id}/carts/#{cart_id}/restart", 'post'],
|
255
|
+
['DELETE', "domains/#{domain_id}/apps/#{app_id}/carts/#{cart_id}/delete", 'post']]
|
256
|
+
end
|
257
|
+
|
258
|
+
def mock_client_links
|
259
|
+
[['GET_USER', 'user/', 'get' ],
|
260
|
+
['ADD_DOMAIN', 'domains/add', 'post'],
|
261
|
+
['LIST_DOMAINS', 'domains/', 'get' ],
|
262
|
+
['LIST_CARTRIDGES', 'cartridges/', 'get' ]]
|
263
|
+
end
|
264
|
+
def mock_real_client_links
|
265
|
+
[['GET_USER', "broker/rest/user", 'GET'],
|
266
|
+
['LIST_DOMAINS', "broker/rest/domains", 'GET'],
|
267
|
+
['ADD_DOMAIN', "broker/rest/domains", 'POST'],
|
268
|
+
['LIST_CARTRIDGES', "broker/rest/cartridges", 'GET'],
|
269
|
+
]
|
270
|
+
end
|
271
|
+
|
272
|
+
def mock_domain_links(domain_id='test_domain')
|
273
|
+
[['ADD_APPLICATION', "domains/#{domain_id}/apps/add", 'post'],
|
274
|
+
['LIST_APPLICATIONS', "domains/#{domain_id}/apps/", 'get' ],
|
275
|
+
['UPDATE', "domains/#{domain_id}/update", 'post'],
|
276
|
+
['DELETE', "domains/#{domain_id}/delete", 'post']]
|
277
|
+
end
|
278
|
+
|
279
|
+
def mock_key_links(key_id='test_key')
|
280
|
+
[['UPDATE', "user/keys/#{key_id}/update", 'post'],
|
281
|
+
['DELETE', "user/keys/#{key_id}/delete", 'post']]
|
282
|
+
end
|
283
|
+
|
284
|
+
def mock_user_links
|
285
|
+
[['ADD_KEY', 'user/keys/add', 'post'],
|
286
|
+
['LIST_KEYS', 'user/keys/', 'get' ]]
|
287
|
+
end
|
288
|
+
|
289
|
+
def mock_cartridge_response(cart_count=1)
|
290
|
+
carts = []
|
291
|
+
while carts.length < cart_count
|
292
|
+
carts << {
|
293
|
+
:name => "mock_cart_#{carts.length}",
|
294
|
+
:type => "mock_cart_#{carts.length}_type",
|
295
|
+
:links => mock_response_links(mock_cart_links('mock_domain','mock_app',"mock_cart_#{carts.length}"))
|
296
|
+
}
|
297
|
+
end
|
298
|
+
|
299
|
+
carts = carts[0] if cart_count == 1
|
300
|
+
type = cart_count == 1 ? 'cartridge' : 'cartridges'
|
301
|
+
|
302
|
+
return {
|
303
|
+
:body => {
|
304
|
+
:type => type,
|
305
|
+
:data => carts
|
306
|
+
}.to_json,
|
307
|
+
:status => 200
|
308
|
+
}
|
309
|
+
end
|
310
|
+
|
311
|
+
def mock_gear_groups_response()
|
312
|
+
groups = [{}]
|
313
|
+
type = 'gear_groups'
|
314
|
+
|
315
|
+
return {
|
316
|
+
:body => {
|
317
|
+
:type => type,
|
318
|
+
:data => groups
|
319
|
+
}.to_json,
|
320
|
+
:status => 200
|
321
|
+
}
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
class MockRestClient < RHC::Rest::Client
|
326
|
+
include Helpers
|
327
|
+
|
328
|
+
def initialize(config=RHC::Config)
|
329
|
+
obj = self
|
330
|
+
if RHC::Rest::Client.respond_to?(:stub)
|
331
|
+
RHC::Rest::Client.stub(:new) { obj }
|
332
|
+
else
|
333
|
+
RHC::Rest::Client.instance_eval do
|
334
|
+
@obj = obj
|
335
|
+
def new(*args)
|
336
|
+
@obj
|
337
|
+
end
|
338
|
+
end
|
339
|
+
end
|
340
|
+
@domains = []
|
341
|
+
@user = MockRestUser.new(client, config.username)
|
342
|
+
@api = MockRestApi.new(client, config)
|
343
|
+
end
|
344
|
+
|
345
|
+
def api
|
346
|
+
@api
|
347
|
+
end
|
348
|
+
|
349
|
+
def user
|
350
|
+
@user
|
351
|
+
end
|
352
|
+
|
353
|
+
def domains
|
354
|
+
@domains
|
355
|
+
end
|
356
|
+
|
357
|
+
def cartridges
|
358
|
+
[MockRestCartridge.new(self, "mock_cart-1", "embedded"), # code should sort this to be after standalone
|
359
|
+
MockRestCartridge.new(self, "mock_standalone_cart-1", "standalone"),
|
360
|
+
MockRestCartridge.new(self, "mock_standalone_cart-2", "standalone"),
|
361
|
+
MockRestCartridge.new(self, "mock_unique_standalone_cart-1", "standalone"),
|
362
|
+
MockRestCartridge.new(self, "jenkins-1.4", "standalone"),
|
363
|
+
MockRestCartridge.new(self, "mock_cart-2", "embedded"),
|
364
|
+
MockRestCartridge.new(self, "unique_mock_cart-1", "embedded"),
|
365
|
+
MockRestCartridge.new(self, "jenkins-client-1.4", "embedded")]
|
366
|
+
end
|
367
|
+
|
368
|
+
def add_domain(id)
|
369
|
+
d = MockRestDomain.new(self, id)
|
370
|
+
@domains << d
|
371
|
+
d
|
372
|
+
end
|
373
|
+
|
374
|
+
def sshkeys
|
375
|
+
@user.keys
|
376
|
+
end
|
377
|
+
|
378
|
+
def add_key(name, type, content)
|
379
|
+
@user.add_key(name, type, content)
|
380
|
+
end
|
381
|
+
|
382
|
+
def delete_key(name)
|
383
|
+
@user.keys.delete_if { |key| key.name == name }
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
class MockRestApi < RHC::Rest::Api
|
388
|
+
include Helpers
|
389
|
+
|
390
|
+
def initialize(client, config)
|
391
|
+
@client = client
|
392
|
+
@client_api_versions = RHC::Rest::Client::CLIENT_API_VERSIONS
|
393
|
+
@server_api_versions = @client_api_versions
|
394
|
+
self.attributes = {:links => mock_response_links(mock_client_links)}
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
class MockRestUser < RHC::Rest::User
|
399
|
+
include Helpers
|
400
|
+
def initialize(client, login)
|
401
|
+
super({}, client)
|
402
|
+
@login = login
|
403
|
+
@keys = [
|
404
|
+
MockRestKey.new(client, 'mockkey1', 'ssh-rsa', 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDNK8xT3O+kSltmCMsSqBfAgheB3YFJ9Y0ESJnFjFASVxH70AcCQAgdQSD/r31+atYShJdP7f0AMWiQUTw2tK434XSylnZWEyIR0V+j+cyOPdVQlns6D5gPOnOtweFF0o18YulwCOK8Q1H28GK8qyWhLe0FcMmxtKbbQgaVRvQdXZz4ThzutCJOyJm9xVb93+fatvwZW76oLLvfFJcJSOK2sgW7tJM2A83bm4mwixFDF7wO/+C9WA+PgPKJUIjvy1gZjBhRB+3b58vLOnYhPOgMNruJwzB+wJ3pg8tLJEjxSbHyyoi6OqMBs4BVV7LdzvwTDxEjcgtHVvaVNXgO5iRX'),
|
405
|
+
MockRestKey.new(client, 'mockkey2', 'ssh-dsa', 'AAAAB3NzaC1kc3MAAACBAPaaFj6Xjrjd8Dc4AAkJe0HigqaXMxj/87xHoV+nPgerHIceJWhPUWdW40lSASrgpAV9Eq4zzD+L19kgYdbMw0vSX5Cj3XtNOsow9MmMxFsYjTxCv4eSs/rLdGPaYZ5GVRPDu8tN42Bm8lj5o+ky3HzwW+mkQMZwcADQIgqtn6QhAAAAFQCirDfIMf/JoMOFf8CTnsTKWw/0zwAAAIAIQp6t2sLIp1d2TBfd/qLjOJA10rPADcnhBzWB/cd/oFJ8a/2nmxeSPR5Ov18T6itWqbKwvZw2UC0MrXoYbgcfVNP/ym1bCd9rB5hu1sg8WO4JIxA/47PZooT6PwTKVxHuENEzQyJL2o6ZJq+wuV0taLvm6IaM5TAZuEJ2p4TC/gAAAIBpLcVXZREa7XLY55nyidt/+UC+PxpjhPHOHbzL1OvWEaumN4wcJk/JZPppgXX9+WDkTm1SD891U0cXnGMTP0OZOHkOUHF2ZcfUe7p9kX4WjHs0OccoxV0Lny6MC4DjalJyaaEbijJHSUX3QlLcBOlPHJWpEpvWQ9P8AN4PokiGzA==')
|
406
|
+
]
|
407
|
+
end
|
408
|
+
|
409
|
+
def keys
|
410
|
+
@keys
|
411
|
+
end
|
412
|
+
|
413
|
+
def add_key(name, type, content)
|
414
|
+
@keys << MockRestKey.new(client, name, type, content)
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
class MockRestDomain < RHC::Rest::Domain
|
419
|
+
include Helpers
|
420
|
+
def initialize(client, id)
|
421
|
+
super({}, client)
|
422
|
+
@id = id
|
423
|
+
@applications = []
|
424
|
+
self.attributes = {:links => mock_response_links(mock_domain_links('mock_domain_0'))}
|
425
|
+
end
|
426
|
+
|
427
|
+
def update(id)
|
428
|
+
@id = id
|
429
|
+
self
|
430
|
+
end
|
431
|
+
|
432
|
+
def destroy
|
433
|
+
raise RHC::Rest::ClientErrorException.new("Applications must be empty.") unless @applications.empty?
|
434
|
+
client.domains.delete_if { |d| d.id == @id }
|
435
|
+
|
436
|
+
@applications = nil
|
437
|
+
end
|
438
|
+
|
439
|
+
def add_application(name, type=nil, scale=nil, gear_profile='default', git_url=nil)
|
440
|
+
if type.is_a?(Hash)
|
441
|
+
scale = type[:scale]
|
442
|
+
gear_profile = type[:gear_profile]
|
443
|
+
git_url = type[:initial_git_url]
|
444
|
+
type = Array(type[:cartridges] || type[:cartridge])
|
445
|
+
end
|
446
|
+
a = MockRestApplication.new(client, name, type, self, scale, gear_profile, git_url)
|
447
|
+
builder = @applications.find{ |app| app.cartridges.map(&:name).any?{ |s| s =~ /^jenkins-[\d\.]+$/ } }
|
448
|
+
a.building_app = builder.name if builder
|
449
|
+
@applications << a
|
450
|
+
a.add_message("Success")
|
451
|
+
a
|
452
|
+
end
|
453
|
+
|
454
|
+
def applications(*args)
|
455
|
+
@applications
|
456
|
+
end
|
457
|
+
end
|
458
|
+
|
459
|
+
class MockRestGearGroup < RHC::Rest::GearGroup
|
460
|
+
include Helpers
|
461
|
+
def initialize(client=nil)
|
462
|
+
super({}, client)
|
463
|
+
@cartridges = [{'name' => 'fake_geargroup_cart-0.1'}]
|
464
|
+
@gears = [{'state' => 'started', 'id' => 'fakegearid'}]
|
465
|
+
end
|
466
|
+
end
|
467
|
+
|
468
|
+
class MockRestApplication < RHC::Rest::Application
|
469
|
+
include Helpers
|
470
|
+
def fakeuuid
|
471
|
+
"fakeuuidfortests#{@name}"
|
472
|
+
end
|
473
|
+
|
474
|
+
def initialize(client, name, type, domain, scale=nil, gear_profile='default', initial_git_url=nil)
|
475
|
+
super({}, client)
|
476
|
+
@name = name
|
477
|
+
@domain = domain
|
478
|
+
@cartridges = []
|
479
|
+
@creation_time = Date.new(2000, 1, 1).strftime('%Y-%m-%dT%H:%M:%S%z')
|
480
|
+
@uuid = fakeuuid
|
481
|
+
@initial_git_url = initial_git_url
|
482
|
+
@git_url = "git:fake.foo/git/#{@name}.git"
|
483
|
+
@app_url = "https://#{@name}-#{@domain.id}.fake.foo/"
|
484
|
+
@ssh_url = "ssh://#{@uuid}@127.0.0.1"
|
485
|
+
@aliases = []
|
486
|
+
@gear_profile = gear_profile
|
487
|
+
if scale
|
488
|
+
@scalable = true
|
489
|
+
end
|
490
|
+
self.attributes = {:links => mock_response_links(mock_app_links('mock_domain_0', 'mock_app_0')), :messages => []}
|
491
|
+
self.gear_count = 5
|
492
|
+
types = Array(type)
|
493
|
+
cart = add_cartridge(types.first, false) if types.first
|
494
|
+
if scale
|
495
|
+
cart.supported_scales_to = (cart.scales_to = -1)
|
496
|
+
cart.supported_scales_from = (cart.scales_from = 2)
|
497
|
+
cart.current_scale = 2
|
498
|
+
cart.scales_with = "haproxy-1.4"
|
499
|
+
prox = add_cartridge('haproxy-1.4')
|
500
|
+
prox.collocated_with = [types.first]
|
501
|
+
end
|
502
|
+
types.drop(1).each{ |c| add_cartridge(c, false) }
|
503
|
+
@framework = types.first
|
504
|
+
end
|
505
|
+
|
506
|
+
def destroy
|
507
|
+
@domain.applications.delete self
|
508
|
+
end
|
509
|
+
|
510
|
+
def add_cartridge(name, embedded=true)
|
511
|
+
type = embedded ? "embedded" : "standalone"
|
512
|
+
c = MockRestCartridge.new(client, name, type, self)
|
513
|
+
c.properties << {'name' => 'prop1', 'value' => 'value1', 'description' => 'description1' }
|
514
|
+
@cartridges << c
|
515
|
+
c.messages << "Cartridge added with properties"
|
516
|
+
c
|
517
|
+
end
|
518
|
+
|
519
|
+
def gear_groups
|
520
|
+
# we don't have heavy interaction with gear groups yet so keep this simple
|
521
|
+
@gear_groups ||= [MockRestGearGroup.new(client)]
|
522
|
+
end
|
523
|
+
|
524
|
+
def cartridges
|
525
|
+
@cartridges
|
526
|
+
end
|
527
|
+
|
528
|
+
def start
|
529
|
+
@app
|
530
|
+
end
|
531
|
+
|
532
|
+
def stop(*args)
|
533
|
+
@app
|
534
|
+
end
|
535
|
+
|
536
|
+
def restart
|
537
|
+
@app
|
538
|
+
end
|
539
|
+
|
540
|
+
def reload
|
541
|
+
@app
|
542
|
+
end
|
543
|
+
|
544
|
+
def tidy
|
545
|
+
@app
|
546
|
+
end
|
547
|
+
end
|
548
|
+
|
549
|
+
class MockRestCartridge < RHC::Rest::Cartridge
|
550
|
+
include Helpers
|
551
|
+
def initialize(client, name, type, app=nil, properties=[{'type' => 'cart_data', 'name' => 'connection_url', 'value' => "http://fake.url" }])
|
552
|
+
super({}, client)
|
553
|
+
@name = name
|
554
|
+
@type = type
|
555
|
+
@app = app
|
556
|
+
@properties = properties.each(&:stringify_keys!)
|
557
|
+
@status_messages = [{"message" => "started", "gear_id" => "123"}]
|
558
|
+
@scales_from = 1
|
559
|
+
@scales_to = 1
|
560
|
+
@current_scale = 1
|
561
|
+
@gear_profile = 'small'
|
562
|
+
end
|
563
|
+
|
564
|
+
def destroy
|
565
|
+
@app.cartridges.delete self
|
566
|
+
end
|
567
|
+
|
568
|
+
def status
|
569
|
+
@status_messages
|
570
|
+
end
|
571
|
+
|
572
|
+
def start
|
573
|
+
@status_messages = [{"message" => "started", "gear_id" => "123"}]
|
574
|
+
@app
|
575
|
+
end
|
576
|
+
|
577
|
+
def stop
|
578
|
+
@status_messages = [{"message" => "stopped", "gear_id" => "123"}]
|
579
|
+
@app
|
580
|
+
end
|
581
|
+
|
582
|
+
def restart
|
583
|
+
@status_messages = [{"message" => "started", "gear_id" => "123"}]
|
584
|
+
@app
|
585
|
+
end
|
586
|
+
|
587
|
+
def reload
|
588
|
+
@app
|
589
|
+
end
|
590
|
+
|
591
|
+
def set_scales(values)
|
592
|
+
values.delete_if{|k,v| v.nil? }
|
593
|
+
@scales_from = values[:scales_from] if values[:scales_from]
|
594
|
+
@scales_to = values[:scales_to] if values[:scales_to]
|
595
|
+
self
|
596
|
+
end
|
597
|
+
end
|
598
|
+
|
599
|
+
class MockRestKey < RHC::Rest::Key
|
600
|
+
include Helpers
|
601
|
+
def initialize(client, name, type, content)
|
602
|
+
super({}, client)
|
603
|
+
@name = name
|
604
|
+
@type = type
|
605
|
+
@content = content
|
606
|
+
end
|
607
|
+
end
|
608
|
+
end
|
609
|
+
|