openshift-origin-controller 1.3.2

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.
Files changed (180) hide show
  1. data/COPYRIGHT +1 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +12 -0
  4. data/README.md +3 -0
  5. data/Rakefile +9 -0
  6. data/app/controllers/app_events_controller.rb +115 -0
  7. data/app/controllers/application_templates_controller.rb +19 -0
  8. data/app/controllers/applications_controller.rb +214 -0
  9. data/app/controllers/base_controller.rb +367 -0
  10. data/app/controllers/cartridges_controller.rb +48 -0
  11. data/app/controllers/descriptors_controller.rb +23 -0
  12. data/app/controllers/dns_resolvable_controller.rb +35 -0
  13. data/app/controllers/domains_controller.rb +156 -0
  14. data/app/controllers/emb_cart_controller.rb +276 -0
  15. data/app/controllers/emb_cart_events_controller.rb +52 -0
  16. data/app/controllers/environment_controller.rb +11 -0
  17. data/app/controllers/estimates_controller.rb +71 -0
  18. data/app/controllers/gear_groups_controller.rb +53 -0
  19. data/app/controllers/gears_controller.rb +70 -0
  20. data/app/controllers/keys_controller.rb +96 -0
  21. data/app/controllers/legacy_broker_controller.rb +510 -0
  22. data/app/controllers/quickstarts_controller.rb +29 -0
  23. data/app/controllers/user_controller.rb +38 -0
  24. data/app/helpers/cartridge_helper.rb +25 -0
  25. data/app/helpers/legacy_broker_helper.rb +21 -0
  26. data/app/helpers/user_action_logger.rb +38 -0
  27. data/app/models/application.rb +1718 -0
  28. data/app/models/application_template.rb +27 -0
  29. data/app/models/cartridge_cache.rb +51 -0
  30. data/app/models/cloud_user.rb +334 -0
  31. data/app/models/component_instance.rb +228 -0
  32. data/app/models/connection_endpoint.rb +10 -0
  33. data/app/models/district.rb +210 -0
  34. data/app/models/domain.rb +234 -0
  35. data/app/models/gear.rb +376 -0
  36. data/app/models/group_instance.rb +306 -0
  37. data/app/models/key.rb +20 -0
  38. data/app/models/legacy_reply.rb +15 -0
  39. data/app/models/legacy_request.rb +126 -0
  40. data/app/models/link.rb +11 -0
  41. data/app/models/message.rb +10 -0
  42. data/app/models/name_server_cache.rb +46 -0
  43. data/app/models/optional_param.rb +12 -0
  44. data/app/models/param.rb +13 -0
  45. data/app/models/remote_job.rb +57 -0
  46. data/app/models/rest_application.rb +126 -0
  47. data/app/models/rest_application10.rb +106 -0
  48. data/app/models/rest_application12.rb +124 -0
  49. data/app/models/rest_application_estimate.rb +12 -0
  50. data/app/models/rest_application_template.rb +20 -0
  51. data/app/models/rest_cartridge10.rb +41 -0
  52. data/app/models/rest_cartridge11.rb +151 -0
  53. data/app/models/rest_domain.rb +43 -0
  54. data/app/models/rest_domain10.rb +42 -0
  55. data/app/models/rest_estimates.rb +16 -0
  56. data/app/models/rest_gear.rb +14 -0
  57. data/app/models/rest_gear_group.rb +26 -0
  58. data/app/models/rest_key.rb +24 -0
  59. data/app/models/rest_reply.rb +31 -0
  60. data/app/models/rest_user.rb +43 -0
  61. data/app/models/result_io.rb +67 -0
  62. data/app/models/usage_record.rb +37 -0
  63. data/app/models/validators/app_validator.rb +30 -0
  64. data/app/models/validators/key_validator.rb +30 -0
  65. data/app/models/validators/namespace_validator.rb +18 -0
  66. data/config/routes.rb +36 -0
  67. data/lib/controller_engine.rb +7 -0
  68. data/lib/openshift-origin-controller.rb +14 -0
  69. data/lib/openshift/application_container_proxy.rb +241 -0
  70. data/lib/openshift/auth_service.rb +101 -0
  71. data/lib/openshift/data_store.rb +33 -0
  72. data/lib/openshift/dns_service.rb +41 -0
  73. data/lib/openshift/mongo_data_store.rb +671 -0
  74. data/openshift-origin-controller.gemspec +42 -0
  75. data/rubygem-openshift-origin-controller.spec +274 -0
  76. data/test/cucumber/application-estimate.feature +25 -0
  77. data/test/cucumber/cartridge-10gen-mms-agent.feature +28 -0
  78. data/test/cucumber/cartridge-cron.feature +32 -0
  79. data/test/cucumber/cartridge-haproxy.feature +31 -0
  80. data/test/cucumber/cartridge-jenkins-build.feature +12 -0
  81. data/test/cucumber/cartridge-jenkins-client.feature +10 -0
  82. data/test/cucumber/cartridge-lifecycle-diy.feature +21 -0
  83. data/test/cucumber/cartridge-lifecycle-jbossas.feature +61 -0
  84. data/test/cucumber/cartridge-lifecycle-jbosseap.feature +61 -0
  85. data/test/cucumber/cartridge-lifecycle-jbossews10.feature +61 -0
  86. data/test/cucumber/cartridge-lifecycle-jenkins.feature +41 -0
  87. data/test/cucumber/cartridge-lifecycle-nodejs.feature +59 -0
  88. data/test/cucumber/cartridge-lifecycle-perl.feature +40 -0
  89. data/test/cucumber/cartridge-lifecycle-php.feature +106 -0
  90. data/test/cucumber/cartridge-lifecycle-python.feature +40 -0
  91. data/test/cucumber/cartridge-lifecycle-ruby18.feature +49 -0
  92. data/test/cucumber/cartridge-lifecycle-ruby19.feature +41 -0
  93. data/test/cucumber/cartridge-mongodb.feature +31 -0
  94. data/test/cucumber/cartridge-mysql.feature +30 -0
  95. data/test/cucumber/cartridge-php.feature +14 -0
  96. data/test/cucumber/cartridge-phpmyadmin.feature +32 -0
  97. data/test/cucumber/cartridge-postgresql.feature +32 -0
  98. data/test/cucumber/cartridge-runtime-extended-db.feature +64 -0
  99. data/test/cucumber/cartridge-runtime-extended-jboss.feature +24 -0
  100. data/test/cucumber/cartridge-runtime-extended-nodejs.feature +21 -0
  101. data/test/cucumber/cartridge-runtime-extended-perl.feature +18 -0
  102. data/test/cucumber/cartridge-runtime-extended-php.feature +19 -0
  103. data/test/cucumber/cartridge-runtime-extended-python.feature +18 -0
  104. data/test/cucumber/cartridge-runtime-extended-ruby.feature +22 -0
  105. data/test/cucumber/cartridge-runtime-standard-diy.feature +6 -0
  106. data/test/cucumber/cartridge-runtime-standard-jbossas.feature +7 -0
  107. data/test/cucumber/cartridge-runtime-standard-jbosseap.feature +7 -0
  108. data/test/cucumber/cartridge-runtime-standard-jbossews10.feature +7 -0
  109. data/test/cucumber/cartridge-runtime-standard-jenkins.feature +8 -0
  110. data/test/cucumber/cartridge-runtime-standard-nodejs.feature +7 -0
  111. data/test/cucumber/cartridge-runtime-standard-perl.feature +6 -0
  112. data/test/cucumber/cartridge-runtime-standard-php.feature +6 -0
  113. data/test/cucumber/cartridge-runtime-standard-python.feature +6 -0
  114. data/test/cucumber/cartridge-runtime-standard-ruby.feature +19 -0
  115. data/test/cucumber/cartridge-switchyard.feature +36 -0
  116. data/test/cucumber/descriptor.feature +40 -0
  117. data/test/cucumber/embedded.feature +44 -0
  118. data/test/cucumber/idler.feature +75 -0
  119. data/test/cucumber/misc/descriptor/manifest.yml +22 -0
  120. data/test/cucumber/misc/php/db_test.php +21 -0
  121. data/test/cucumber/openshift-node.feature +21 -0
  122. data/test/cucumber/rest-application-templates.feature +31 -0
  123. data/test/cucumber/rest-applications.feature +431 -0
  124. data/test/cucumber/rest-cartridge-types.feature +16 -0
  125. data/test/cucumber/rest-domains.feature +276 -0
  126. data/test/cucumber/rest-gears.feature +38 -0
  127. data/test/cucumber/rest-keys.feature +247 -0
  128. data/test/cucumber/rest-quickstarts.feature +27 -0
  129. data/test/cucumber/rest-workflow.feature +64 -0
  130. data/test/cucumber/step_definitions/api_steps.rb +369 -0
  131. data/test/cucumber/step_definitions/application-estimate-steps.rb +51 -0
  132. data/test/cucumber/step_definitions/application_steps.rb +215 -0
  133. data/test/cucumber/step_definitions/cartridge-10gen-mms-agent_steps.rb +11 -0
  134. data/test/cucumber/step_definitions/cartridge-cron_steps.rb +51 -0
  135. data/test/cucumber/step_definitions/cartridge-haproxy_steps.rb +30 -0
  136. data/test/cucumber/step_definitions/cartridge-jenkins_steps.rb +93 -0
  137. data/test/cucumber/step_definitions/cartridge-lifecycle-nodejs_steps.rb +30 -0
  138. data/test/cucumber/step_definitions/cartridge-mongodb_steps.rb +60 -0
  139. data/test/cucumber/step_definitions/cartridge-mysql_steps.rb +56 -0
  140. data/test/cucumber/step_definitions/cartridge-php_steps.rb +72 -0
  141. data/test/cucumber/step_definitions/cartridge-postgresql_steps.rb +59 -0
  142. data/test/cucumber/step_definitions/cartridge-switchyard_steps.rb +29 -0
  143. data/test/cucumber/step_definitions/client_steps.rb +12 -0
  144. data/test/cucumber/step_definitions/descriptor_step.rb +32 -0
  145. data/test/cucumber/step_definitions/idler_steps.rb +37 -0
  146. data/test/cucumber/step_definitions/node_steps.rb +203 -0
  147. data/test/cucumber/step_definitions/runtime_steps.rb +547 -0
  148. data/test/cucumber/step_definitions/runtime_url_steps.rb +46 -0
  149. data/test/cucumber/step_definitions/trap-user-extended_steps.rb +14 -0
  150. data/test/cucumber/step_definitions/trap-user_steps.rb +58 -0
  151. data/test/cucumber/support/00_setup_helper.rb +106 -0
  152. data/test/cucumber/support/app_helper.rb +243 -0
  153. data/test/cucumber/support/assertions.rb +52 -0
  154. data/test/cucumber/support/command_helper.rb +453 -0
  155. data/test/cucumber/support/dns_helper.rb +54 -0
  156. data/test/cucumber/support/env.rb +5 -0
  157. data/test/cucumber/support/process_helper.rb +44 -0
  158. data/test/cucumber/support/runtime_support.rb +440 -0
  159. data/test/cucumber/support/unused.rb +27 -0
  160. data/test/cucumber/support/user_helper.rb +37 -0
  161. data/test/cucumber/trap-user-extended.feature +53 -0
  162. data/test/cucumber/trap-user.feature +34 -0
  163. data/test/ddns/1.168.192-rev.db.init +13 -0
  164. data/test/ddns/HOWTO.txt +207 -0
  165. data/test/ddns/Kexample.com.+157+06142.key +1 -0
  166. data/test/ddns/Kexample.com.+157+06142.private +7 -0
  167. data/test/ddns/authconfig.rb +14 -0
  168. data/test/ddns/example.com.db.init +23 -0
  169. data/test/ddns/example.com.key +4 -0
  170. data/test/ddns/named.ca +52 -0
  171. data/test/ddns/named.conf +48 -0
  172. data/test/ddns/named.empty +10 -0
  173. data/test/ddns/named.localhost +10 -0
  174. data/test/ddns/named.loopback +11 -0
  175. data/test/ddns/named.rfc1912.zones +42 -0
  176. data/test/ddns/named.root.key +5 -0
  177. data/test/ddns/named_service.rb +127 -0
  178. data/test/unit/bind_dns_service_test.rb +167 -0
  179. data/test/unit/broker_auth_test.rb +28 -0
  180. metadata +545 -0
@@ -0,0 +1,547 @@
1
+ # Support steps for runtime-centric tests.
2
+ #
3
+ # IMPORTANT: The steps defined here are for basic sanity checks of a
4
+ # SINGLE application with a SINGLE gear and cartridge, and all work
5
+ # in the context of these assumptions. If your test needs more complex
6
+ # setups, write some more steps which are more flexible.
7
+
8
+ require 'fileutils'
9
+
10
+ # These are provided to reduce duplication of code in feature files.
11
+ # Scenario Outlines are not used as they interfer with the devenv retry logic (whole feature is retried no example line)
12
+ Given /^a new ([^ ]+) application, verify it using ([^ ]+)$/ do |cart_name, proc_name|
13
+ steps %Q{
14
+ Given a new #{cart_name} type application
15
+ Then the application http proxy file will exist
16
+ And a #{proc_name} process will be running
17
+ And the application git repo will exist
18
+ And the application source tree will exist
19
+ And the application log files will exist
20
+ When I stop the application
21
+ Then a #{proc_name} process will not be running
22
+ When I start the application
23
+ Then a #{proc_name} process will be running
24
+ When I status the application
25
+ Then a #{proc_name} process will be running
26
+ When I restart the application
27
+ Then a #{proc_name} process will be running
28
+ When I destroy the application
29
+ Then the application http proxy file will not exist
30
+ And a #{proc_name} process will not be running
31
+ And the application git repo will not exist
32
+ And the application source tree will not exist
33
+ }
34
+ end
35
+
36
+ Given /^a new ([^ ]+) application, verify create and delete using ([^ ]+)$/ do |cart_name, proc_name|
37
+ steps %Q{
38
+ Given a new #{cart_name} type application
39
+ Then the application http proxy file will exist
40
+ And a #{proc_name} process will be running
41
+ And the application git repo will exist
42
+ And the application source tree will exist
43
+ And the application log files will exist
44
+ When I destroy the application
45
+ Then the application http proxy file will not exist
46
+ And a #{proc_name} process will not be running
47
+ And the application git repo will not exist
48
+ And the application source tree will not exist
49
+ }
50
+ end
51
+
52
+ Given /^a new ([^ ]+) application, verify start, stop, restart using ([^ ]+)$/ do |cart_name, proc_name|
53
+ steps %Q{
54
+ Given a new #{cart_name} type application
55
+ Then a #{proc_name} process will be running
56
+ When I stop the application
57
+ Then a #{proc_name} process will not be running
58
+ When I start the application
59
+ Then a #{proc_name} process will be running
60
+ When I status the application
61
+ Then a #{proc_name} process will be running
62
+ When I restart the application
63
+ Then a #{proc_name} process will be running
64
+ When I destroy the application
65
+ Then the application http proxy file will not exist
66
+ And a #{proc_name} process will not be running
67
+ }
68
+ end
69
+
70
+ # Creates a new account, application, gear, and cartridge in one shot.
71
+ # The cartridge is then configured. After running this step, subsequent
72
+ # steps will have access to three pieces of state:
73
+ #
74
+ # @account: a TestAccount instance with randomly generated properties
75
+ # @app: a TestApplication instance associated with @account
76
+ # @gear: a TestGear instance associated with @app
77
+ # @cart: a TestCartridge instance associated with @gear
78
+ #
79
+ # The type of cartridge created will be of type cart_name from the step
80
+ # matcher.
81
+ Given /^a(n additional)? new ([^ ]+) type application$/ do | additional, cart_name |
82
+ record_measure("Runtime Benchmark: Creating cartridge #{cart_name}") do
83
+ if additional
84
+ assert_not_nil @account, 'You must create a new application before an additional application can be created'
85
+ else
86
+ @account = OpenShift::TestAccount.new
87
+ @app = @account.create_app
88
+ end
89
+
90
+ @gear = @app.create_gear
91
+
92
+ @cart = @gear.add_cartridge(cart_name)
93
+ @cart.configure
94
+ end
95
+ end
96
+
97
+ # Invokes destroy on the current application.
98
+ When /^I destroy the application$/ do
99
+ record_measure("Runtime Benchmark: Destroying cartridge #{@cart.name}") do
100
+ @app.destroy
101
+ end
102
+ end
103
+
104
+ # Embeds a new cartridge to the current application's gear
105
+ # Calls configure on the embedded cartridge.
106
+ When /^I (fail to )?embed a ([^ ]+) cartridge into the application$/ do | negate, cart_name |
107
+ record_measure("Runtime Benchmark: Configure #{cart_name} cartridge in cartridge #{@cart.name}") do
108
+ cart = @gear.add_cartridge(cart_name, OpenShift::TestCartridge::Embedded)
109
+
110
+ if negate
111
+ assert_raise(RuntimeError) do
112
+ exit_code = cart.configure
113
+ end
114
+ else
115
+ exit_code = cart.configure
116
+ assert_equal 0, exit_code
117
+ end
118
+ end
119
+ end
120
+
121
+
122
+ # Un-embeds a cartridge from the current application's gear by
123
+ # invoking deconfigure on the named cartridge.
124
+ When /^I remove the ([^ ]+) cartridge from the application$/ do | cart_name |
125
+ record_measure("Runtime Benchmark: Deconfigure #{cart_name} cartridge in cartridge #{@cart.name}") do
126
+ raise "No embedded cart named #{cart_name} associated with gear #{gear.uuid}" unless @gear.carts.has_key?(cart_name)
127
+
128
+ embedded_cart = @gear.carts[cart_name]
129
+
130
+ exit_code = embedded_cart.deconfigure
131
+ assert_equal 0, exit_code
132
+ end
133
+ end
134
+
135
+
136
+ # Verifies the existence of httpd proxy files associated with
137
+ # the current application.
138
+ Then /^the application http proxy file will( not)? exist$/ do | negate |
139
+ conf_file_name = "#{@gear.uuid}_#{@account.domain}_#{@app.name}.conf"
140
+ conf_file_path = "#{$libra_httpd_conf_d}/#{conf_file_name}"
141
+
142
+ $logger.info("Checking for #{negate} proxy file at #{conf_file_path}")
143
+ if negate
144
+ assert_file_not_exists conf_file_path
145
+ else
146
+ assert_file_exists conf_file_path
147
+ end
148
+ end
149
+
150
+
151
+ # Verifies the existence of an httpd proxy file for the given embedded
152
+ # cartridge associated with the current application.
153
+ Then /^the embedded ([^ ]+) cartridge http proxy file will( not)? exist$/ do | cart_name, negate |
154
+ conf_file_name = "#{@gear.uuid}_#{@account.domain}_#{@app.name}/#{cart_name}.conf"
155
+ conf_file_path = "#{$libra_httpd_conf_d}/#{conf_file_name}"
156
+
157
+ $logger.info("Checking for #{negate} embedded cartridge proxy file at #{conf_file_path}")
158
+ if negate
159
+ assert_file_not_exists conf_file_path
160
+ else
161
+ assert_file_exists conf_file_path
162
+ end
163
+ end
164
+
165
+
166
+ # Verifies the existence of a git repo associated with the current
167
+ # application.
168
+ Then /^the application git repo will( not)? exist$/ do | negate |
169
+ git_repo = "#{$home_root}/#{@gear.uuid}/git/#{@app.name}.git"
170
+
171
+ # TODO - need to check permissions and SELinux labels
172
+
173
+ $logger.info("Checking for #{negate} git repo at #{git_repo}")
174
+ if negate
175
+ assert_directory_not_exists git_repo
176
+ else
177
+ assert_directory_exists git_repo
178
+ end
179
+ end
180
+
181
+
182
+ # Verifies the existence of an exported source tree associated with
183
+ # the current application.
184
+ Then /^the application source tree will( not)? exist$/ do | negate |
185
+ app_root = "#{$home_root}/#{@gear.uuid}/#{@cart.name}"
186
+
187
+ # TODO - need to check permissions and SELinux labels
188
+
189
+ $logger.info("Checking for app root at #{app_root}")
190
+ if negate
191
+ assert_directory_not_exists app_root
192
+ else
193
+ assert_directory_exists app_root
194
+ end
195
+ end
196
+
197
+
198
+ # Verifies the existence of application log files associated with the
199
+ # current application.
200
+ Then /^the application log files will( not)? exist$/ do | negate |
201
+ log_dir_path = "#{$home_root}/#{@gear.uuid}/#{@cart.name}/logs"
202
+
203
+ $logger.info("Checking for log dir at #{log_dir_path}")
204
+
205
+ begin
206
+ log_dir = Dir.new log_dir_path
207
+ status = (log_dir.count > 2)
208
+ rescue
209
+ status = false
210
+ end
211
+
212
+ if not negate
213
+ status.should be_true
214
+ else
215
+ status.should be_false
216
+ end
217
+ end
218
+
219
+
220
+ # Ensures that the root directory exists for the given embedded cartridge.
221
+ Then /^the embedded ([^ ]+) cartridge directory will( not)? exist$/ do | cart_name, negate |
222
+ user_root = "#{$home_root}/#{@gear.uuid}/#{cart_name}"
223
+
224
+ $logger.info("Checking for #{negate} cartridge root dir at #{user_root}")
225
+ if negate
226
+ assert_directory_not_exists user_root
227
+ else
228
+ assert_directory_exists user_root
229
+ end
230
+ end
231
+
232
+
233
+ # Ensures that more than zero log files exist in the given embedded cartridge
234
+ # log directory.
235
+ Then /^the embedded ([^ ]+) cartridge log files will( not)? exist$/ do | cart_name, negate |
236
+ log_dir_path = "#{$home_root}/#{@gear.uuid}/#{cart_name}/logs"
237
+
238
+ $logger.info("Checking for #{negate} cartridge log dir at #{log_dir_path}")
239
+ if negate
240
+ assert_directory_not_exists log_dir_path
241
+ else
242
+ assert_directory_exists log_dir_path
243
+ end
244
+ end
245
+
246
+
247
+ # Simple verification of arbitrary cartridge directory existence.
248
+ Then /^the embedded ([^ ]+) cartridge subdirectory named ([^ ]+) will( not)? exist$/ do | cart_name, dir_name, negate |
249
+ dir_path = "#{$home_root}/#{@gear.uuid}/#{cart_name}/#{dir_name}"
250
+
251
+ $logger.info("Checking for #{negate} cartridge subdirectory at #{dir_path}")
252
+ if negate
253
+ assert_directory_not_exists dir_path
254
+ else
255
+ assert_directory_exists dir_path
256
+ end
257
+ end
258
+
259
+
260
+ # Ensures that the named control script exists for the given embedded cartridge of the
261
+ # current application.
262
+ Then /^the embedded ([^ ]+)\-([\d\.]+) cartridge control script will( not)? exist$/ do |cart_type, cart_version, negate|
263
+ # rewrite for 10gen-mms-agent
264
+ cooked = cart_type.gsub('-', '_')
265
+ startup_file = File.join($home_root,
266
+ @gear.uuid,
267
+ "#{cart_type}-#{cart_version}",
268
+ "#{@app.name}_#{cooked}_ctl.sh")
269
+
270
+ $logger.info("Checking for #{negate} cartridge control script at #{startup_file}")
271
+ if negate
272
+ assert_file_not_exists startup_file
273
+ else
274
+ assert_file_exists startup_file
275
+ end
276
+ end
277
+
278
+
279
+ # Used to control the runtime state of the current application.
280
+ #
281
+ # IMPORTANT: As mentioned in the general comments, this step assumes
282
+ # a single application/gear/cartridge, and does its work by controlling
283
+ # the single cartridge directly. There will be no recursive actions for
284
+ # multiple carts associated with an app/gear.
285
+ When /^I (start|stop|status|restart) the application$/ do |action|
286
+ OpenShift::timeout(60) do
287
+ record_measure("Runtime Benchmark: Hook #{action} on application #{@cart.name}") do
288
+ @cart.run_hook(action)
289
+ end
290
+ end
291
+ end
292
+
293
+
294
+ # Controls carts within the current gear directly, by cartridge name.
295
+ # The same comments from the similar matcher apply.
296
+ When /^I (start|stop|status|restart) the ([^ ]+) cartridge$/ do |action, cart_name|
297
+ record_measure("Runtime Benchmark: Hook #{action} on cart #{@cart.name}") do
298
+ @gear.carts[cart_name].run_hook(action)
299
+ end
300
+ end
301
+
302
+
303
+ # Verifies that a process named proc_name and associated with the current
304
+ # application will be running (or not). The step will retry up to max_tries
305
+ # times to verify the expectations, as some cartridge stop hooks are
306
+ # asynchronous. This doesn't outright eliminate timing issues, but it helps.
307
+ Then /^a (.+) process will( not)? be running$/ do | proc_name, negate |
308
+ exit_test = negate ? lambda { |tval| tval == 0 } : lambda { |tval| tval > 0 }
309
+ exit_test_desc = negate ? "0" : ">0"
310
+
311
+ num_node_processes = num_procs @gear.uuid, proc_name
312
+ $logger.info("Expecting #{exit_test_desc} pid(s) named #{proc_name}, found #{num_node_processes}")
313
+ OpenShift::timeout(20) do
314
+ while (not exit_test.call(num_node_processes))
315
+ $logger.info("Waiting for #{proc_name} process count to be #{exit_test_desc}")
316
+ sleep 1
317
+ num_node_processes = num_procs @gear.uuid, proc_name
318
+ end
319
+ end
320
+
321
+ if not negate
322
+ num_node_processes.should be > 0
323
+ else
324
+ num_node_processes.should be == 0
325
+ end
326
+ end
327
+
328
+
329
+ # Verifies that a process named proc_name and associated with the current
330
+ # application will be running (or not). The step will retry up to max_tries
331
+ # times to verify the expectations, as some cartridge stop hooks are
332
+ # asynchronous. This doesn't outright eliminate timing issues, but it helps.
333
+ Then /^a (.+) process for ([^ ]+) will( not)? be running$/ do | proc_name, label, negate |
334
+ exit_test = negate ? lambda { |tval| tval == 0 } : lambda { |tval| tval > 0 }
335
+ exit_test_desc = negate ? "0" : ">0"
336
+
337
+ num_node_processes = num_procs @gear.uuid, proc_name, label
338
+ $logger.info("Expecting #{exit_test_desc} pid(s) named #{proc_name}, found #{num_node_processes}")
339
+ OpenShift::timeout(20) do
340
+ while (not exit_test.call(num_node_processes))
341
+ $logger.info("Waiting for #{proc_name} process count to be #{exit_test_desc}")
342
+ sleep 1
343
+ num_node_processes = num_procs @gear.uuid, proc_name, label
344
+ end
345
+ end
346
+
347
+ if not negate
348
+ num_node_processes.should be > 0
349
+ else
350
+ num_node_processes.should be == 0
351
+ end
352
+ end
353
+
354
+ # Verifies that exactly the specified number of the named processes
355
+ # are currently running.
356
+ #
357
+ # Could maybe be consolidated with the other similar step with some
358
+ # good refactoring.
359
+ Then /^(\d+) process(es)? named ([^ ]+) will be running$/ do | proc_count, junk, proc_name |
360
+ proc_count = proc_count.to_i
361
+
362
+ num_node_processes = num_procs @gear.uuid, proc_name
363
+ $logger.info("Expecting #{proc_count} pid(s) named #{proc_name}, found #{num_node_processes}")
364
+ OpenShift::timeout(20) do
365
+ while (num_node_processes != proc_count)
366
+ $logger.info("Waiting for #{proc_name} process count to equal #{proc_count}")
367
+ sleep 1
368
+ num_node_processes = num_procs @gear.uuid, proc_name
369
+ end
370
+ end
371
+
372
+ num_node_processes.should be == proc_count
373
+ end
374
+
375
+ # Verifies that exactly the specified number of the named processes
376
+ # with arguments matching 'label' are currently running.
377
+ #
378
+ # Could maybe be consolidated with the other similar step with some
379
+ # good refactoring.
380
+ Then /^(\d+) process(es)? named ([^ ]+) for ([^ ]+) will be running$/ do | proc_count, junk, proc_name, label |
381
+ proc_count = proc_count.to_i
382
+
383
+ num_node_processes = num_procs @gear.uuid, proc_name, label
384
+ $logger.info("Expecting #{proc_count} pid(s) named #{proc_name}, found #{num_node_processes}")
385
+ OpenShift::timeout(20) do
386
+ while (num_node_processes != proc_count)
387
+ $logger.info("Waiting for #{proc_name} process count to equal #{proc_count}")
388
+ sleep 1
389
+ num_node_processes = num_procs @gear.uuid, proc_name, label
390
+ end
391
+ end
392
+
393
+ num_node_processes.should be == proc_count
394
+ end
395
+
396
+
397
+ # Makes the application publicly accessible.
398
+ #
399
+ # - Adds an /etc/hosts entry for the application to work around
400
+ # the lack of DNS
401
+ # - Adds the test pubkey to the authorized key list for the host
402
+ # - Disables strict host key checking for the host to suppress
403
+ # interactive prompts on push
404
+ #
405
+ # This is not pretty. If it can be made less hackish and faster, it
406
+ # could be moved into the generic application setup step.
407
+ When /^the application is made publicly accessible$/ do
408
+ ssh_key = IO.read($test_pub_key).chomp.split[1]
409
+ run "echo \"127.0.0.1 #{@app.name}-#{@account.domain}.dev.rhcloud.com # Added by cucumber\" >> /etc/hosts"
410
+ run "oo-authorized-ssh-key-add -a #{@gear.uuid} -c #{@gear.uuid} -s #{ssh_key} -t ssh-rsa -m default"
411
+ run "echo -e \"Host #{@app.name}-#{@account.domain}.dev.rhcloud.com\n\tStrictHostKeyChecking no\n\" >> ~/.ssh/config"
412
+ end
413
+
414
+
415
+ # Captures the current cartridge PID hash for the test application and
416
+ # makes it accessible to other steps via @current_cart_pids.
417
+ When /^the application cartridge PIDs are tracked$/ do
418
+ @current_cart_pids = @app.current_cart_pids
419
+
420
+ $logger.info("Tracking current cartridge pids for application #{@app.name}: #{@current_cart_pids.inspect}")
421
+ end
422
+
423
+
424
+ # Toggles hot deployment for the current application.
425
+ When /^hot deployment is( not)? enabled for the application$/ do |negate|
426
+ @app.hot_deploy_enabled = negate ? false : true
427
+ $logger.info("Hot deployment #{@app.hot_deploy_enabled ? 'enabled' : 'disabled'} for application #{@app.name}")
428
+ end
429
+
430
+
431
+ # Performs a trivial update to the test application source by appending
432
+ # some random stuff to a dummy file. The change is then committed and
433
+ # pushed to the app's Git repo.
434
+ When /^an update (is|has been) pushed to the application repo$/ do |junk|
435
+ record_measure("Runtime Benchmark: Updating #{$temp}/#{@account.name}-#{@app.name} source") do
436
+ tmp_git_root = "#{$temp}/#{@account.name}-#{@app.name}-clone"
437
+
438
+ run "git clone ssh://#{@gear.uuid}@#{@app.name}-#{@account.domain}.dev.rhcloud.com/~/git/#{@app.name}.git #{tmp_git_root}"
439
+
440
+ marker_file = File.join(tmp_git_root, '.openshift', 'markers', 'hot_deploy')
441
+
442
+ if @app.hot_deploy_enabled
443
+ FileUtils.touch(marker_file)
444
+ else
445
+ FileUtils.rm_f(marker_file)
446
+ end
447
+
448
+ Dir.chdir(tmp_git_root) do
449
+ # Make a change to the app repo
450
+ run "echo $RANDOM >> cucumber_update_test"
451
+ run "git add ."
452
+ run "git commit -m 'Test change'"
453
+ run "git push"
454
+ end
455
+ end
456
+ end
457
+
458
+ # Adds/removes aliases from the application
459
+ When /^I add an alias to the application/ do
460
+ server_alias = "#{@app.name}.#{$alias_domain}"
461
+
462
+ @gear.add_alias(server_alias)
463
+ end
464
+
465
+
466
+ # Adds/removes aliases from the application
467
+ When /^I remove an alias from the application/ do
468
+ server_alias = "#{@app.name}.#{$alias_domain}"
469
+
470
+ @gear.remove_alias(server_alias)
471
+ end
472
+
473
+
474
+ # Asserts the 'cucumber_update_test' file exists after an update
475
+ Then /^the application repo has been updated$/ do
476
+ assert_file_exist File.join($home_root,
477
+ @gear.uuid,
478
+ 'app-root',
479
+ 'runtime',
480
+ 'repo',
481
+ 'cucumber_update_test')
482
+ end
483
+
484
+ # Compares the current PID set for the test application to whatever state
485
+ # was last captured and stored in @current_cart_pids. Raises exceptions
486
+ # depending on the expectations configured by the matcher.
487
+ Then /^the tracked application cartridge PIDs should( not)? be changed$/ do |negate|
488
+ diff_expected = !negate # better way to do this?
489
+
490
+ new_cart_pids = @app.current_cart_pids
491
+
492
+ $logger.info("Comparing old and new PIDs for #{@app.name}, diffs are #{diff_expected ? 'expected' : 'unexpected' }." \
493
+ " Old PIDs: #{@current_cart_pids.inspect}, new PIDs: #{new_cart_pids.inspect}")
494
+
495
+ diffs = []
496
+
497
+ @current_cart_pids.each do |proc_name, old_pid|
498
+ new_pid = new_cart_pids[proc_name]
499
+
500
+ if !new_pid || (new_pid != old_pid)
501
+ diffs << proc_name
502
+ end
503
+ end
504
+
505
+ if !diff_expected && diffs.length > 0
506
+ raise "Expected no PID differences, but found #{diffs.length}. Old PIDs: #{@current_cart_pids.inspect},"\
507
+ " new PIDs: #{new_cart_pids.inspect}"
508
+ end
509
+
510
+ if diff_expected && diffs.length == 0
511
+ raise "Expected PID differences, but found none. Old PIDs: #{@current_cart_pids.inspect},"\
512
+ " new PIDs: #{new_cart_pids.inspect}"
513
+ end
514
+
515
+ # verify BZ852268 fix
516
+ state_file = File.join($home_root, @gear.uuid, 'app-root', 'runtime', '.state')
517
+ state = File.read(state_file).chomp
518
+ assert_equal 'started', state
519
+ end
520
+
521
+ Then /^the web console for the ([^ ]+)\-([\d\.]+) cartridge at ([^ ]+) is( not)? accessible$/ do |cart_type, version, uri, negate|
522
+ conf_file = File.join($libra_httpd_conf_d,
523
+ "#{@gear.uuid}_#{@account.domain}_#{@app.name}",
524
+ "#{cart_type}-#{version}.conf")
525
+
526
+ # The URL segment for the cart lives in the proxy conf
527
+ cart_path = `/bin/awk '/ProxyPassReverse/ {printf "%s", $2;}' #{conf_file}`
528
+ url = "https://127.0.0.1#{cart_path}#{uri}"
529
+
530
+ finished = negate ? lambda { |s| s == "503" } : lambda { |s| s == "200"}
531
+ cmd = "curl -L -k -w %{http_code} -s -o /dev/null -H 'Host: #{@app.name}-#{@account.domain}.#{$domain}' #{url}"
532
+ res = `#{cmd}`
533
+ OpenShift::timeout(300) do
534
+ while not finished.call res
535
+ res = `#{cmd}`
536
+ $logger.debug { "Waiting on #{cart_type} to#{negate} be accessible: status #{res}" }
537
+ sleep 1
538
+ end
539
+ end
540
+
541
+ msg = "Unexpected response from #{cmd}"
542
+ if negate
543
+ assert_equal "503", res, msg
544
+ else
545
+ assert_equal "200", res, msg
546
+ end
547
+ end