rhoconnect 3.4.5 → 4.0.0.beta.10

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 (337) hide show
  1. data/CHANGELOG.md +57 -3
  2. data/Gemfile +9 -7
  3. data/Gemfile.lock +37 -37
  4. data/Rakefile +18 -7
  5. data/bench/benchapp/Gemfile +1 -1
  6. data/bench/benchapp/config.ru +0 -3
  7. data/bench/benchapp/controllers/ruby/application.rb +17 -0
  8. data/bench/benchapp/controllers/ruby/application_controller.rb +17 -0
  9. data/bench/benchapp/controllers/ruby/mock_adapter_controller.rb +8 -0
  10. data/bench/benchapp/controllers/ruby/queue_mock_adapter_controller.rb +8 -0
  11. data/bench/benchapp/{sources → models/ruby}/mock_adapter.rb +1 -1
  12. data/bench/benchapp/{sources → models/ruby}/queue_mock_adapter.rb +0 -0
  13. data/bench/benchapp/spec/{sources → models/ruby}/mock_adapter_spec.rb +1 -1
  14. data/bench/benchapp/spec/{sources → models/ruby}/queue_mock_adapter_spec.rb +1 -1
  15. data/bench/benchapp/spec/spec_helper.rb +2 -2
  16. data/bench/blobapp/Gemfile +1 -1
  17. data/bench/blobapp/config.ru +0 -3
  18. data/bench/blobapp/controllers/ruby/application_controller.rb +17 -0
  19. data/bench/blobapp/controllers/ruby/blob_adapter_controller.rb +8 -0
  20. data/bench/blobapp/{sources → models/ruby}/blob_adapter.rb +9 -2
  21. data/bench/blobapp/spec/{sources → models/ruby}/blob_adapter_spec.rb +1 -1
  22. data/bench/blobapp/spec/spec_helper.rb +1 -1
  23. data/bench/lib/bench/cli.rb +1 -1
  24. data/bench/scripts/blob_cud_script.rb +1 -1
  25. data/bench/scripts/query_md_script.rb +1 -1
  26. data/bench/scripts/query_only_script.rb +1 -1
  27. data/bench/scripts/query_script.rb +1 -1
  28. data/bench/scripts/test_query_script.rb +7 -1
  29. data/bench/spec/mock_adapter_spec.rb +1 -1
  30. data/bench/spec/result_spec.rb +3 -3
  31. data/bin/rhoconnect +5 -3
  32. data/commands/dtach/dtach_install.rb +2 -2
  33. data/commands/execute.rb +8 -3
  34. data/commands/generators/app.rb +3 -3
  35. data/commands/generators/controller.rb +6 -0
  36. data/commands/generators/model.rb +6 -0
  37. data/commands/generators/source.rb +3 -3
  38. data/commands/generators/update.rb +1 -1
  39. data/commands/redis/redis_about.rb +2 -2
  40. data/commands/redis/redis_download.rb +1 -1
  41. data/commands/redis/redis_install.rb +4 -3
  42. data/commands/redis/redis_restart.rb +4 -4
  43. data/commands/redis/redis_start.rb +5 -4
  44. data/commands/redis/redis_startbg.rb +5 -4
  45. data/commands/redis/redis_status.rb +13 -0
  46. data/commands/redis/redis_stop.rb +3 -3
  47. data/commands/rhoconnect/config.rb +28 -16
  48. data/commands/rhoconnect/flushdb.rb +1 -2
  49. data/commands/rhoconnect/get_token.rb +15 -11
  50. data/commands/rhoconnect/restart.rb +13 -5
  51. data/commands/rhoconnect/set_admin_password.rb +8 -8
  52. data/commands/rhoconnect/start.rb +74 -16
  53. data/commands/rhoconnect/startbg.rb +1 -1
  54. data/commands/rhoconnect/startdebug.rb +1 -1
  55. data/commands/rhoconnect/stop.rb +13 -1
  56. data/commands/rhoconnect/web.rb +5 -5
  57. data/commands/rhoconnect_console/console.rb +7 -5
  58. data/commands/{rhoconnect → rhoconnect_spec}/spec.rb +0 -0
  59. data/commands/rhoconnect_war/war.rb +9 -9
  60. data/commands/utilities/blank_app.ru +56 -0
  61. data/commands/utilities/redis_runner.rb +54 -19
  62. data/doc/authentication.txt +80 -6
  63. data/doc/blob-sync.txt +104 -97
  64. data/doc/bulk-sync.txt +1 -1
  65. data/doc/client-java.txt +3 -3
  66. data/doc/client-objc.txt +2 -2
  67. data/doc/client.txt +4 -4
  68. data/doc/command-line.txt +105 -200
  69. data/doc/data-partitioning.txt +40 -0
  70. data/doc/deploying.txt +249 -77
  71. data/doc/extending-rhoconnect-server.txt +40 -57
  72. data/doc/heroku-addon.txt +2 -0
  73. data/doc/install.txt +45 -95
  74. data/doc/introduction.txt +1 -1
  75. data/doc/java-plugin.txt +365 -190
  76. data/doc/metadata.txt +1 -1
  77. data/doc/migration.txt +108 -142
  78. data/doc/preparing-production.txt +1 -1
  79. data/doc/push-backend-setup.txt +2 -0
  80. data/doc/push-client-setup-android.txt +78 -0
  81. data/doc/push-client-setup-bb.txt +81 -0
  82. data/doc/push-client-setup-ios.txt +70 -0
  83. data/doc/push-client-setup-rps.txt +200 -0
  84. data/doc/push-client-setup.txt +63 -66
  85. data/doc/push-server-setup.txt +67 -40
  86. data/doc/push-testing.txt +29 -0
  87. data/doc/push.txt +21 -6
  88. data/doc/rest-api.txt +128 -55
  89. data/doc/rhoconnect-redis-stack.txt +120 -0
  90. data/doc/settings.txt +4 -12
  91. data/doc/source-adapters-intro.txt +28 -0
  92. data/doc/source-adapters.txt +235 -272
  93. data/doc/stats-middleware.txt +9 -29
  94. data/doc/supported-platforms.txt +21 -30
  95. data/doc/testing.txt +40 -42
  96. data/doc/tutorial.txt +72 -57
  97. data/examples/simple/Gemfile +1 -1
  98. data/examples/simple/application.rb +4 -5
  99. data/examples/simple/my_server.rb +2 -2
  100. data/examples/simple/settings/settings.yml +1 -1
  101. data/generators/rhoconnect.rb +151 -50
  102. data/generators/templates/application/Gemfile +1 -1
  103. data/generators/templates/application/Rakefile +3 -3
  104. data/generators/templates/application/config.ru +1 -4
  105. data/generators/templates/application/controllers/application_controller.rb +17 -0
  106. data/generators/templates/application/controllers/js/application_controller.js +14 -0
  107. data/generators/templates/application/controllers/ruby/application_controller.rb +17 -0
  108. data/generators/templates/application/package.json +8 -0
  109. data/generators/templates/application/rcgemfile +2 -5
  110. data/generators/templates/application/settings/settings.yml +3 -3
  111. data/generators/templates/application/spec/application_controller_spec.rb +23 -0
  112. data/generators/templates/application/spec/js_spec.rb +25 -0
  113. data/generators/templates/application/spec/spec_helper.rb +21 -7
  114. data/generators/templates/source/controllers/js/controller.js +7 -0
  115. data/generators/templates/source/controllers/ruby/controller.rb +8 -0
  116. data/generators/templates/source/controllers/ruby/controller_spec.rb +27 -0
  117. data/generators/templates/source/models/js/model.js +46 -0
  118. data/generators/templates/source/{source_adapter.rb → models/ruby/model.rb} +15 -10
  119. data/generators/templates/source/{source_spec.rb → models/ruby/model_spec.rb} +1 -1
  120. data/install.sh +5 -5
  121. data/installer/unix-like/create_texts.rb +2 -2
  122. data/installer/unix-like/rho_connect_install_constants.rb +2 -2
  123. data/installer/unix-like/rho_connect_install_utilities.rb +1 -1
  124. data/installer/utils/constants.rb +4 -4
  125. data/js-adapters/ballroom.js +216 -0
  126. data/js-adapters/node.rb +52 -0
  127. data/js-adapters/node_channel.rb +181 -0
  128. data/js-adapters/request.js +27 -0
  129. data/js-adapters/response.js +57 -0
  130. data/js-adapters/rhoconnect_helpers.js +60 -0
  131. data/js-adapters/router.js +60 -0
  132. data/js-adapters/server.js +5 -0
  133. data/lib/rhoconnect/api/app/ans_login.rb +3 -3
  134. data/lib/rhoconnect/api/app/bulk_data.rb +10 -10
  135. data/lib/rhoconnect/api/app/fast_delete.rb +11 -10
  136. data/lib/rhoconnect/api/app/fast_insert.rb +11 -10
  137. data/lib/rhoconnect/api/app/fast_update.rb +11 -10
  138. data/lib/rhoconnect/api/app/login.rb +5 -5
  139. data/lib/rhoconnect/api/app/push_deletes.rb +12 -11
  140. data/lib/rhoconnect/api/app/push_objects.rb +12 -11
  141. data/lib/rhoconnect/api/app/query.rb +8 -7
  142. data/lib/rhoconnect/api/app/queue_updates.rb +98 -94
  143. data/lib/rhoconnect/api/app/search.rb +8 -7
  144. data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -5
  145. data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -8
  146. data/lib/rhoconnect/api/client/create.rb +7 -7
  147. data/lib/rhoconnect/api/client/get_client_params.rb +4 -4
  148. data/lib/rhoconnect/api/client/list_client_docs.rb +17 -17
  149. data/lib/rhoconnect/api/client/register.rb +12 -12
  150. data/lib/rhoconnect/api/client/reset.rb +5 -5
  151. data/lib/rhoconnect/api/readstate/set_refresh_time.rb +9 -9
  152. data/lib/rhoconnect/api/source/get_source_params.rb +4 -4
  153. data/lib/rhoconnect/api/source/list_sources.rb +16 -16
  154. data/lib/rhoconnect/api/source/update_source_params.rb +6 -6
  155. data/lib/rhoconnect/api/store/get_db_doc.rb +4 -4
  156. data/lib/rhoconnect/api/store/set_db_doc.rb +7 -7
  157. data/lib/rhoconnect/api/system/get_adapter.rb +4 -4
  158. data/lib/rhoconnect/api/system/get_license_info.rb +8 -8
  159. data/lib/rhoconnect/api/system/login.rb +15 -15
  160. data/lib/rhoconnect/api/system/reset.rb +11 -11
  161. data/lib/rhoconnect/api/system/save_adapter.rb +4 -4
  162. data/lib/rhoconnect/api/system/stats.rb +22 -22
  163. data/lib/rhoconnect/api/user/create_user.rb +7 -7
  164. data/lib/rhoconnect/api/user/delete_client.rb +6 -6
  165. data/lib/rhoconnect/api/user/delete_user.rb +11 -10
  166. data/lib/rhoconnect/api/user/list_clients.rb +4 -4
  167. data/lib/rhoconnect/api/user/list_source_docs.rb +10 -10
  168. data/lib/rhoconnect/api/user/list_users.rb +3 -3
  169. data/lib/rhoconnect/api/user/ping.rb +3 -3
  170. data/lib/rhoconnect/api/user/show_user.rb +3 -3
  171. data/lib/rhoconnect/api/user/update_user.rb +5 -5
  172. data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -5
  173. data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -10
  174. data/lib/rhoconnect/api_token.rb +5 -6
  175. data/lib/rhoconnect/app.rb +6 -46
  176. data/lib/rhoconnect/application/init.rb +5 -2
  177. data/lib/rhoconnect/async.rb +76 -39
  178. data/lib/rhoconnect/bulk_data/bulk_data.rb +6 -4
  179. data/lib/rhoconnect/client.rb +59 -9
  180. data/lib/rhoconnect/condition/admin_required.rb +27 -0
  181. data/lib/rhoconnect/condition/client_required.rb +50 -0
  182. data/lib/rhoconnect/condition/login_required.rb +22 -0
  183. data/lib/rhoconnect/condition/source_required.rb +49 -0
  184. data/lib/rhoconnect/condition/verbs.rb +17 -0
  185. data/lib/rhoconnect/condition/verify_success.rb +19 -0
  186. data/lib/rhoconnect/controller/app_base.rb +74 -0
  187. data/lib/rhoconnect/controller/base.rb +68 -0
  188. data/lib/rhoconnect/controller/clients_controller.rb +79 -0
  189. data/lib/rhoconnect/controller/dynamic_adapter_controller.rb +93 -0
  190. data/lib/rhoconnect/controller/js_base.rb +124 -0
  191. data/lib/rhoconnect/controller/read_state_controller.rb +22 -0
  192. data/lib/rhoconnect/controller/source_adapter_base.rb +14 -0
  193. data/lib/rhoconnect/controller/sources_controller.rb +44 -0
  194. data/lib/rhoconnect/controller/store_controller.rb +25 -0
  195. data/lib/rhoconnect/controller/system_controller.rb +67 -0
  196. data/lib/rhoconnect/controller/users_controller.rb +99 -0
  197. data/lib/rhoconnect/db_adapter.rb +1 -3
  198. data/lib/rhoconnect/document.rb +159 -50
  199. data/lib/rhoconnect/handler/authenticate/execute_methods.rb +77 -0
  200. data/lib/rhoconnect/handler/authenticate/runner.rb +49 -0
  201. data/lib/rhoconnect/handler/authenticate.rb +3 -0
  202. data/lib/rhoconnect/handler/bulk_data.rb +28 -0
  203. data/lib/rhoconnect/handler/changes/engine.rb +271 -0
  204. data/lib/rhoconnect/handler/changes/execute_methods.rb +88 -0
  205. data/lib/rhoconnect/handler/changes/pass_through_runner.rb +11 -0
  206. data/lib/rhoconnect/handler/changes/runner.rb +53 -0
  207. data/lib/rhoconnect/handler/changes.rb +31 -0
  208. data/lib/rhoconnect/handler/helpers/auth_method.rb +29 -0
  209. data/lib/rhoconnect/handler/helpers/binding.rb +18 -0
  210. data/lib/rhoconnect/handler/helpers/bulk_data.rb +53 -0
  211. data/lib/rhoconnect/handler/helpers/source_job.rb +14 -0
  212. data/lib/rhoconnect/handler/helpers.rb +4 -0
  213. data/lib/rhoconnect/handler/plugin_callbacks/execute_methods.rb +99 -0
  214. data/lib/rhoconnect/handler/plugin_callbacks/runner.rb +28 -0
  215. data/lib/rhoconnect/handler/plugin_callbacks.rb +67 -0
  216. data/lib/rhoconnect/handler/query/engine.rb +93 -0
  217. data/lib/rhoconnect/handler/query/execute_methods.rb +21 -0
  218. data/lib/rhoconnect/handler/query/pass_through_runner.rb +35 -0
  219. data/lib/rhoconnect/handler/query/runner.rb +270 -0
  220. data/lib/rhoconnect/handler/query.rb +19 -0
  221. data/lib/rhoconnect/handler/search/engine.rb +60 -0
  222. data/lib/rhoconnect/handler/search/execute_methods.rb +32 -0
  223. data/lib/rhoconnect/handler/search/pass_through_runner.rb +18 -0
  224. data/lib/rhoconnect/handler/search/runner.rb +104 -0
  225. data/lib/rhoconnect/handler/search.rb +26 -0
  226. data/lib/rhoconnect/handler/sync.rb +29 -0
  227. data/lib/rhoconnect/jobs/source_job.rb +13 -4
  228. data/lib/rhoconnect/js_adapter.rb +79 -0
  229. data/lib/rhoconnect/license.rb +10 -2
  230. data/lib/rhoconnect/middleware/current_user.rb +14 -1
  231. data/lib/rhoconnect/middleware/helpers.rb +10 -93
  232. data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +1 -1
  233. data/lib/rhoconnect/model/base.rb +229 -0
  234. data/lib/rhoconnect/model/dynamic_adapter_model.rb +90 -0
  235. data/lib/rhoconnect/model/js_base.rb +121 -0
  236. data/lib/rhoconnect/ping/android.rb +1 -1
  237. data/lib/rhoconnect/predefined_adapters/bench_adapter.rb +7 -4
  238. data/lib/rhoconnect/read_state.rb +3 -3
  239. data/lib/rhoconnect/server.rb +159 -190
  240. data/lib/rhoconnect/source.rb +100 -11
  241. data/lib/rhoconnect/stats/record.rb +10 -10
  242. data/lib/rhoconnect/store.rb +905 -591
  243. data/lib/rhoconnect/{model.rb → store_orm.rb} +53 -115
  244. data/lib/rhoconnect/tasks.rb +18 -4
  245. data/lib/rhoconnect/test_methods.rb +30 -17
  246. data/lib/rhoconnect/user.rb +35 -17
  247. data/lib/rhoconnect/utilities.rb +1 -1
  248. data/lib/rhoconnect/version.rb +2 -2
  249. data/lib/rhoconnect/web-console/server.rb +29 -14
  250. data/lib/rhoconnect/web-console/views/home.js +10 -10
  251. data/lib/rhoconnect/web-console/views/new_ping.js +1 -1
  252. data/lib/rhoconnect.rb +120 -51
  253. data/rhoconnect.gemspec +4 -3
  254. data/spec/api/api_helper.rb +1 -6
  255. data/spec/api/app/fast_delete_spec.rb +4 -4
  256. data/spec/api/app/fast_insert_spec.rb +4 -4
  257. data/spec/api/app/fast_update_spec.rb +8 -8
  258. data/spec/api/app/push_deletes_spec.rb +2 -2
  259. data/spec/api/app/push_objects_spec.rb +5 -5
  260. data/spec/api/client/client_get_db_doc_spec.rb +6 -4
  261. data/spec/api/client/client_set_db_doc_spec.rb +3 -2
  262. data/spec/api/client/get_client_params_spec.rb +14 -0
  263. data/spec/api/client/list_client_docs_spec.rb +30 -20
  264. data/spec/api/client/reset_spec.rb +36 -0
  265. data/spec/api/source/get_source_params_spec.rb +23 -17
  266. data/spec/api/system/get_license_info_spec.rb +0 -20
  267. data/spec/api/system/login_spec.rb +8 -0
  268. data/spec/api/system/reset_spec.rb +0 -1
  269. data/spec/api/system/stats_spec.rb +5 -5
  270. data/spec/api/user/create_user_spec.rb +14 -6
  271. data/spec/api/user/delete_user_spec.rb +20 -18
  272. data/spec/api/user/list_users_spec.rb +5 -6
  273. data/spec/api/user/update_user_spec.rb +5 -4
  274. data/spec/apps/rhotestapp/config.ru +16 -1
  275. data/spec/apps/rhotestapp/controllers/js/js_sample_controller.js +23 -0
  276. data/spec/apps/rhotestapp/controllers/js/sample2_controller.js +32 -0
  277. data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +21 -0
  278. data/spec/apps/rhotestapp/controllers/ruby/sample_adapter_controller.rb +8 -0
  279. data/spec/apps/rhotestapp/models/js/js_sample.js +55 -0
  280. data/spec/apps/rhotestapp/models/js/sample2.js +25 -0
  281. data/spec/apps/rhotestapp/{sources → models/ruby}/base_adapter.rb +0 -0
  282. data/spec/apps/rhotestapp/{sources → models/ruby}/fixed_schema_adapter.rb +0 -0
  283. data/spec/apps/rhotestapp/{sources → models/ruby}/other_adapter.rb +0 -0
  284. data/spec/apps/rhotestapp/{sources → models/ruby}/sample_adapter.rb +0 -0
  285. data/spec/apps/rhotestapp/{sources → models/ruby}/simple_adapter.rb +2 -2
  286. data/spec/apps/rhotestapp/{sources → models/ruby}/sub_adapter.rb +0 -0
  287. data/spec/apps/rhotestapp/settings/settings.yml +0 -1
  288. data/spec/bulk_data/bulk_data_spec.rb +20 -5
  289. data/spec/cli/cli_spec.rb +83 -0
  290. data/spec/client_spec.rb +20 -17
  291. data/spec/client_sync_spec.rb +244 -406
  292. data/spec/controllers/js_base_spec.rb +89 -0
  293. data/spec/doc/doc_spec.rb +18 -18
  294. data/spec/document_spec.rb +29 -13
  295. data/spec/dynamic_adapter_spec.rb +6 -6
  296. data/spec/generator/generator_spec.rb +7 -4
  297. data/spec/jobs/bulk_data_job_spec.rb +14 -10
  298. data/spec/jobs/source_job_spec.rb +8 -8
  299. data/spec/license_spec.rb +5 -2
  300. data/spec/models/js_model_spec.rb +39 -0
  301. data/spec/node_spec.rb +42 -0
  302. data/spec/perf/store_perf_spec.rb +67 -12
  303. data/spec/ping/android_spec.rb +1 -1
  304. data/spec/read_state_spec.rb +1 -1
  305. data/spec/rhoconnect_spec.rb +1 -1
  306. data/spec/server/cors_spec.rb +14 -18
  307. data/spec/server/server_spec.rb +265 -88
  308. data/spec/server/stats_spec.rb +1 -1
  309. data/spec/source_adapter_spec.rb +54 -27
  310. data/spec/source_spec.rb +8 -3
  311. data/spec/source_sync_spec.rb +538 -468
  312. data/spec/spec_helper.rb +35 -4
  313. data/spec/stats/record_spec.rb +10 -10
  314. data/spec/{model_spec.rb → store_orm_spec.rb} +56 -54
  315. data/spec/store_spec.rb +159 -179
  316. data/spec/support/shared_examples.rb +36 -27
  317. data/spec/sync_states_spec.rb +40 -33
  318. data/spec/test_methods_spec.rb +18 -14
  319. data/spec/user_spec.rb +17 -30
  320. metadata +156 -52
  321. data/bench/benchapp/application.rb +0 -39
  322. data/bench/blobapp/application.rb +0 -44
  323. data/commands/rhoconnect/clean_start.rb +0 -9
  324. data/commands/rhoconnect/create_user.rb +0 -18
  325. data/commands/rhoconnect/delete_device.rb +0 -9
  326. data/commands/rhoconnect/delete_user.rb +0 -8
  327. data/commands/rhoconnect/reset.rb +0 -16
  328. data/commands/rhoconnect/reset_refresh.rb +0 -11
  329. data/generators/templates/application/application.rb +0 -43
  330. data/lib/rhoconnect/client_sync.rb +0 -434
  331. data/lib/rhoconnect/dynamic_adapter.rb +0 -91
  332. data/lib/rhoconnect/middleware/admin_user.rb +0 -23
  333. data/lib/rhoconnect/middleware/current_request.rb +0 -16
  334. data/lib/rhoconnect/middleware/login_required.rb +0 -22
  335. data/lib/rhoconnect/source_adapter.rb +0 -132
  336. data/lib/rhoconnect/source_sync.rb +0 -464
  337. data/spec/apps/rhotestapp/application.rb +0 -23
data/install.sh CHANGED
@@ -46,7 +46,7 @@ checkDeps ()
46
46
  }
47
47
 
48
48
  # determinePkgMgr
49
- # Determines if the system is currently using rpm or
49
+ # Determines if the system is currently using rpm or
50
50
  # debian based pckage management
51
51
  determinePkgMgr ()
52
52
  {
@@ -195,7 +195,7 @@ installRuby ()
195
195
  echo "tar -xzf ${prefix}/${rubyTar} -C ${prefix}" >> $log
196
196
  tar -xzf ${prefix}/${rubyTar} -C ${prefix} > /dev/null 2>&1
197
197
  fi
198
-
198
+
199
199
  echo "Installing ruby. This may take some time..." | tee -a $log
200
200
  echo "pushd ${prefix}/${rubyDir}" | tee -a $log
201
201
  pushd ${prefix}/${rubyDir}
@@ -204,14 +204,14 @@ installRuby ()
204
204
  echo "make && make install" | tee -a $log
205
205
  make >> $log 2>&1
206
206
  make install >> $log 2>&1
207
-
207
+
208
208
  if (( $? )) ; then
209
209
  echo "Some dependencies not installed..." | tee -a $log
210
210
  echo "Please install them and then re-run the installation script." | tee -a $log
211
211
  echo "For troubleshooting see file $log ..." | tee -a $log
212
212
  exit 1
213
213
  fi
214
-
214
+
215
215
  popd
216
216
  echo -e "$rubyDir is successfully installed.\n" | tee -a $log
217
217
  }
@@ -293,7 +293,7 @@ fi
293
293
  # Install redis, sqllite3, nginx, rhoconnect
294
294
  opts=" -d $dist -l $log"
295
295
  ${prefix}/bin/ruby ${INSTALL_DIR}/unix-like/rhoinstaller.rb ${opts}
296
- if (( $? )) ; then
296
+ if (( $? )) ; then
297
297
  echo "Installation failed. For troubleshooting see file $log ..." | tee -a $log
298
298
  exit 1
299
299
  fi
@@ -725,10 +725,10 @@ _NGINX_TO_DO_
725
725
  else
726
726
  server_todo_list = <<_NGINX_TO_DO_
727
727
  2) Try rhoconnect 'rhoapp' application, created in /opt/nginx/html directory
728
- A) As root user start redis, nginx and thin servers:
728
+ A) As root user start redis, thin and nginx servers:
729
729
  /etc/init.d/redis start
730
- /etc/init.d/nginx start
731
730
  /etc/init.d/thin start
731
+ /etc/init.d/nginx start
732
732
  B) Open RhoConnect application web console in your browser:
733
733
  http://servername
734
734
 
@@ -9,9 +9,9 @@ module Constants
9
9
  "dtach"]
10
10
 
11
11
  RUBY = "ruby-1.9.3-p392"
12
- REDIS = "redis-2.6.13"
12
+ REDIS = "redis-2.6.10"
13
13
  SQLITE3 = "sqlite-autoconf-3071502"
14
- NGINX = "nginx-1.4.1"
14
+ NGINX = "nginx-1.3.13"
15
15
  PASSENGER_ROOT = "/opt/rhoconnect/lib/ruby/gems/1.9.1/gems/passenger"
16
16
 
17
17
  SOFTWARE = [ REDIS, SQLITE3, RUBY, NGINX ]
@@ -41,7 +41,7 @@ module Utilities
41
41
  # This method moves all compressed files from the installation directory
42
42
  # that were downloaded by this installation process
43
43
  def cleanup(prefix)
44
- #print_header "Cleaning up ..."
44
+ print_header "Cleaning up ..."
45
45
  Constants::SOFTWARE.each do |sw|
46
46
  cmd "rm #{prefix}/#{sw}.tar.gz; rm -rf #{prefix}/#{sw}" if File.exist? "#{prefix}/#{sw}.tar.gz"
47
47
  end
@@ -12,19 +12,19 @@ module Constants
12
12
  SSH_KEY = "#{HOME_DIR}/.ssh/#{PEM_FILE}"
13
13
  ACCESS_KEY_FILE = "#{HOME_DIR}/.ec2"
14
14
  UBUNTU_STACK = { :image_id => 'ami-02d7f547', # jenkins-ubuntu-12.04-test-image
15
- :tags => {'Name' => 'Ubuntu-12.04'},
15
+ :tags => {'Name' => 'Ubuntu-12.04'},
16
16
  :flavor_id => 'c1.xlarge',
17
17
  :key_name => 'jenkinskey',
18
18
  :groups => 'load-test',
19
19
  :user => 'ubuntu'}
20
- CENTOS5_STACK = { :image_id => 'ami-bed9f5fb', # jenkins-centos-5.9-test-image
21
- :tags => {'Name' => 'CentOS-5.9'},
20
+ CENTOS5_STACK = { :image_id => 'ami-6aaf8d2f', # jenkins-centos-5.9-test-image
21
+ :tags => {'Name' => 'CentOS-5.9'},
22
22
  :flavor_id => 'c1.xlarge',
23
23
  :key_name => 'jenkinskey',
24
24
  :groups => 'load-test',
25
25
  :user => 'root'}
26
26
  CENTOS6_STACK = { :image_id => 'ami-02ae8c47', # jenkins-centos-6.3-test-image
27
- :tags => {'Name' => 'CentOS-6.3'},
27
+ :tags => {'Name' => 'CentOS-6.3'},
28
28
  :flavor_id => 'c1.xlarge',
29
29
  :key_name => 'jenkinskey',
30
30
  :groups => 'load-test',
@@ -0,0 +1,216 @@
1
+ var redis = require('redis'),
2
+ fs = require('fs'),
3
+ util = require('util'),
4
+ EventEmitter = require('events').EventEmitter,
5
+ registerEE = new EventEmitter(),
6
+ routes = require('./router'),
7
+ client_sub = redis.createClient(),
8
+ client_pub = redis.createClient(),
9
+ pub_channel = process.argv[2] + "RedisPUB";
10
+
11
+ //define global hash functions to store callbacks, routes
12
+ rhoconnectCallbacks = {};
13
+ registeredRoutes = {};
14
+ registeredControllers = {};
15
+ registeredModels = {};
16
+ var _c_name = null;
17
+ var _m_name = null;
18
+ //TODO: Don't have test-specific code here
19
+ var prefixDir = '/spec/apps/rhotestapp';
20
+
21
+ var controllerName = function(n){
22
+ _c_name = n;
23
+ registeredControllers[_c_name] = {};
24
+ registeredControllers[_c_name]['routes'] = [];
25
+ registeredControllers[_c_name]['defaults'] = [];
26
+ this.modelName(_c_name);
27
+ };
28
+
29
+ var modelName = function(n){
30
+ // TODO: Need to map directly to registeredModels
31
+ registeredControllers[_c_name]['model'] = n;
32
+ };
33
+
34
+ var exitNodejs = function(){
35
+ send({"exit": true});
36
+ process.exit(0);
37
+ };
38
+
39
+ var listen = function(channel){
40
+ client_sub.subscribe(channel);
41
+ client_sub.on("message", function(channel, message) {
42
+ //console.error("message nodejs recvd:" + message)
43
+ var json = JSON.parse(message);
44
+ try{
45
+ routes.router(json,send);
46
+ }
47
+ catch(e){
48
+ console.error("Node.js error caught: "+ e);
49
+ console.error("Backtrace: " + e.stack);
50
+ }
51
+ });
52
+ };
53
+
54
+ var send = function(json){
55
+ if(json['callback']){
56
+ var h_id = guid();
57
+ rhoconnectCallbacks[h_id] = json['callback'];
58
+ json['callback'] = h_id;
59
+ }
60
+ var j = JSON.stringify(json);
61
+ client_pub.publish(pub_channel,j);
62
+ };
63
+
64
+ var registerHandler = function(name) {
65
+ switch(name){
66
+ case 'sync':
67
+ this.defaults(
68
+ {
69
+ admin_required: false,
70
+ login_required: true,
71
+ source_required: true,
72
+ client_required: true
73
+ }
74
+ );
75
+
76
+ this.get('/', {"rc_handler":"query",
77
+ "deprecated_route": {"verb": "get", "url": ['/api/application', '/application', '/api/application/query']}}, function(req,resp){
78
+ loadModel(req.model).query(resp);
79
+ });
80
+
81
+ this.post('/', {"rc_handler":"cud",
82
+ "deprecated_route": {"verb": "post", "url": ['/api/application', '/application', '/api/application/queue_updates']}}, function(req,resp){
83
+ var operationCall = req.params.operation;
84
+ if(operationCall === 'delete') {
85
+ operationCall = 'del';
86
+ }
87
+ loadModel(req.model)[operationCall](resp);
88
+ });
89
+
90
+ this.put('/:id', {"rc_handler":"update"}, function(req,resp){
91
+ loadModel(req.model).update(resp);
92
+ });
93
+
94
+ this.del('/:id', {"rc_handler":"delete"}, function(req,resp){
95
+ loadModel(req.model).del(resp);
96
+ });
97
+ break;
98
+ default: break;
99
+ }
100
+ };
101
+
102
+ var register = function(){
103
+ var controller_dir = "";
104
+ var model_dir = "";
105
+ try{
106
+ if(process.argv[3] == 'test' ){
107
+ controller_dir = process.cwd() + prefixDir + "/controllers/js/";
108
+ model_dir = process.cwd() + prefixDir + "/models/js/";
109
+ }
110
+ else{
111
+ controller_dir = process.cwd() + "/controllers/js/";
112
+ model_dir = process.cwd() + "/models/js/";
113
+ }
114
+ if(fs.existsSync(model_dir)){
115
+ var modelFiles = fs.readdirSync(model_dir);
116
+ modelFiles.forEach(function(file){
117
+ //console.error("requiring model file: " + file);
118
+ var model = require(model_dir + file);
119
+ var functions = Object.keys(model);
120
+ mapModelFunctions(file.split(".")[0],functions);
121
+ });
122
+ }
123
+ if(fs.existsSync(controller_dir)){
124
+ var controllerFiles = fs.readdirSync(controller_dir);
125
+ controllerFiles.forEach(function(file){
126
+ //console.error("requiring controller file: " + file);
127
+ require(controller_dir + file);
128
+ _c_name = null;
129
+ });
130
+ }
131
+ }
132
+ catch(e){
133
+ console.error("Error loading JavaScript files.");
134
+ throw(e);
135
+ }
136
+ registerEE.emit('register_complete');
137
+ };
138
+
139
+ // this event will be called when all files have been registered
140
+ registerEE.on('register_complete',function(){
141
+ var json = {};
142
+ json['route'] = 'register';
143
+ json['result'] = registeredControllers;
144
+ json['models'] = registeredModels;
145
+ send(json);
146
+ });
147
+
148
+
149
+ var get = function(url,options,callback){
150
+ var key = 'get_rjs_' + _c_name + '_rjs_' + url + '_rjs_' + format_options(options);
151
+ registeredRoutes[key] = callback;
152
+ registeredControllers[_c_name]['routes'].push(key);
153
+ };
154
+
155
+ var post = function(url,options,callback){
156
+ var key = 'post_rjs_' + _c_name + '_rjs_' + url + '_rjs_' + format_options(options);
157
+ registeredRoutes[key] = callback;
158
+ registeredControllers[_c_name]['routes'].push(key);
159
+ };
160
+
161
+ var put = function(url,options,callback){
162
+ var key = 'put_rjs_' + _c_name + '_rjs_' + url + '_rjs_' + format_options(options);
163
+ registeredRoutes[key] = callback;
164
+ registeredControllers[_c_name]['routes'].push(key);
165
+ };
166
+
167
+ var del = function(url,options,callback){
168
+ var key = 'delete_rjs_' + _c_name + '_rjs_' + url + '_rjs_' + format_options(options);
169
+ registeredRoutes[key] = callback;
170
+ registeredControllers[_c_name]['routes'].push(key);
171
+ };
172
+
173
+ var defaults = function(hsh){
174
+ registeredControllers[_c_name]['defaults'].push(hsh);
175
+ };
176
+
177
+ var format_options = function(opts){
178
+ return JSON.stringify(opts);
179
+ // var f_opts = "";
180
+ // for(var propt in opts){
181
+ // f_opts += propt + ":" + opts[propt];
182
+ // }
183
+ // return f_opts;
184
+ };
185
+
186
+ function guid() {
187
+ return (((1+Math.random())*0x100000000)|0).toString(16).substring(1);
188
+ }
189
+
190
+ function mapModelFunctions(model,functions){
191
+ registeredModels[model] = [];
192
+ for(var i = 0;i< functions.length;i++){
193
+ registeredModels[model].push(functions[i]);
194
+ }
195
+ }
196
+
197
+ function loadModel(name) {
198
+ var prefix = process.cwd();
199
+ if(process.argv[3] === 'test') {
200
+ prefix = prefix + prefixDir;
201
+ }
202
+ return require(prefix + "/models/js/" + name);
203
+ }
204
+
205
+ exports.controllerName = controllerName;
206
+ exports.modelName = modelName;
207
+ exports.register = register;
208
+ exports.registerHandler = registerHandler;
209
+ exports.send = send;
210
+ exports.listen = listen;
211
+ exports.get = get;
212
+ exports.put = put;
213
+ exports.del = del;
214
+ exports.post = post;
215
+ exports.defaults = defaults;
216
+ exports.exitNodejs = exitNodejs;
@@ -0,0 +1,52 @@
1
+ module Rhoconnect
2
+ class Node
3
+
4
+ class << self
5
+ attr_accessor :started,:pipe
6
+ end
7
+ @started = false
8
+ @pipe = nil
9
+
10
+ def self.shell_node
11
+ package_file = File.join(Dir.pwd,'package.json')
12
+ if not File.exists?(package_file)
13
+ Rhoconnect.use_node = false
14
+ log "No `package.json` detected, disabling JavaScript support."
15
+ return
16
+ end
17
+
18
+ if which("node")
19
+ begin
20
+ if @started
21
+ kill_process
22
+ end
23
+ @started = true
24
+ dir = File.expand_path(File.dirname(__FILE__))
25
+ pwd = Dir.pwd
26
+ node_modules = File.join(pwd,'node_modules')
27
+ sub_env = { "NODE_PATH" => "#{node_modules}#{File::PATH_SEPARATOR}#{pwd}#{File::PATH_SEPARATOR}#{dir}" }
28
+ file = File.join(dir,"server.js")
29
+ args = [sub_env, "node", file, "#{$$}", Rhoconnect.environment.to_s]
30
+ @pipe = IO.popen(args)
31
+ log "Started Node.js process: #{@pipe.pid}"
32
+ @pipe
33
+ rescue Exception=>e
34
+ puts "Node.js startup error: #{e.message}\n"
35
+ puts e.backtrace.join("\n")
36
+ raise e
37
+ end
38
+ else
39
+ Rhoconnect.use_node = false
40
+ log "Node.js not detected, disabling JavaScript support."
41
+ end
42
+ end
43
+
44
+ def self.kill_process
45
+ log "Stopping Node.js process: #{@pipe.pid}" if @pipe
46
+ NodeChannel.exit_node
47
+ @started = false
48
+ @pipe = nil
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,181 @@
1
+ require 'timeout'
2
+ require 'open-uri'
3
+ module Rhoconnect
4
+ class NodeChannel
5
+ class << self
6
+ attr_accessor :redis,:redis2,:message_thread
7
+ @message_thread = nil
8
+ end
9
+
10
+ RESULT_HASH = {}
11
+ TIMEOUT = 30 # seconds
12
+ PUB_CHANNEL = "#{$$}RedisSUB" # pub channel must link to redis sub channel
13
+ SUB_CHANNEL = "#{$$}RedisPUB" # sub channel must link to redis pub channel
14
+ @message_thread,@redis,@redis2 = nil
15
+
16
+ class << self
17
+ attr_accessor :thrd, :register_semaphore, :register_condition
18
+
19
+ def get_timeout
20
+ TIMEOUT
21
+ end
22
+
23
+ def redis
24
+ url = Rhoconnect.redis.is_a?(Array) ? Rhoconnect.redis[0] : Rhoconnect.redis
25
+ db_inst = RedisImpl.new
26
+ db_inst.create(url)
27
+ @redis ||= db_inst.db
28
+ end
29
+
30
+ def redis2
31
+ url = Rhoconnect.redis.is_a?(Array) ? Rhoconnect.redis[0] : Rhoconnect.redis
32
+ db_inst = RedisImpl.new
33
+ db_inst.create(url)
34
+ @redis2 ||= db_inst.db
35
+ end
36
+
37
+ def exit_node
38
+ NodeChannel.redis2.publish(PUB_CHANNEL,{:route => 'deregister'}.to_json)
39
+ end
40
+
41
+ def bootstrap
42
+ @register_semaphore ||= Mutex.new
43
+ @register_condition ||= ConditionVariable.new
44
+ # Run in the main thread, we setup node thread and wait for it to
45
+ # finish bootstrapping before main thread can continue
46
+ if @message_thread
47
+ @message_thread.join
48
+ @message_thread = nil
49
+ end
50
+ @register_semaphore.synchronize do
51
+ @message_thread = Thread.new{check_channel}
52
+ @register_condition.wait(@register_semaphore)
53
+ end
54
+ end
55
+
56
+ def publish_channel_and_wait(msg,curr_model)
57
+ unique_id = UUIDTools::UUID.random_create.to_s.gsub(/\-/,"")
58
+ msg.merge!(:request_id => unique_id)
59
+ RESULT_HASH[unique_id] = {}
60
+ RESULT_HASH[unique_id][:status] = 'waiting'
61
+ NodeChannel.redis2.publish(PUB_CHANNEL,msg.to_json)
62
+ NodeChannel.wait_for_result(unique_id,curr_model)
63
+ end
64
+
65
+ def check_channel
66
+ NodeChannel.redis.subscribe(SUB_CHANNEL) do |on|
67
+ on.message do |channel,msg|
68
+ m = JSON.parse(msg)
69
+ #puts "received message: #{m.inspect}"
70
+ if m['exit'] == true
71
+ NodeChannel.redis.unsubscribe
72
+ end
73
+ route_message(m)
74
+ end
75
+ end
76
+ end
77
+
78
+ def publish_channel(msg)
79
+ NodeChannel.redis2.publish(PUB_CHANNEL,msg.to_json)
80
+ end
81
+
82
+ def wait_for_result(key,curr_model)
83
+ begin
84
+ Timeout::timeout(TIMEOUT) do
85
+ while(RESULT_HASH[key][:status] == 'waiting') do
86
+ if data = RESULT_HASH[key][:process_request]
87
+ #do some logic and return data with memory
88
+
89
+ RESULT_HASH[key][:process_result] = process_message(curr_model,data)
90
+ RESULT_HASH[key][:process_request] = nil
91
+ else
92
+ sleep 0.001
93
+ end
94
+ end
95
+ end
96
+ rescue Exception=>e
97
+ RESULT_HASH[key][:status] = 'broken'
98
+ RESULT_HASH[key][:result] = "exception #{e.message}\n#{e.backtrace}"
99
+ puts "Timeout on wait, setting JavaScript result state to broken: #{e.inspect}"
100
+ end
101
+
102
+ #request waiting either timed out or returned response
103
+ if RESULT_HASH[key][:status] == 'broken' or RESULT_HASH[key][:status] == 'waiting'
104
+ res = RESULT_HASH.delete(key)
105
+ elsif RESULT_HASH[key] =~ /JS ERROR/
106
+ res = RESULT_HASH.delete(key)
107
+ raise Exception.new(res)
108
+ else
109
+ res = RESULT_HASH.delete(key)
110
+ end
111
+ res[:result]
112
+ end
113
+
114
+ def route_message(msg)
115
+ case msg['route']
116
+ when 'request'
117
+ RESULT_HASH[msg['request_id']][:process_result] = 'waiting'
118
+ RESULT_HASH[msg['request_id']][:process_request] = msg
119
+ wait_for_process_result(msg['request_id'])
120
+ when 'response'
121
+ return if RESULT_HASH[msg['request_id']] == nil
122
+ if msg['error'] and msg['error'].size > 1
123
+ RESULT_HASH[msg['request_id']][:result] = "JS ERROR: #{msg['error']}"
124
+ RESULT_HASH[msg['request_id']][:status] = 'done'
125
+ else
126
+ RESULT_HASH[msg['request_id']][:result] = msg["result"]
127
+ RESULT_HASH[msg['request_id']][:status] = 'done'
128
+ end
129
+ when 'register'
130
+ @register_semaphore.synchronize do
131
+ begin
132
+ register_routes(msg)
133
+ rescue Exception => e
134
+ puts "Error registering JavaScript routes: #{e.inspect}"
135
+ puts e.backtrace.join("\n")
136
+ raise e
137
+ ensure
138
+ @register_condition.signal
139
+ end
140
+ end
141
+ end
142
+ end
143
+
144
+ def wait_for_process_result(key)
145
+ Timeout::timeout(TIMEOUT){
146
+ while(RESULT_HASH[key][:process_result] == 'waiting') do
147
+ sleep 0.001
148
+ end
149
+ }
150
+ publish_channel(RESULT_HASH[key][:process_result])
151
+ end
152
+
153
+ def process_message(curr_model,data)
154
+ #puts "proccessing msg #{data}"
155
+ if curr_model.respond_to?(data['function'])
156
+ if data['args'] and data['args'].size > 0
157
+ if(data['function'] == 'stash_result')
158
+ curr_model.send('result=',data['args'])
159
+ curr_model.send(data['function'])
160
+ process_res = nil
161
+ else
162
+ res = curr_model.send(data['function'],data['args'])
163
+ end
164
+ else
165
+ res = curr_model.send(data['function'])
166
+ end
167
+ else
168
+ raise Exception.new("Method #{data['function']} not found in model #{curr_model.class.name.to_s}.")
169
+ end
170
+
171
+ process_res = res.is_a?(String) ? res : res.to_hash if res
172
+
173
+ {:result=>process_res,:callback=>data['callback'],:request_id=>data['request_id'],:route=>'response'}
174
+ end
175
+
176
+ def register_routes(hsh)
177
+ Rhoconnect::Controller::JsBase.register_routes(hsh)
178
+ end
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,27 @@
1
+ var Request = function(){
2
+ this.__defineGetter__("params",function(){
3
+ return params;
4
+ });
5
+
6
+ this.__defineSetter__("params",function(arg){
7
+ params = arg;
8
+ });
9
+
10
+ this.__defineGetter__("header",function(){
11
+ return header;
12
+ });
13
+
14
+ this.__defineSetter__("header",function(arg){
15
+ header = arg;
16
+ });
17
+
18
+ this.__defineGetter__("model",function(){
19
+ return model;
20
+ });
21
+
22
+ this.__defineSetter__("model",function(arg){
23
+ model = arg;
24
+ });
25
+
26
+ }
27
+ module.exports = Request;
@@ -0,0 +1,57 @@
1
+ Object.extend = function(destination, source) {
2
+ for (var property in source) {
3
+ if (source.hasOwnProperty(property)) {
4
+ destination[property] = source[property];
5
+ }
6
+ }
7
+ return destination;
8
+ };
9
+
10
+ var Response = function(){
11
+ var exception = "";
12
+
13
+ this.__defineGetter__("params",function(){
14
+ return params;
15
+ });
16
+
17
+ this.__defineSetter__("params",function(arg){
18
+ params = arg;
19
+ });
20
+
21
+ this.__defineGetter__("header",function(){
22
+ return header;
23
+ });
24
+
25
+ this.__defineSetter__("header",function(arg){
26
+ header = arg;
27
+ });
28
+
29
+ this.__defineGetter__("exception",function(){
30
+ return exception;
31
+ });
32
+
33
+ this.__defineSetter__("exception",function(arg){
34
+ exception = arg;
35
+ });
36
+
37
+ this.send = function(data){
38
+ var ballroom = require("./ballroom");
39
+ var user_json = {};
40
+
41
+ //if callback we are sending request to ruby
42
+ if(data['callback']){
43
+ this.params = null;
44
+ this.header['route'] = 'request';
45
+ user_json = data;
46
+ }
47
+ else{
48
+ user_json["result"] = data;
49
+ }
50
+
51
+ Object.extend(user_json,this.params);
52
+ Object.extend(user_json,this.header);
53
+ Object.extend(user_json,this.exception);
54
+ ballroom.send(user_json);
55
+ };
56
+ };
57
+ module.exports = Response;