pione 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (593) hide show
  1. data/.gitignore +1 -0
  2. data/.simplecov +1 -0
  3. data/History.txt +9 -0
  4. data/Rakefile +1 -71
  5. data/example/Fib/Fib.pione +9 -8
  6. data/example/HelloWorld/HelloWorld.pione +2 -0
  7. data/example/HelloWorld/pione-package.json +15 -0
  8. data/example/HelloWorld/scenario/Scenario.pione +2 -0
  9. data/example/HelloWorld/scenario/pione-scenario.json +10 -0
  10. data/example/SerialProcessing/SerialProcessing.pione +2 -0
  11. data/example/SerialProcessing/pione-package.json +15 -0
  12. data/example/SerialProcessing/scenario/Scenario.pione +1 -0
  13. data/example/SerialProcessing/scenario/pione-scenario.json +10 -0
  14. data/lib/pione.rb +28 -35
  15. data/lib/pione/agent.rb +4 -4
  16. data/lib/pione/agent/agent-exception.rb +52 -0
  17. data/lib/pione/agent/basic-agent.rb +246 -239
  18. data/lib/pione/agent/broker.rb +232 -216
  19. data/lib/pione/agent/input-generator.rb +113 -133
  20. data/lib/pione/agent/job-terminator.rb +38 -0
  21. data/lib/pione/agent/logger.rb +24 -54
  22. data/lib/pione/agent/messenger.rb +11 -16
  23. data/lib/pione/agent/process-manager.rb +50 -19
  24. data/lib/pione/agent/task-worker.rb +126 -236
  25. data/lib/pione/agent/tuple-space-client.rb +16 -39
  26. data/lib/pione/agent/tuple-space-provider.rb +66 -0
  27. data/lib/pione/agent/tuple-space-receiver.rb +137 -0
  28. data/lib/pione/command.rb +2 -3
  29. data/lib/pione/command/basic-command.rb +347 -207
  30. data/lib/pione/command/command-exception.rb +38 -0
  31. data/lib/pione/command/option.rb +112 -104
  32. data/lib/pione/command/pione-broker.rb +85 -43
  33. data/lib/pione/command/pione-clean.rb +51 -8
  34. data/lib/pione/command/pione-client.rb +321 -292
  35. data/lib/pione/command/pione-log.rb +92 -53
  36. data/lib/pione/command/pione-package.rb +112 -59
  37. data/lib/pione/command/pione-relay-account-db.rb +107 -78
  38. data/lib/pione/command/pione-relay-client-db.rb +93 -72
  39. data/lib/pione/command/pione-relay.rb +37 -32
  40. data/lib/pione/command/pione-syntax-checker.rb +112 -87
  41. data/lib/pione/command/pione-task-worker.rb +135 -118
  42. data/lib/pione/command/pione-tuple-space-provider.rb +83 -50
  43. data/lib/pione/command/pione-tuple-space-receiver.rb +89 -50
  44. data/lib/pione/command/pione-tuple-space-viewer.rb +101 -99
  45. data/lib/pione/command/pione-val.rb +50 -29
  46. data/lib/pione/command/spawner.rb +74 -0
  47. data/lib/pione/front.rb +0 -2
  48. data/lib/pione/front/basic-front.rb +48 -26
  49. data/lib/pione/front/broker-front.rb +8 -16
  50. data/lib/pione/front/client-front.rb +10 -18
  51. data/lib/pione/front/front-exception.rb +12 -0
  52. data/lib/pione/front/relay-front.rb +6 -6
  53. data/lib/pione/front/task-worker-front.rb +3 -9
  54. data/lib/pione/front/tuple-space-provider-front.rb +6 -14
  55. data/lib/pione/front/tuple-space-receiver-front.rb +4 -11
  56. data/lib/pione/global.rb +135 -0
  57. data/lib/pione/global/broker-variable.rb +20 -0
  58. data/lib/pione/global/client-variable.rb +18 -0
  59. data/lib/pione/global/input-generator-variable.rb +7 -0
  60. data/lib/pione/global/log-variable.rb +53 -0
  61. data/lib/pione/global/network-variable.rb +7 -0
  62. data/lib/pione/global/package-variable.rb +28 -0
  63. data/lib/pione/global/path-variable.rb +52 -0
  64. data/lib/pione/global/relay-variable.rb +86 -0
  65. data/lib/pione/global/system-variable.rb +39 -0
  66. data/lib/pione/global/task-worker-variable.rb +17 -0
  67. data/lib/pione/global/tuple-space-notifier-variable.rb +60 -0
  68. data/lib/pione/lang.rb +55 -0
  69. data/lib/pione/lang/basic-model.rb +45 -0
  70. data/lib/pione/lang/boolean.rb +86 -0
  71. data/lib/pione/lang/common-parser.rb +202 -0
  72. data/lib/pione/lang/conditional-branch-parser.rb +57 -0
  73. data/lib/pione/lang/conditional-branch-transformer.rb +36 -0
  74. data/lib/pione/lang/conditional-branch.rb +73 -0
  75. data/lib/pione/lang/context-parser.rb +39 -0
  76. data/lib/pione/lang/context-transformer.rb +41 -0
  77. data/lib/pione/lang/context.rb +229 -0
  78. data/lib/pione/lang/data-expr.rb +265 -0
  79. data/lib/pione/lang/declaration-parser.rb +174 -0
  80. data/lib/pione/lang/declaration-transformer.rb +153 -0
  81. data/lib/pione/lang/declaration.rb +322 -0
  82. data/lib/pione/lang/definition.rb +88 -0
  83. data/lib/pione/lang/document-parser.rb +19 -0
  84. data/lib/pione/lang/document-transformer.rb +12 -0
  85. data/lib/pione/lang/environment.rb +344 -0
  86. data/lib/pione/{parser → lang}/error-message.yml +0 -0
  87. data/lib/pione/lang/expr-parser.rb +228 -0
  88. data/lib/pione/{transformer → lang}/expr-transformer.rb +32 -44
  89. data/lib/pione/lang/expr.rb +70 -0
  90. data/lib/pione/lang/feature-expr.rb +425 -0
  91. data/lib/pione/lang/float.rb +104 -0
  92. data/lib/pione/lang/integer.rb +159 -0
  93. data/lib/pione/lang/interpolator-parser.rb +44 -0
  94. data/lib/pione/lang/interpolator-transformer.rb +13 -0
  95. data/lib/pione/lang/keyed-sequence.rb +98 -0
  96. data/lib/pione/lang/lang-exception.rb +224 -0
  97. data/lib/pione/lang/literal-parser.rb +134 -0
  98. data/lib/pione/lang/literal-transformer.rb +171 -0
  99. data/lib/pione/lang/message.rb +41 -0
  100. data/lib/pione/lang/ordinal-sequence.rb +203 -0
  101. data/lib/pione/lang/package-expr.rb +86 -0
  102. data/lib/pione/lang/parameters.rb +121 -0
  103. data/lib/pione/lang/piece.rb +42 -0
  104. data/lib/pione/{model → lang}/pione-method.rb +26 -63
  105. data/lib/pione/lang/rule-expr.rb +70 -0
  106. data/lib/pione/lang/sequence.rb +215 -0
  107. data/lib/pione/lang/string.rb +116 -0
  108. data/lib/pione/lang/ticket-expr.rb +48 -0
  109. data/lib/pione/{model → lang}/type.rb +70 -99
  110. data/lib/pione/lang/variable.rb +35 -0
  111. data/lib/pione/location.rb +13 -1
  112. data/lib/pione/{uri-scheme → location}/broadcast-scheme.rb +2 -2
  113. data/lib/pione/location/data-location.rb +22 -5
  114. data/lib/pione/location/dropbox-location.rb +10 -8
  115. data/lib/pione/{uri-scheme → location}/dropbox-scheme.rb +2 -2
  116. data/lib/pione/location/ftp-location.rb +6 -0
  117. data/lib/pione/location/git-repository-location.rb +6 -17
  118. data/lib/pione/{uri-scheme → location}/git-scheme.rb +2 -2
  119. data/lib/pione/location/http-location.rb +8 -1
  120. data/lib/pione/location/local-location.rb +57 -4
  121. data/lib/pione/{uri-scheme → location}/local-scheme.rb +2 -2
  122. data/lib/pione/location/{exception.rb → location-exception.rb} +13 -1
  123. data/lib/pione/{uri-scheme/basic-scheme.rb → location/location-scheme.rb} +7 -6
  124. data/lib/pione/{uri-scheme → location}/myftp-scheme.rb +2 -2
  125. data/lib/pione/log.rb +7 -6
  126. data/lib/pione/log/debug.rb +75 -0
  127. data/lib/pione/log/domain-log.rb +4 -5
  128. data/lib/pione/log/message-log.rb +2 -2
  129. data/lib/pione/log/process-log.rb +16 -25
  130. data/lib/pione/log/process-record.rb +1 -0
  131. data/lib/pione/log/system-log.rb +165 -55
  132. data/lib/pione/package.rb +21 -0
  133. data/lib/pione/package/document.rb +27 -0
  134. data/lib/pione/package/package-archiver.rb +152 -0
  135. data/lib/pione/package/package-cache.rb +79 -0
  136. data/lib/pione/package/package-database.rb +121 -0
  137. data/lib/pione/package/package-exception.rb +38 -0
  138. data/lib/pione/{component → package}/package-expander.rb +13 -7
  139. data/lib/pione/package/package-filename.rb +46 -0
  140. data/lib/pione/package/package-handler.rb +106 -0
  141. data/lib/pione/package/package-info.rb +72 -0
  142. data/lib/pione/package/package-reader.rb +202 -0
  143. data/lib/pione/package/package-scanner.rb +133 -0
  144. data/lib/pione/package/scenario-handler.rb +95 -0
  145. data/lib/pione/package/scenario-info.rb +34 -0
  146. data/lib/pione/package/scenario-reader.rb +29 -0
  147. data/lib/pione/package/scenario-scanner.rb +96 -0
  148. data/lib/pione/patch.rb +0 -1
  149. data/lib/pione/patch/drb-patch.rb +377 -298
  150. data/lib/pione/patch/rinda-patch.rb +4 -3
  151. data/lib/pione/relay/relay-socket.rb +1 -4
  152. data/lib/pione/rule-engine.rb +27 -0
  153. data/lib/pione/{rule-handler → rule-engine}/action-handler.rb +41 -40
  154. data/lib/pione/rule-engine/basic-handler.rb +266 -0
  155. data/lib/pione/rule-engine/data-finder.rb +97 -0
  156. data/lib/pione/{rule-handler → rule-engine}/empty-handler.rb +2 -3
  157. data/lib/pione/rule-engine/engine-exception.rb +33 -0
  158. data/lib/pione/rule-engine/flow-handler.rb +490 -0
  159. data/lib/pione/{rule-handler → rule-engine}/root-handler.rb +5 -14
  160. data/lib/pione/{rule-handler → rule-engine}/system-handler.rb +1 -1
  161. data/lib/pione/rule-engine/update-criteria.rb +111 -0
  162. data/lib/pione/system.rb +3 -1
  163. data/lib/pione/system/config.rb +12 -45
  164. data/lib/pione/system/domain-info.rb +3 -12
  165. data/lib/pione/system/init.rb +2 -8
  166. data/lib/pione/system/system-exception.rb +29 -0
  167. data/lib/pione/test-helper.rb +43 -0
  168. data/lib/pione/test-helper/command-helper.rb +65 -0
  169. data/lib/pione/test-helper/extension.rb +9 -0
  170. data/lib/pione/test-helper/lang-helper.rb +196 -0
  171. data/lib/pione/test-helper/location-helper.rb +27 -0
  172. data/lib/pione/test-helper/package-helper.rb +11 -0
  173. data/lib/pione/test-helper/parser-helper.rb +45 -0
  174. data/lib/pione/test-helper/transformer-helper.rb +136 -0
  175. data/lib/pione/test-helper/tuple-helper.rb +13 -0
  176. data/lib/pione/test-helper/tuple-space-helper.rb +31 -0
  177. data/lib/pione/test-helper/webserver.rb +50 -0
  178. data/lib/pione/tuple-space.rb +4 -6
  179. data/lib/pione/{tuple → tuple-space}/basic-tuple.rb +63 -50
  180. data/lib/pione/tuple-space/tuple-definition.yml +165 -0
  181. data/lib/pione/tuple-space/tuple-space-exception.rb +25 -0
  182. data/lib/pione/tuple-space/tuple-space-interface.rb +123 -0
  183. data/lib/pione/tuple-space/tuple-space-server.rb +15 -26
  184. data/lib/pione/util.rb +16 -11
  185. data/lib/pione/util/backslash-notation.rb +11 -0
  186. data/lib/pione/util/digest.rb +71 -0
  187. data/lib/pione/util/embeded-expr-expander.rb +23 -0
  188. data/lib/pione/util/evaluatable.rb +9 -6
  189. data/lib/pione/util/free-thread-generator.rb +46 -0
  190. data/lib/pione/util/ftp-server.rb +3 -4
  191. data/lib/pione/util/id.rb +28 -23
  192. data/lib/pione/util/misc.rb +22 -4
  193. data/lib/pione/util/package-parameters-list.rb +12 -9
  194. data/lib/pione/{parser → util}/parslet-extension.rb +75 -64
  195. data/lib/pione/util/positionable.rb +65 -0
  196. data/lib/pione/util/zip.rb +12 -11
  197. data/lib/pione/version.rb +1 -1
  198. data/{test → misc}/endurance-test/graph.plt +0 -0
  199. data/{test → misc}/endurance-test/run.sh +0 -0
  200. data/pione.gemspec +45 -37
  201. data/test/agent/spec_basic-agent.rb +116 -99
  202. data/test/agent/spec_broker.rb +41 -25
  203. data/test/agent/spec_input-generator.rb +66 -57
  204. data/test/agent/spec_job-terminator.rb +27 -0
  205. data/test/agent/spec_logger.rb +28 -25
  206. data/test/agent/spec_messenger.rb +6 -6
  207. data/test/agent/spec_task-worker.rb +97 -246
  208. data/test/agent/spec_tuple-space-client.rb +19 -15
  209. data/test/agent/spec_tuple-space-provider.rb +26 -0
  210. data/test/agent/spec_tuple-space-receiver.rb +47 -0
  211. data/test/command/command-behavior.rb +2 -2
  212. data/test/command/data/PionePackageP1/P1.pione +9 -0
  213. data/test/command/data/PionePackageP1/pione-package.json +15 -0
  214. data/test/command/data/PionePackageP2/P2.pione +10 -0
  215. data/test/command/data/PionePackageP2/pione-package.json +16 -0
  216. data/test/command/data/PionePackageP3/P3.pione +10 -0
  217. data/test/command/data/PionePackageP3/pione-package.json +16 -0
  218. data/test/command/data/PionePackageP4/P4.pione +10 -0
  219. data/test/command/data/PionePackageP4/pione-package.json +17 -0
  220. data/test/command/data/pione-process.log +471 -0
  221. data/test/command/data/pione-val.domain.dump +0 -0
  222. data/test/command/spec_pione-clean.rb +12 -0
  223. data/test/command/spec_pione-client.rb +6 -6
  224. data/test/command/spec_pione-log.rb +28 -0
  225. data/test/command/spec_pione-package.rb +111 -12
  226. data/test/command/spec_pione-val.rb +4 -4
  227. data/test/lang/data/boolean.yml +134 -0
  228. data/test/lang/data/common-parser.yml +187 -0
  229. data/test/{parser/spec_flow-element-parser.yml → lang/data/conditional-branch-parser.yml} +12 -50
  230. data/test/lang/data/context-parser.yml +148 -0
  231. data/test/lang/data/data-expr.yml +93 -0
  232. data/test/lang/data/data-expr_match.yml +59 -0
  233. data/test/lang/data/declaration-parser.yml +279 -0
  234. data/test/lang/data/document-parser.yml +29 -0
  235. data/test/{parser/spec_expr-parser.yml → lang/data/expr-parser.yml} +9 -11
  236. data/test/lang/data/feature-expr.yml +148 -0
  237. data/test/lang/data/float.yml +30 -0
  238. data/test/lang/data/integer.yml +80 -0
  239. data/test/lang/data/interpolator-parser.yml +61 -0
  240. data/test/lang/data/keyed-sequence.yml +27 -0
  241. data/test/lang/data/literal-parser.yml +207 -0
  242. data/test/lang/data/parameter-set.yml +14 -0
  243. data/test/lang/data/rule-expr.yml +27 -0
  244. data/test/lang/data/sequence.yml +66 -0
  245. data/test/lang/data/string.yml +92 -0
  246. data/test/{model/spec_ticket-expr.yml → lang/data/ticket-expr.yml} +0 -0
  247. data/test/lang/spec_boolean.rb +5 -0
  248. data/test/{parser → lang}/spec_common-parser.rb +10 -32
  249. data/test/lang/spec_conditional-branch-parser.rb +5 -0
  250. data/test/lang/spec_conditional-branch-transformer.rb +97 -0
  251. data/test/lang/spec_conditional-branch.rb +176 -0
  252. data/test/lang/spec_context-parser.rb +5 -0
  253. data/test/lang/spec_context-transformer.rb +206 -0
  254. data/test/lang/spec_context.rb +283 -0
  255. data/test/lang/spec_data-expr.rb +198 -0
  256. data/test/lang/spec_declaration-parser.rb +5 -0
  257. data/test/lang/spec_declaration-transformer.rb +272 -0
  258. data/test/lang/spec_declaration.rb +550 -0
  259. data/test/lang/spec_document-parser.rb +5 -0
  260. data/test/lang/spec_document-transformer.rb +10 -0
  261. data/test/lang/spec_environment.rb +129 -0
  262. data/test/lang/spec_expr-parser.rb +6 -0
  263. data/test/lang/spec_expr-transformer.rb +149 -0
  264. data/test/lang/spec_feature-expr.rb +5 -0
  265. data/test/lang/spec_float.rb +23 -0
  266. data/test/lang/spec_integer.rb +29 -0
  267. data/test/lang/spec_interpolator-parser.rb +5 -0
  268. data/test/lang/spec_interpolator-transformer.rb +15 -0
  269. data/test/lang/spec_keyed-sequence.rb +5 -0
  270. data/test/lang/spec_literal-parser.rb +5 -0
  271. data/test/lang/spec_literal-transformer.rb +111 -0
  272. data/test/lang/spec_message.rb +22 -0
  273. data/test/lang/spec_package-expr.rb +19 -0
  274. data/test/lang/spec_parameter-set.rb +64 -0
  275. data/test/lang/spec_pione-method.rb +57 -0
  276. data/test/lang/spec_rule-expr.rb +18 -0
  277. data/test/lang/spec_sequence.rb +5 -0
  278. data/test/lang/spec_string.rb +5 -0
  279. data/test/lang/spec_ticket-expr.rb +39 -0
  280. data/test/lang/spec_variable.rb +29 -0
  281. data/test/{uri-scheme/spec_myftp-scheme.yml → location/data/myftp-scheme.yml} +0 -0
  282. data/test/location/location-behavior.rb +2 -2
  283. data/test/location/spec_basic-location.rb +5 -1
  284. data/test/{uri-scheme → location}/spec_broadcast-scheme.rb +4 -4
  285. data/test/{uri-scheme → location}/spec_dropbox-scheme.rb +3 -3
  286. data/test/location/spec_ftp-location.rb +3 -2
  287. data/test/location/spec_git-repository-location.rb +19 -19
  288. data/test/{uri-scheme → location}/spec_git-scheme.rb +2 -2
  289. data/test/location/spec_http-location.rb +4 -12
  290. data/test/location/spec_https-location.rb +1 -3
  291. data/test/location/spec_local-location.rb +1 -1
  292. data/test/{uri-scheme → location}/spec_local-scheme.rb +3 -3
  293. data/test/{uri-scheme → location}/spec_myftp-scheme.rb +8 -10
  294. data/test/log/spec_debug.rb +53 -0
  295. data/test/log/spec_domain-log.rb +4 -5
  296. data/test/log/spec_message-log.rb +39 -33
  297. data/test/log/spec_process-log.rb +4 -2
  298. data/test/log/spec_process-record.rb +12 -10
  299. data/test/log/spec_system-log.rb +29 -11
  300. data/test/log/spec_xes-log.rb +6 -4
  301. data/test/package/data/HelloWorld+v0.1.1.ppg +0 -0
  302. data/test/package/data/HelloWorld-gitrepos.zip +0 -0
  303. data/test/{test-data/package → package/data}/HelloWorld/HelloWorld.pione +3 -0
  304. data/test/package/data/HelloWorld/pione-package.json +16 -0
  305. data/test/package/data/HelloWorld/scenario/Scenario.pione +2 -0
  306. data/test/{test-data/package → package/data}/HelloWorld/scenario/output/message.txt +0 -0
  307. data/test/package/data/HelloWorld/scenario/pione-scenario.json +10 -0
  308. data/test/{test-data/package → package/data}/HelloWorld/scenario/scenario.yml +0 -0
  309. data/test/package/data/PackageScannerP1/P1.pione +11 -0
  310. data/test/package/data/PackageScannerP2/P2.pione +9 -0
  311. data/test/package/data/PackageScannerP3/P3.pione +17 -0
  312. data/test/package/data/PackageScannerP4/.Ignore.pione +1 -0
  313. data/test/package/data/PackageScannerP4/Doc1.pione +8 -0
  314. data/test/package/data/PackageScannerP4/Doc2.pione +6 -0
  315. data/test/package/data/PackageScannerP4/Doc3.pione +6 -0
  316. data/test/package/data/PackageScannerP4/P4.pione +8 -0
  317. data/test/package/data/PackageScannerP4/sub1/.Ignore.pione +1 -0
  318. data/test/package/data/PackageScannerP4/sub1/Doc4.pione +6 -0
  319. data/test/package/data/PackageScannerP4/sub1/sub1-1/.Ignore.pione +1 -0
  320. data/test/package/data/PackageScannerP4/sub1/sub1-1/Doc5.pione +6 -0
  321. data/test/package/data/PackageScannerP4/sub2/.Ignore.pione +1 -0
  322. data/test/package/data/PackageScannerP4/sub2/sub2-1/.Ignore.pione +1 -0
  323. data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-1/.Ignore.pione +1 -0
  324. data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-1/Doc6.pione +6 -0
  325. data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-2/.Ignore.pione +1 -0
  326. data/test/package/data/PackageScannerP4/sub2/sub2-1/sub2-1-2/Doc7.pione +6 -0
  327. data/test/package/data/PackageScannerP5/P5.pione +8 -0
  328. data/test/{model/spec_feature-expr.yml → package/data/PackageScannerP5/scenario1/Scenario.pione} +0 -0
  329. data/test/package/data/PackageScannerP5/scenario2/Scenario.pione +0 -0
  330. data/test/package/data/PackageScannerP5/scenario3/Scenario.pione +0 -0
  331. data/test/package/data/PackageScannerP5/sub1/scenario4/Scenario.pione +0 -0
  332. data/test/package/data/PackageScannerP5/sub1/sub1-1/scenario5/Scenario.pione +0 -0
  333. data/test/package/data/PackageScannerP5/sub2/sub2-1/sub2-1-1/scenario6/Scenario.pione +0 -0
  334. data/test/package/data/PackageScannerP5/sub2/sub2-1/sub2-1-2/scenario7/Scenario.pione +0 -0
  335. data/test/package/data/ScenarioScannerS1/Scenario.pione +1 -0
  336. data/test/package/data/ScenarioScannerS1/input/i1 +0 -0
  337. data/test/package/data/ScenarioScannerS1/input/i2 +0 -0
  338. data/test/package/data/ScenarioScannerS1/input/i3 +0 -0
  339. data/test/package/data/ScenarioScannerS1/output/o1 +0 -0
  340. data/test/package/data/ScenarioScannerS1/output/o2 +0 -0
  341. data/test/package/data/ScenarioScannerS1/output/o3 +0 -0
  342. data/test/package/data/ScenarioScannerS2/Scenario.pione +1 -0
  343. data/test/package/data/ScenarioScannerS2/output/o1 +0 -0
  344. data/test/package/data/ScenarioScannerS3/Scenario.pione +2 -0
  345. data/test/package/data/ScenarioScannerS4/Scenario.pione +0 -0
  346. data/test/package/data/ScenarioScannerS5/Scenario.pione +2 -0
  347. data/test/package/data/ScenarioScannerS6/Scenario.pione +5 -0
  348. data/test/package/data/ScenarioScannerS8/Scenario.pione +1 -0
  349. data/test/{test-data/package → package/data}/TestPackage1+v0.1.0.ppg +0 -0
  350. data/test/{test-data/package → package/data}/TestPackage1/Test.pione +3 -0
  351. data/test/{test-data/package → package/data}/TestPackage1/bin/count +0 -0
  352. data/test/{test-data/package → package/data}/TestPackage1/package.yml +0 -0
  353. data/test/package/data/TestPackage1/pione-package.json +18 -0
  354. data/test/package/data/TestPackage1/scenario/case1/Scenario.pione +1 -0
  355. data/test/{test-data/package → package/data}/TestPackage1/scenario/case1/input/1.txt +0 -0
  356. data/test/{test-data/package → package/data}/TestPackage1/scenario/case1/output/1.count +0 -0
  357. data/test/package/data/TestPackage1/scenario/case1/pione-scenario.json +10 -0
  358. data/test/{test-data/package → package/data}/TestPackage1/scenario/case1/scenario.yml +0 -0
  359. data/test/package/data/TestPackage1/scenario/case2/Scenario.pione +1 -0
  360. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/input/1.txt +0 -0
  361. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/input/2.txt +0 -0
  362. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/input/3.txt +0 -0
  363. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/output/1.count +0 -0
  364. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/output/2.count +0 -0
  365. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/output/3.count +0 -0
  366. data/test/package/data/TestPackage1/scenario/case2/pione-scenario.json +14 -0
  367. data/test/{test-data/package → package/data}/TestPackage1/scenario/case2/scenario.yml +0 -0
  368. data/test/package/data/TestPackage1/scenario/case3/Scenario.pione +1 -0
  369. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/input/a.txt +0 -0
  370. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/input/b.txt +0 -0
  371. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/output/a.count +0 -0
  372. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/output/b.count +0 -0
  373. data/test/package/data/TestPackage1/scenario/case3/pione-scenario.json +12 -0
  374. data/test/{test-data/package → package/data}/TestPackage1/scenario/case3/scenario.yml +0 -0
  375. data/test/{component → package}/spec_document.pione +0 -0
  376. data/test/package/spec_document.rb +52 -0
  377. data/test/package/spec_package-archiver.rb +31 -0
  378. data/test/package/spec_package-database.rb +42 -0
  379. data/test/package/spec_package-expander.rb +14 -0
  380. data/test/package/spec_package-filename.rb +56 -0
  381. data/test/package/spec_package-handler.rb +50 -0
  382. data/test/package/spec_package-info.rb +22 -0
  383. data/test/package/spec_package-reader.rb +85 -0
  384. data/test/package/spec_package-scanner.rb +68 -0
  385. data/test/package/spec_scenario-handler.rb +46 -0
  386. data/test/package/spec_scenario-info.rb +16 -0
  387. data/test/package/spec_scenario-scanner.rb +92 -0
  388. data/test/patch/spec_rinda-patch.rb +1 -1
  389. data/test/patch/spec_uri-patch.rb +1 -1
  390. data/test/{rule-handler → rule-engine}/spec_action-handler.pione +0 -0
  391. data/test/rule-engine/spec_action-handler.rb +94 -0
  392. data/test/rule-engine/spec_data-finder.rb +94 -0
  393. data/test/{tuple-space → rule-engine}/spec_data-finder.yml +39 -28
  394. data/test/rule-engine/spec_empty-handler.rb +170 -0
  395. data/test/{rule-handler → rule-engine}/spec_flow-handler.pione +0 -0
  396. data/test/rule-engine/spec_flow-handler.rb +421 -0
  397. data/test/{rule-handler → rule-engine}/spec_update-criteria.pione +0 -0
  398. data/test/{rule-handler → rule-engine}/spec_update-criteria.rb +16 -12
  399. data/test/{rule-handler → rule-engine}/spec_update-criteria.yml +0 -0
  400. data/test/system/spec_domain-info.rb +13 -9
  401. data/test/system/spec_file-cache.rb +9 -9
  402. data/test/tuple-space/spec_tuple-space-server.rb +42 -40
  403. data/test/tuple/spec_basic-tuple.rb +77 -75
  404. data/test/tuple/spec_data-tuple.rb +4 -4
  405. data/test/tuple/spec_finished-tuple.rb +5 -6
  406. data/test/tuple/spec_message-tuple.rb +3 -3
  407. data/test/tuple/spec_task-tuple.rb +11 -9
  408. data/test/tuple/spec_touch-tuple.rb +3 -3
  409. data/test/tuple/spec_working-tuple.rb +8 -12
  410. data/test/tuple/tuple-behavior.rb +1 -1
  411. data/test/util/data/HelloWorld+v0.1.1.ppg +0 -0
  412. data/test/util/spec_cpu.rb +1 -1
  413. data/test/util/spec_digest.rb +15 -0
  414. data/test/util/spec_evaluatable.rb +3 -3
  415. data/test/util/spec_free-thread-generator.rb +42 -0
  416. data/test/util/spec_ftp-server.rb +4 -9
  417. data/test/util/spec_id.rb +53 -36
  418. data/test/util/spec_indentation.rb +1 -1
  419. data/test/util/spec_ip-address.rb +1 -1
  420. data/test/util/spec_package-parameters-list.rb +10 -9
  421. data/test/util/spec_process-info.rb +2 -2
  422. data/test/util/spec_uuid.rb +1 -1
  423. data/test/util/spec_variable-holdable.rb +1 -1
  424. data/test/util/spec_zip.rb +1 -1
  425. metadata +508 -364
  426. data/example/SerialProcessing/package.yml +0 -5
  427. data/example/SerialProcessing/scenario/scenario.yml +0 -10
  428. data/lib/pione/agent/command-listener.rb +0 -47
  429. data/lib/pione/agent/rule-provider.rb +0 -59
  430. data/lib/pione/agent/trivial-routine-worker.rb +0 -29
  431. data/lib/pione/agent/tuple-space-server-client-life-checker.rb +0 -31
  432. data/lib/pione/command/child-process.rb +0 -56
  433. data/lib/pione/command/daemon-process.rb +0 -10
  434. data/lib/pione/command/front-owner-command.rb +0 -25
  435. data/lib/pione/component.rb +0 -13
  436. data/lib/pione/component/document.rb +0 -88
  437. data/lib/pione/component/package-archiver.rb +0 -92
  438. data/lib/pione/component/package-filename.rb +0 -38
  439. data/lib/pione/component/package-reader.rb +0 -276
  440. data/lib/pione/component/package.rb +0 -199
  441. data/lib/pione/component/rule.rb +0 -206
  442. data/lib/pione/front/task-worker-owner.rb +0 -43
  443. data/lib/pione/front/tuple-space-provider-owner.rb +0 -11
  444. data/lib/pione/model.rb +0 -32
  445. data/lib/pione/model/assignment.rb +0 -120
  446. data/lib/pione/model/basic-model.rb +0 -228
  447. data/lib/pione/model/block.rb +0 -262
  448. data/lib/pione/model/boolean.rb +0 -168
  449. data/lib/pione/model/call-rule.rb +0 -86
  450. data/lib/pione/model/constraints.rb +0 -46
  451. data/lib/pione/model/data-expr.rb +0 -548
  452. data/lib/pione/model/feature-expr.rb +0 -875
  453. data/lib/pione/model/float.rb +0 -105
  454. data/lib/pione/model/integer.rb +0 -166
  455. data/lib/pione/model/keyed-sequence.rb +0 -150
  456. data/lib/pione/model/message.rb +0 -95
  457. data/lib/pione/model/ordinal-sequence.rb +0 -73
  458. data/lib/pione/model/package-expr.rb +0 -53
  459. data/lib/pione/model/parameters.rb +0 -374
  460. data/lib/pione/model/rule-expr.rb +0 -234
  461. data/lib/pione/model/sequence.rb +0 -273
  462. data/lib/pione/model/string.rb +0 -127
  463. data/lib/pione/model/ticket-expr.rb +0 -71
  464. data/lib/pione/model/variable-table.rb +0 -344
  465. data/lib/pione/model/variable.rb +0 -116
  466. data/lib/pione/parser.rb +0 -14
  467. data/lib/pione/parser/block-parser.rb +0 -107
  468. data/lib/pione/parser/common-parser.rb +0 -173
  469. data/lib/pione/parser/document-parser.rb +0 -141
  470. data/lib/pione/parser/expr-parser.rb +0 -354
  471. data/lib/pione/parser/feature-expr-parser.rb +0 -105
  472. data/lib/pione/parser/flow-element-parser.rb +0 -181
  473. data/lib/pione/parser/literal-parser.rb +0 -196
  474. data/lib/pione/parser/rule-definition-parser.rb +0 -158
  475. data/lib/pione/patch/monitor-patch.rb +0 -16
  476. data/lib/pione/rule-handler.rb +0 -14
  477. data/lib/pione/rule-handler/basic-handler.rb +0 -326
  478. data/lib/pione/rule-handler/flow-handler.rb +0 -414
  479. data/lib/pione/rule-handler/update-criteria.rb +0 -175
  480. data/lib/pione/system/global.rb +0 -433
  481. data/lib/pione/transformer.rb +0 -24
  482. data/lib/pione/transformer/block-transformer.rb +0 -28
  483. data/lib/pione/transformer/document-transformer.rb +0 -58
  484. data/lib/pione/transformer/feature-expr-transformer.rb +0 -60
  485. data/lib/pione/transformer/flow-element-transformer.rb +0 -66
  486. data/lib/pione/transformer/literal-transformer.rb +0 -91
  487. data/lib/pione/transformer/rule-definition-transformer.rb +0 -80
  488. data/lib/pione/transformer/transformer-module.rb +0 -39
  489. data/lib/pione/tuple-space/data-finder.rb +0 -155
  490. data/lib/pione/tuple-space/presence-notifier.rb +0 -84
  491. data/lib/pione/tuple-space/tuple-space-provider.rb +0 -85
  492. data/lib/pione/tuple-space/tuple-space-receiver.rb +0 -141
  493. data/lib/pione/tuple-space/tuple-space-server-interface.rb +0 -123
  494. data/lib/pione/tuple.rb +0 -30
  495. data/lib/pione/tuple/agent-tuple.rb +0 -10
  496. data/lib/pione/tuple/attribute-tuple.rb +0 -7
  497. data/lib/pione/tuple/base-location-tuple.rb +0 -9
  498. data/lib/pione/tuple/bye-tuple.rb +0 -9
  499. data/lib/pione/tuple/command-tuple.rb +0 -9
  500. data/lib/pione/tuple/data-null-tuple.rb +0 -14
  501. data/lib/pione/tuple/data-tuple.rb +0 -21
  502. data/lib/pione/tuple/dry-run-tuple.rb +0 -8
  503. data/lib/pione/tuple/exception-tuple.rb +0 -11
  504. data/lib/pione/tuple/finished-tuple.rb +0 -17
  505. data/lib/pione/tuple/foreground-tuple.rb +0 -7
  506. data/lib/pione/tuple/lift-tuple.rb +0 -14
  507. data/lib/pione/tuple/message-tuple.rb +0 -7
  508. data/lib/pione/tuple/process-info-tuple.rb +0 -9
  509. data/lib/pione/tuple/process-log-tuple.rb +0 -13
  510. data/lib/pione/tuple/request-rule-tuple.rb +0 -9
  511. data/lib/pione/tuple/rule-tuple.rb +0 -10
  512. data/lib/pione/tuple/task-tuple.rb +0 -40
  513. data/lib/pione/tuple/task-worker-resource-tuple.rb +0 -9
  514. data/lib/pione/tuple/ticket-tuple.rb +0 -8
  515. data/lib/pione/tuple/touch-tuple.rb +0 -14
  516. data/lib/pione/tuple/working-tuple.rb +0 -13
  517. data/lib/pione/uri-scheme.rb +0 -11
  518. data/lib/pione/util/error-report.rb +0 -27
  519. data/test/agent/spec_command-listener.rb +0 -30
  520. data/test/agent/spec_rule-provider.rb +0 -78
  521. data/test/command/spec_pione-val.domain.dump +0 -0
  522. data/test/component/spec_document.rb +0 -67
  523. data/test/component/spec_package-archiver.rb +0 -27
  524. data/test/component/spec_package-expander.rb +0 -11
  525. data/test/component/spec_package-filename.rb +0 -79
  526. data/test/component/spec_package-reader.rb +0 -100
  527. data/test/component/spec_package.rb +0 -109
  528. data/test/component/spec_rule.rb +0 -140
  529. data/test/model/spec_assignment.rb +0 -52
  530. data/test/model/spec_block.rb +0 -108
  531. data/test/model/spec_boolean.rb +0 -39
  532. data/test/model/spec_boolean.yml +0 -134
  533. data/test/model/spec_call-rule.rb +0 -23
  534. data/test/model/spec_data-expr.rb +0 -361
  535. data/test/model/spec_data-expr.yml +0 -24
  536. data/test/model/spec_data-expr_match.yml +0 -45
  537. data/test/model/spec_feature-expr.rb +0 -333
  538. data/test/model/spec_feature-expr_decide.yml +0 -28
  539. data/test/model/spec_float.rb +0 -23
  540. data/test/model/spec_float.yml +0 -30
  541. data/test/model/spec_integer.rb +0 -23
  542. data/test/model/spec_integer.yml +0 -68
  543. data/test/model/spec_keyed-sequence.rb +0 -5
  544. data/test/model/spec_keyed-sequence.yml +0 -27
  545. data/test/model/spec_message.rb +0 -40
  546. data/test/model/spec_package-expr.rb +0 -19
  547. data/test/model/spec_parameters.rb +0 -103
  548. data/test/model/spec_pione-method.rb +0 -57
  549. data/test/model/spec_rule-expr.rb +0 -28
  550. data/test/model/spec_rule-expr.yml +0 -11
  551. data/test/model/spec_sequence.rb +0 -5
  552. data/test/model/spec_sequence.yml +0 -66
  553. data/test/model/spec_string.rb +0 -47
  554. data/test/model/spec_string.yml +0 -91
  555. data/test/model/spec_ticket-expr.rb +0 -39
  556. data/test/model/spec_variable-table.rb +0 -116
  557. data/test/model/spec_variable.rb +0 -82
  558. data/test/parser/spec_block-parser.rb +0 -5
  559. data/test/parser/spec_block-parser.yml +0 -94
  560. data/test/parser/spec_document-parser.rb +0 -5
  561. data/test/parser/spec_document-parser.yml +0 -77
  562. data/test/parser/spec_expr-parser.rb +0 -6
  563. data/test/parser/spec_feature-expr-parser.rb +0 -32
  564. data/test/parser/spec_feature-expr-parser.yml +0 -25
  565. data/test/parser/spec_flow-element-parser.rb +0 -5
  566. data/test/parser/spec_literal-parser.rb +0 -5
  567. data/test/parser/spec_literal-parser.yml +0 -134
  568. data/test/parser/spec_rule-definition-parser.rb +0 -5
  569. data/test/parser/spec_rule-definition-parser.yml +0 -94
  570. data/test/rule-handler/spec_action-handler.rb +0 -79
  571. data/test/rule-handler/spec_flow-handler.rb +0 -61
  572. data/test/spec_common.rb +0 -14
  573. data/test/spec_object.rb +0 -20
  574. data/test/test-data/package/HelloWorld+v0.1.0.ppg +0 -0
  575. data/test/test-data/package/HelloWorld-gitrepos.zip +0 -0
  576. data/test/test-data/package/HelloWorld/package.yml +0 -6
  577. data/test/test-util.rb +0 -211
  578. data/test/test-util/command.rb +0 -53
  579. data/test/test-util/package.rb +0 -9
  580. data/test/test-util/parser.rb +0 -45
  581. data/test/test-util/transformer.rb +0 -50
  582. data/test/test-util/webserver.rb +0 -43
  583. data/test/transformer/spec_block-transformer.rb +0 -33
  584. data/test/transformer/spec_document-transformer.rb +0 -50
  585. data/test/transformer/spec_expr-transformer.rb +0 -126
  586. data/test/transformer/spec_feature-expr-transformer.rb +0 -21
  587. data/test/transformer/spec_flow-element-transformer.rb +0 -154
  588. data/test/transformer/spec_literal-transformer.rb +0 -64
  589. data/test/transformer/spec_rule-definition-transformer.rb +0 -172
  590. data/test/tuple-space/spec_data-finder.rb +0 -94
  591. data/test/tuple-space/spec_tuple-space-provider.rb +0 -36
  592. data/test/tuple-space/spec_tuple-space-receiver.rb +0 -32
  593. data/test/util/spec_error-report.rb +0 -51
@@ -11,40 +11,26 @@ module Pione
11
11
 
12
12
  # Send a hello message to the tuple space server.
13
13
  def hello
14
- write(to_agent_tuple)
14
+ write(TupleSpace::AgentTuple.new(agent_type: agent_type, uuid: uuid))
15
15
  end
16
16
 
17
17
  # Send a bye message to the tuple space server.
18
18
  def bye
19
19
  Util.ignore_exception do
20
- write(to_bye_tuple)
20
+ take!(TupleSpace::AgentTuple.new(agent_type: agent_type, uuid: uuid))
21
21
  end
22
22
  end
23
23
 
24
- # Makes the agent tuple.
25
- # @return [Tuple::Agent]
26
- # the agent tuple
27
- def to_agent_tuple
28
- Tuple[:agent].new(agent_type: agent_type, uuid: uuid)
29
- end
30
-
31
- # Makes the bye tuple.
32
- # @return [Tuple::Bye]
33
- # the bye tuple
34
- def to_bye_tuple
35
- Tuple[:bye].new(agent_type: agent_type, uuid: uuid)
36
- end
37
-
38
24
  # Notify the agent happened a exception.
39
25
  def notify_exception(e)
40
26
  # ignore exception because the exception caused tuple server is down...
41
27
  Util.ignore_exception do
42
- write(Tuple[:exception].new(uuid, agent_type, e))
28
+ write(TupleSpace::ExceptionTuple.new(uuid, agent_type, e))
43
29
  end
44
30
  end
45
31
 
46
32
  def base_location
47
- read(Tuple[:base_location].any).location
33
+ read(TupleSpace::BaseLocationTuple.any).location
48
34
  end
49
35
 
50
36
  # Protected take.
@@ -81,40 +67,31 @@ module Pione
81
67
  end
82
68
 
83
69
  class TupleSpaceClient < BasicAgent
84
- include TupleSpaceServerInterface
70
+ include TupleSpace::TupleSpaceInterface
85
71
  include TupleSpaceClientOperation
86
72
 
87
73
  # Initialize agent's state.
88
- def initialize(tuple_space_server)
74
+ def initialize(tuple_space)
89
75
  super()
90
- set_tuple_space_server(tuple_space_server)
76
+ set_tuple_space(tuple_space)
91
77
  end
92
78
 
93
- def start
94
- super()
95
- return self
96
- end
79
+ #
80
+ # transitions
81
+ #
97
82
 
98
- # State initialized.
99
- def transit_to_initialized
83
+ def transit_to_init
100
84
  hello
101
85
  end
102
86
 
103
- # State terminated
104
- def transit_to_terminated
87
+ def transit_to_terminate
105
88
  Util.ignore_exception { bye }
106
89
  cancel_current_tuple_entry
107
90
  end
108
91
 
109
- # State error
110
- def transit_to_error(e)
111
- if e
112
- $stderr.puts e
113
- $stderr.puts e.backtrace
114
- end
115
- notify_exception(e)
116
- terminate
117
- end
92
+ #
93
+ # helper methods
94
+ #
118
95
 
119
96
  # Redefine hello method with logging.
120
97
  def hello
@@ -138,7 +115,7 @@ module Pione
138
115
 
139
116
  # Override call transition method with logging.
140
117
  def call_transition_method(*args)
141
- unless [:logger, :command_listener, :messenger].include?(agent_type)
118
+ unless [:logger, :job_terminator, :messenger].include?(agent_type)
142
119
  record = Log::AgentActivityProcessRecord.new.tap do |rec|
143
120
  rec.agent_type = agent_type
144
121
  rec.agent_uuid = uuid
@@ -0,0 +1,66 @@
1
+ module Pione
2
+ module Agent
3
+ # TupleSpaceProvider is an agent that provides tuple space.
4
+ class TupleSpaceProvider < BasicAgent
5
+ set_agent_type :tuple_space_provider, self
6
+
7
+ #
8
+ # instance methods
9
+ #
10
+
11
+ def initialize(front)
12
+ super()
13
+ @front = front
14
+ @reference = Marshal.dump(/druby:\/\/(.*):(\d+)/.match(@front.uri)[2].to_i)
15
+ end
16
+
17
+ #
18
+ # agent activities
19
+ #
20
+
21
+ define_transition :send_packet
22
+ define_transition :sleep
23
+
24
+ chain :init => :send_packet
25
+ chain :send_packet => :sleep
26
+ chain :sleep => :send_packet
27
+
28
+ #
29
+ # transitions
30
+ #
31
+
32
+ def transit_to_send_packet
33
+ send_packet
34
+ end
35
+
36
+ def transit_to_sleep
37
+ sleep 5
38
+ end
39
+
40
+ #
41
+ # helper methods
42
+ #
43
+
44
+ # Send presence notification packets to tuple space receivers.
45
+ def send_packet
46
+ # open a UDP socket
47
+ socket = UDPSocket.open
48
+ socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
49
+
50
+ # send broadcast packets
51
+ Global.presence_notification_addresses.each do |address|
52
+ begin
53
+ Log::Debug.presence_notification do
54
+ "provider sends presence notification packet from %s to %s" % [@front.uri, address, Time.now]
55
+ end
56
+ socket.send(@reference, 0, address.host, address.port)
57
+ rescue => e
58
+ Log::SystemLog.warn("tuple space provider agent failed to send a packet: %s" % e.message)
59
+ end
60
+ end
61
+ ensure
62
+ socket.close
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,137 @@
1
+ module Pione
2
+ module Agent
3
+ class TupleSpaceReceiver < BasicAgent
4
+ #
5
+ # instance methods
6
+ #
7
+
8
+ # notification handler threads
9
+ attr_reader :notification_handlers
10
+
11
+ def initialize(broker_front)
12
+ super()
13
+ @broker_front = broker_front # broker front
14
+ @tuple_space = {} # tuple space table
15
+ @tuple_space_lock = Mutex.new # lock for tuple space table
16
+ @notification_handlers = ThreadGroup.new
17
+ end
18
+
19
+ def tuple_spaces
20
+ @tuple_space_lock.synchronize {@tuple_space.keys}
21
+ end
22
+
23
+ #
24
+ # agent activities
25
+ #
26
+
27
+ define_transition :receive_packet
28
+ define_transition :update_broker
29
+ define_transition :sleep
30
+
31
+ chain :init => [:receive_packet, :update_broker]
32
+ chain :receive_packet => :receive_packet
33
+ chain :update_broker => :sleep
34
+ chain :sleep => :update_broker
35
+
36
+ #
37
+ # transitions
38
+ #
39
+
40
+ def transit_to_init
41
+ @tuple_space = {}
42
+ @socket = open_socket
43
+ end
44
+
45
+ # Receive tuple space servers and update the table.
46
+ def transit_to_receive_packet
47
+ # receive a presence notification
48
+ data, addr = @socket.recvfrom(1024)
49
+ ip_address = addr[3]
50
+ port = Marshal.load(data).to_i
51
+
52
+ # handle the notification in new thread
53
+ thread = Util::FreeThreadGenerator.generate do
54
+ handle_presence_notification(ip_address, port)
55
+ end
56
+ @notification_handlers.add(thread)
57
+ rescue IOError => e
58
+ Log::Debug.presence_notification("receiver agent received bad data from %s, so it ignored and reopen socket" % ip_address)
59
+ reopen_socket
60
+ end
61
+
62
+ # Close receiver socket.
63
+ def transit_to_terminate
64
+ # kill threads of presence notification handler
65
+ @notification_handlers.list.each {|thread| thread.kill.join}
66
+ # close socket
67
+ @socket.close unless @socket.closed?
68
+ end
69
+
70
+ def transit_to_update_broker
71
+ # update tuple space server list
72
+ @tuple_space_lock.synchronize do
73
+ # check timespan
74
+ @tuple_space.delete_if do |server, time|
75
+ (Time.now - time) > Global.tuple_space_receiver_disconnect_time
76
+ end
77
+ end
78
+
79
+ # update broker's tuple spaces
80
+ timeout(3) do
81
+ @tuple_space_lock.synchronize do
82
+ @broker_front.update_tuple_space_list(@tuple_space.keys)
83
+ end
84
+ end
85
+ rescue DRb::DRbConnError, Timeout::Error => e
86
+ Log::SystemLog.fatal("tuple space receiver failed to connect pione-broker: %s" % e.message)
87
+ raise ConnectionError.new
88
+ end
89
+
90
+ def transit_to_sleep
91
+ sleep 1
92
+ end
93
+
94
+ #
95
+ # helper methods
96
+ #
97
+
98
+ private
99
+
100
+ # Open a receiver socket.
101
+ def open_socket
102
+ socket = UDPSocket.open
103
+ socket.bind(Socket::INADDR_ANY, Global.presence_port)
104
+ socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
105
+ return socket
106
+ end
107
+
108
+ def reopen_socket
109
+ @socket.close
110
+ @socket = open_socket
111
+ end
112
+
113
+ def handle_presence_notification(ip_address, port)
114
+ # build a reference to provider front
115
+ provider_front = DRbObject.new_with_uri("druby://%s:%s" % [ip_address, port])
116
+
117
+ # check connection
118
+ Timeout.timeout(3) {provider_front.ping}
119
+
120
+ @tuple_space_lock.synchronize do
121
+ @tuple_space[provider_front.tuple_space] = Time.now
122
+ end
123
+
124
+ Log::Debug.presence_notification do
125
+ "receiver agent received a presence notification from provider \"%s\"" % provider_front.__drburi
126
+ end
127
+ rescue Timeout::Error
128
+ Log::Debug.presence_notification do
129
+ "receiver agent ignored the provider \"%s\" that seems to be something bad " % provider_front.__drburi
130
+ end
131
+ rescue DRb::DRbConnError, DRbPatch::ReplyReaderError => e
132
+ reopen_socket
133
+ Log::Debug.presence_notification("tuple space receiver disconnected: %s" % e)
134
+ end
135
+ end
136
+ end
137
+ end
data/lib/pione/command.rb CHANGED
@@ -3,11 +3,10 @@ module Pione
3
3
  module Command; end
4
4
  end
5
5
 
6
+ require 'pione/command/command-exception'
7
+ require 'pione/command/spawner'
6
8
  require 'pione/command/option'
7
9
  require 'pione/command/basic-command'
8
- require 'pione/command/front-owner-command'
9
- require 'pione/command/daemon-process'
10
- require 'pione/command/child-process'
11
10
  require 'pione/command/pione-client'
12
11
  require 'pione/command/pione-task-worker'
13
12
  require 'pione/command/pione-broker'
@@ -1,253 +1,393 @@
1
1
  module Pione
2
2
  module Command
3
- # CommandInfo is a strage of program informations.
4
- class CommandInfo
5
- attr_reader :name
6
- attr_reader :tail
7
- attr_reader :banner
8
-
9
- def initialize
10
- @name = nil
11
- @tail = nil
12
- @banner = banner
13
- end
14
-
15
- # Set progaram name.
16
- #
17
- # @param name [String]
18
- # process name
19
- # @param b [Proc]
20
- # process tail block
21
- # @return [void]
22
- def set_name(name, &b)
23
- @name = name
24
- end
25
-
26
- # Set program parameters.
27
- def set_tail(&tail)
28
- @tail = tail
29
- end
30
-
31
- # Set program banner.
32
- #
33
- # @param banner [String]
34
- # banner message
35
- # @return [void]
36
- def set_banner(banner)
37
- @banner = banner
38
- end
39
-
40
- # Setup program name. If the setup process is failed, program name is not
41
- # changed.
42
- #
43
- # @param cmd [BasicCommand]
44
- # command
45
- # @return [void]
46
- def setup(cmd)
47
- $PROGRAM_NAME = "%s %s" % [@name, @tail ? @tail.call(cmd) : ""]
48
- end
49
- end
50
-
51
- # BasicCommand is a base class for PIONE commands.
52
- class BasicCommand < PioneObject
53
- @info = CommandInfo.new
54
- @option = Option.new(@info.name, @info.banner)
55
- @pre_preparations = []
56
- @preparations = []
57
- @post_preparations = []
58
- @pre_starts = []
59
- @starts = []
60
- @post_starts = []
61
- @pre_terminations = []
62
- @terminations = []
63
- @post_terminations =[]
64
-
3
+ # BasicCommand provides PIONE command model. PIONE commands have 4 phases:
4
+ # "init", "setup", "action", "termination". Concrete commands implement some
5
+ # processings as each phases.
6
+ class BasicCommand
65
7
  class << self
66
- attr_reader :info
67
- attr_reader :option
68
- attr_reader :pre_preparations
69
- attr_reader :preparations
70
- attr_reader :post_preparations
71
- attr_reader :pre_starts
72
- attr_reader :starts
73
- attr_reader :post_starts
74
- attr_reader :pre_terminations
75
- attr_reader :terminations
76
- attr_reader :post_terminations
77
-
78
- # @api private
8
+ attr_reader :option_definition
9
+ attr_reader :phase_option
10
+ attr_reader :command_name_block
11
+ attr_reader :command_front_block
12
+ attr_reader :init_actions
13
+ attr_reader :setup_actions
14
+ attr_reader :execution_actions
15
+ attr_reader :termination_actions
16
+ attr_reader :exception_handler
17
+
79
18
  def inherited(subclass)
80
- parent_option = self.option
81
19
  subclass.instance_eval do
82
- @info = CommandInfo.new
83
- @option = Option.new(@info.name, @info.banner)
20
+ @phase_option = {:init => {}, :setup => {}, :execution => {}, :termination => {}}
21
+ @option_definition = OptionDefinition.new
22
+ @command_name = nil
23
+ @command_name_block = nil
24
+ @command_banner = nil
25
+ @command_front = nil
26
+ @command_front_block = nil
27
+ @init_actions = Array.new
28
+ @setup_actions = Array.new
29
+ @execution_actions = Array.new
30
+ @termination_actions = Array.new
31
+ @exception_handler = {:init => {}, :setup => {}, :execution => {}, :termination => {}}
32
+
33
+ # define init phase actions
34
+ init :process_name
35
+ init :signal_trap
36
+ init :option
37
+ init :front
38
+ init :process_additional_information
84
39
  end
85
- setter = lambda{|name, data| subclass.instance_variable_set(name, data.clone)}
86
- setter.call(:@pre_preparations, self.pre_preparations)
87
- setter.call(:@preparations, self.preparations)
88
- setter.call(:@post_preparations, self.post_preparations)
89
- setter.call(:@pre_starts, self.pre_starts)
90
- setter.call(:@starts, self.starts)
91
- setter.call(:@post_starts, self.post_starts)
92
- setter.call(:@pre_terminations, self.pre_terminations)
93
- setter.call(:@terminations, self.terminations)
94
- setter.call(:@post_terminations, self.post_terminations)
95
- end
96
-
97
- # Define command informations.
98
- #
99
- # @param b [Proc]
100
- # evaluation content in the context of option definition
101
- # @return [void]
102
- #
103
- # @example
104
- # class Cmd < BasicCommand
105
- # define_info do
106
- # set_name "test" # set process name
107
- # set_banner "sample" # set banner message
108
- # end
109
- # end
110
- def define_info(&b)
111
- @info.instance_eval(&b)
112
- end
113
-
114
- # Define command option.
115
- #
116
- # @param b [Proc]
117
- # context of the option definition
118
- #
119
- # @example
120
- # class Cmd < BasicCommand
121
- # define_option do
122
- # option("-t", "--test", "test option") do |data, arg1|
123
- # data[:test] = true
124
- # end
125
- # end
126
- # end
127
- def define_option(&b)
128
- @option.instance_eval(&b)
129
- end
130
-
131
- # Define a preparation process.
132
- #
133
- # @param type [Symbol]
134
- # preparation type
135
- # @return [void]
136
- def prepare(type=nil, &b)
137
- case type
138
- when :pre
139
- @pre_preparations << b
140
- when :post
141
- @post_preparations << b
40
+ end
41
+
42
+ # Set progaram name or return the name.
43
+ def command_name(name=nil, &b)
44
+ if name
45
+ @command_name = name
46
+ @command_name_block = block_given? ? b : nil
142
47
  else
143
- @preparations << b
48
+ @command_name
144
49
  end
145
50
  end
146
51
 
147
- # Define a start process.
148
- #
149
- # @param type [Symbol]
150
- # start type
151
- # @return [void]
152
- def start(type=nil, &b)
153
- case type
154
- when :pre
155
- @pre_starts << b
156
- when :post
157
- @post_starts << b
52
+ # Set program banner or return the banner.
53
+ def command_banner(banner=nil)
54
+ if banner
55
+ @command_banner = banner
158
56
  else
159
- @starts << b
57
+ @command_banner
160
58
  end
161
59
  end
162
60
 
163
- # Define a termination process.
164
- #
165
- # @param type [Symbol]
166
- # termination type
167
- # @return [void]
168
- def terminate(type=nil, &b)
169
- case type
170
- when :pre
171
- @pre_terminations << b
172
- when :post
173
- @post_terminations << b
61
+ # Set command front or return the front class.
62
+ def command_front(front_class=nil, &b)
63
+ if front_class
64
+ @command_front = front_class
65
+ @command_front_block = b
174
66
  else
175
- @terminations << b
67
+ @command_front
176
68
  end
177
69
  end
178
70
 
179
- # Run the command.
180
- #
181
- # @return [void]
71
+ forward :@option_definition, :use, :use_option
72
+ forward :@option_definition, :define, :define_option
73
+ forward :@option_definition, :item, :option_item
74
+ forward :@option_definition, :default, :option_default
75
+ forward :@option_definition, :validate, :validate_option
76
+
77
+ # Run the command with the arguments.
182
78
  def run(argv)
183
79
  self.new(argv).run
184
80
  end
81
+
82
+ # Set setup phase options.
83
+ def init_phase(option)
84
+ set_phase_option(:init, option)
85
+ end
86
+
87
+ # Set setup phase options.
88
+ def setup_phase(option)
89
+ set_phase_option(:setup, option)
90
+ end
91
+
92
+ # Set execution phase options.
93
+ def execution_phase(option)
94
+ set_phase_option(:execution, option)
95
+ end
96
+
97
+ # Set termination phase options.
98
+ def termination_phase(option)
99
+ set_phase_option(:termination, option)
100
+ end
101
+
102
+ # Register the action to init phase.
103
+ def init(action, option={})
104
+ register_action(@init_actions, action, option)
105
+ end
106
+
107
+ # Register the action to setup phase.
108
+ def setup(action, option={})
109
+ register_action(@setup_actions, action, option)
110
+ end
111
+
112
+ # Register the action to execution phase.
113
+ def execute(action, option={})
114
+ register_action(@execution_actions, action, option)
115
+ end
116
+
117
+ # Register the action to termination phase.
118
+ def terminate(action, option={})
119
+ register_action(@termination_actions, action, option)
120
+ end
121
+
122
+ def handle_exception(phase_name, exceptions, &action)
123
+ exceptions.each {|e| @exception_handler[phase_name][e] = action}
124
+ end
125
+
126
+ def handle_setup_exception(*exceptions, &action)
127
+ handle_exception(:setup, exceptions, &action)
128
+ end
129
+
130
+ def handle_execution_exception(*exceptions, &action)
131
+ handle_exception(:execution, exceptions, &action)
132
+ end
133
+
134
+ def handle_termination_exception(*exceptions, &action)
135
+ handle_exception(:termination, exceptions, &action)
136
+ end
137
+
138
+ private
139
+
140
+ # Set phase option.
141
+ def set_phase_option(name, option)
142
+ @phase_option[name] = option
143
+ end
144
+
145
+ # Register the action to the phase.
146
+ def register_action(phase_actions, action, option={})
147
+ _action = action.is_a?(Hash) ? action : {[] => action}
148
+ _action.each do |key, val|
149
+ phase_actions << [key.is_a?(Array) ? key : [key], val, option]
150
+ end
151
+ end
185
152
  end
186
153
 
187
- forward! :class, :option, :info
154
+ attr_reader :option
155
+ attr_reader :running_thread
156
+
157
+ forward! :class, :option_definition, :command_name, :command_name_block
158
+ forward! :class, :command_banner, :command_front, :command_front_block
188
159
 
189
160
  def initialize(argv)
190
161
  @argv = argv
162
+ @option = {}
163
+ @__exit_status__ = true
164
+ @__phase_name__ = nil
165
+ @__action_name__ = nil
166
+
167
+ # process has just one command object
168
+ Global.command = self
191
169
  end
192
170
 
193
- # Run the command.
194
- #
195
- # @return [void]
171
+ # Run 4 phase lifecycle of the command. This fires actions in each phase.
196
172
  def run
197
- receiver = self
198
- caller = lambda {|name| self.class.__send__(name).each{|proc| receiver.instance_eval(&proc)}}
199
- caller.call(:pre_preparations)
200
- caller.call(:preparations)
201
- caller.call(:post_preparations)
202
- caller.call(:pre_starts)
203
- caller.call(:starts)
204
- caller.call(:post_starts)
205
- call_terminations
206
- end
207
-
208
- def call_terminations
209
- receiver = self
210
- caller = lambda do |name|
211
- self.class.__send__(name).reverse.each do |proc|
212
- puts "%s(%s):%s:%s" % [info.name, name, *proc.source_location] if Pione.debug_mode?
213
- receiver.instance_eval(&proc)
173
+ @running_thread = Thread.current
174
+ enter_phase(:init)
175
+ enter_phase(:setup)
176
+ enter_phase(:execution)
177
+ terminate # => enter_phase(:termination) and exit
178
+ end
179
+
180
+ # Enter setup phase.
181
+ def enter_phase(phase_name)
182
+ # avoid double launch
183
+ return if @__phase_name__ == phase_name
184
+
185
+ # show debug message for entering phase
186
+ Log::Debug.system("%s enters phase \"%s\"" % [command_name, phase_name])
187
+
188
+ limit = self.class.phase_option[phase_name][:timeout]
189
+ phase_keyword, actions = find_phase_actions(phase_name)
190
+ timeout(limit) do
191
+ @__phase_name__ = phase_name
192
+ actions.each do |(targets, action_name, action_option)|
193
+ # check current mode is target or not
194
+ if not(targets.empty?) and not(targets.include?(option[:action_mode]))
195
+ next
196
+ end
197
+
198
+ # show debug message for firing action
199
+ Log::Debug.system("%s fires action \"%s\" in phase \"%s\"" % [command_name, action_name, phase_name])
200
+
201
+ # fire action
202
+ @__action_name__ = action_name
203
+ full_action_name = ("%s_%s" % [phase_keyword, action_name]).to_sym
204
+ if action_option[:module]
205
+ # call action in command action module
206
+ instance_eval(&action_option[:module].get(full_action_name))
207
+ else
208
+ # call action in self object
209
+ method(full_action_name).call
210
+ end
214
211
  end
215
212
  end
216
- caller.call(:pre_terminations)
217
- caller.call(:terminations)
218
- caller.call(:post_terminations)
213
+ rescue *self.class.exception_handler[phase_name].keys => e
214
+ self.class.exception_handler[phase_name][e.class].call(self, e)
215
+ rescue Timeout::Error
216
+ args = [command_name, @__action_name__, @__phase_name__, limit]
217
+ abort("%s timeouted at action \"%s\" in phase \"%s\". (%i sec)" % args)
218
+ end
219
+
220
+ # Terminate the command. Note that this enters in termination phase first,
221
+ # and command exit.
222
+ def terminate
223
+ enter_phase(:termination)
224
+ exit # end with status code
225
+ end
226
+
227
+ # Return true if it is in init phase.
228
+ def init?
229
+ @__phase_name__ == :init
230
+ end
231
+
232
+ # Return true if it is in setup phase.
233
+ def setup?
234
+ @__phase_name__ == :setup
235
+ end
236
+
237
+ # Return true if it is in execution phase.
238
+ def execution?
239
+ @__phase_name__ == :execution
240
+ end
241
+
242
+ # Return true if it is in termination phase.
243
+ def termination?
244
+ @__phase_name__ == :termination
245
+ end
246
+
247
+ # Exit running command and return status.
248
+ def exit
249
+ Log::Debug.system("%s exits with status \"%s\"" % [command_name, @__exit_status__])
250
+ Global.system_logger.terminate
251
+ Kernel.exit(Global.exit_status)
252
+ end
253
+
254
+ # Exit running command and return failure status. Note that this method
255
+ # enters termination phase before it exits.
256
+ def abort(msg_or_exception, pos=caller(1).first)
257
+ # hide the message because some option errors are meaningless
258
+ invisible = msg_or_exception.is_a?(HideableOptionError)
259
+
260
+ # setup abortion message
261
+ msg = msg_or_exception.is_a?(Exception) ? msg_or_exception.message : msg_or_exception
262
+
263
+ # show the message
264
+ if invisible
265
+ Log::Debug.system(msg, pos)
266
+ else
267
+ Log::SystemLog.fatal(msg, pos)
268
+ end
269
+
270
+ # set exit status code
271
+ Global.exit_status = false
272
+
273
+ # go to termination phase
274
+ terminate
219
275
  end
220
276
 
221
- prepare(:pre) do
222
- # set signal trap
277
+ private
278
+
279
+ # Initialize process name.
280
+ def init_process_name
281
+ $PROGRAM_NAME = command_name
282
+ end
283
+
284
+ # Initialize signal trap actions.
285
+ def init_signal_trap
286
+ # explicit exit for signal INT (exit status code: failure)
223
287
  Signal.trap(:INT) do
224
- begin
225
- call_terminations
226
- rescue DRb::ReplyReaderThreadError
227
- # ignore reply reader error
228
- end
288
+ abort("%s is terminated by signal INT" % command_name)
229
289
  end
230
290
 
231
- Signal.trap(:TERM) { call_terminations }
291
+ # implicit abortion for signal TERM (exit status code: success)
292
+ Signal.trap(:TERM) do
293
+ Log::Debug.system("%s is terminated by signal TERM" % command_name)
294
+ terminate
295
+ end
296
+ end
232
297
 
233
- # parse options
234
- option.parse(@argv)
298
+ # Initialize command options.
299
+ def init_option
300
+ @option = option_definition.parse(@argv, command_name, command_banner)
301
+ rescue OptionParser::ParseError, OptionError => e
302
+ abort(e)
235
303
  end
236
304
 
237
- prepare do
238
- # validate options
239
- option.check
305
+ # Initialize front server of this process if it needs.
306
+ def init_front
307
+ if command_front
308
+ front_args = command_front_block ? command_front_block.call(self) : []
309
+ Global.front = command_front.new(*front_args)
310
+ end
240
311
  end
241
312
 
242
- prepare(:post) do
243
- # setup process name
244
- info.setup(self)
313
+ # Modify process name to be with the additional informations.
314
+ def init_process_additional_information
315
+ if self.class.command_name_block
316
+ $PROGRAM_NAME = "%s (%s)" % [command_name, command_name_block.call(self)]
317
+ end
245
318
  end
246
319
 
247
- terminate(:post) do
248
- Global.monitor.synchronize do
249
- # exit with no exception
250
- exit Global.exit_status
320
+ # Find phase actions by phase name.
321
+ def find_phase_actions(phase_name)
322
+ case phase_name
323
+ when :init; [:init, self.class.init_actions]
324
+ when :setup; [:setup, self.class.setup_actions]
325
+ when :execution; [:execute, self.class.execution_actions]
326
+ when :termination; [:terminate, self.class.termination_actions]
327
+ end
328
+ end
329
+ end
330
+
331
+ module CommandActionInterface
332
+ class << self
333
+ def extended(mod)
334
+ mod.instance_variable_set(:@action, Hash.new)
335
+ end
336
+ end
337
+
338
+ # Return the named action.
339
+ def get(name)
340
+ @action[name] || (raise ActionNotFound.new(self, name))
341
+ end
342
+
343
+ def define_action(name, &b)
344
+ @action[name] = b
345
+ end
346
+ end
347
+
348
+ module CommonCommandAction
349
+ extend CommandActionInterface
350
+
351
+ define_action(:terminate_child_process) do |cmd|
352
+ if Global.front
353
+ # send signal TERM to the child process
354
+ Global.front.child.each do |pid, uri|
355
+ Util.ignore_exception {Process.kill(:TERM, pid)}
356
+ end
357
+
358
+ # wait all children
359
+ children = Process.waitall.map{|(pid, _)| pid}
360
+ if not(children.empty?)
361
+ Log::Debug.system("%s killed #%s" % [cmd.command_name, children.join(", ")])
362
+ end
363
+ end
364
+ end
365
+
366
+ define_action(:setup_parent_process_connection) do |cmd|
367
+ cmd.option[:parent_front].add_child(Process.pid, Global.front.uri)
368
+ ParentFrontWatchDog.new(self) # start to watch parent process
369
+ end
370
+
371
+ define_action(:terminate_parent_process_connection) do |cmd|
372
+ # maybe parent process is dead in this timing
373
+ Util.ignore_exception do
374
+ cmd.option[:parent_front].remove_child(Process.pid)
375
+ end
376
+ end
377
+ end
378
+
379
+ class ParentFrontWatchDog
380
+ def initialize(command)
381
+ @command = command
382
+
383
+ Thread.new do
384
+ while true
385
+ # PPID 1 means the parent process is dead
386
+ if Process.ppid == 1 or Util.error?{command.option[:parent_front].ping}
387
+ break @command.terminate
388
+ end
389
+ sleep 1
390
+ end
251
391
  end
252
392
  end
253
393
  end