appswarm 0.0.1

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 (305) hide show
  1. data/.autotest +124 -0
  2. data/History.txt +7 -0
  3. data/Manifest.txt +304 -0
  4. data/README.txt +373 -0
  5. data/Rakefile +153 -0
  6. data/TODO +7 -0
  7. data/apps/README.txt +17 -0
  8. data/apps/admin/admin.rb +79 -0
  9. data/apps/admin/controllers/admin.rb +81 -0
  10. data/apps/admin/controllers/settings.rb +63 -0
  11. data/apps/admin/controllers/users.rb +3 -0
  12. data/apps/admin/features/access.feature +21 -0
  13. data/apps/admin/features/mountLocal.feature +12 -0
  14. data/apps/admin/features/settings.feature +68 -0
  15. data/apps/admin/features/startApps.feature +27 -0
  16. data/apps/admin/layouts/main.rhtml +10 -0
  17. data/apps/admin/lib/settings.rb +52 -0
  18. data/apps/admin/static/admin.css +23 -0
  19. data/apps/admin/views/_log.rhtml +21 -0
  20. data/apps/admin/views/index.rhtml +43 -0
  21. data/apps/admin/views/info.rhtml +7 -0
  22. data/apps/admin/views/settings.rhtml +9 -0
  23. data/apps/admin/views/settings/_http_app.rhtml +15 -0
  24. data/apps/admin/views/settings/_web_server.rhtml +32 -0
  25. data/apps/admin/views/settings/index.rhtml +3 -0
  26. data/apps/admin/views/users/index.rhtml +6 -0
  27. data/apps/application_provider/application_provider.rb +11 -0
  28. data/apps/blog/blog.rb +27 -0
  29. data/apps/blog/controllers/blog.rb +29 -0
  30. data/apps/blog/views/index.rhtml +27 -0
  31. data/apps/browser_starter/browser_starter.rb +32 -0
  32. data/apps/crypto/crypto.rb +47 -0
  33. data/apps/crypto/crypto_rsa.rb +102 -0
  34. data/apps/crypto/spec/crypto_spec.rb +10 -0
  35. data/apps/directory_service/directory_service.rb +107 -0
  36. data/apps/directory_service/net_application.rb +92 -0
  37. data/apps/directory_service/spec/directory_service_spec.rb +36 -0
  38. data/apps/directory_service/spec/net_application_spec.rb +3 -0
  39. data/apps/global_application_interface/global_application.rb +52 -0
  40. data/apps/global_application_interface/global_application_interface.rb +84 -0
  41. data/apps/global_application_interface/spec/app_api_spec.rb +5 -0
  42. data/apps/global_tuple_space/global_tuple_space.rb +27 -0
  43. data/apps/global_web_proxy/features/session_handling.feature +7 -0
  44. data/apps/global_web_proxy/global_web_proxy.rb +221 -0
  45. data/apps/global_web_proxy/proxy/HTTPProxyServer-Dateien/rdoc-style.css +208 -0
  46. data/apps/global_web_proxy/proxy/HTTPProxyServer.html +566 -0
  47. data/apps/global_web_proxy/proxy/dnstest.rb +30 -0
  48. data/apps/global_web_proxy/proxy/proxy.rb +86 -0
  49. data/apps/global_web_proxy/proxy/wiki.html +267 -0
  50. data/apps/global_web_proxy/proxy/wiki.rb +115 -0
  51. data/apps/global_web_proxy/spec/res1 +112 -0
  52. data/apps/global_web_proxy/spec/res2 +125 -0
  53. data/apps/global_web_proxy/spec/web_proxy_spec.rb +88 -0
  54. data/apps/global_web_server/global_web_server.rb +120 -0
  55. data/apps/global_web_server/global_web_servlet.rb +6 -0
  56. data/apps/hello_world/controllers/hello_world.rb +11 -0
  57. data/apps/hello_world/features/show_on_local_web_server.feature +44 -0
  58. data/apps/hello_world/features/starting_apps.feature +6 -0
  59. data/apps/hello_world/features/through_global.feature +12 -0
  60. data/apps/hello_world/hello_world.rb +3 -0
  61. data/apps/hello_world/views/get.rhtml +10 -0
  62. data/apps/hello_world/views/index.rhtml +9 -0
  63. data/apps/hello_world/views/post.rhtml +10 -0
  64. data/apps/home/controllers/home.rb +11 -0
  65. data/apps/home/home.rb +12 -0
  66. data/apps/home/layouts/main.rhtml +16 -0
  67. data/apps/home/static/Zeichnung.svg +240 -0
  68. data/apps/home/static/home.css +134 -0
  69. data/apps/home/static/menu.css +99 -0
  70. data/apps/home/views/_appInfo.rhtml +22 -0
  71. data/apps/home/views/_dummy_fill.rhtml +3 -0
  72. data/apps/home/views/_info.rhtml +6 -0
  73. data/apps/home/views/_menu.rhtml +17 -0
  74. data/apps/home/views/index.rhtml +4 -0
  75. data/apps/home/views/overview.rhtml +2 -0
  76. data/apps/local_chunk_store/chunk_store.rb +15 -0
  77. data/apps/local_chunk_store/local_chunk_store.rb +123 -0
  78. data/apps/local_chunk_store/spec/local_chunk_store_spec.rb +30 -0
  79. data/apps/local_file_store/app_configuration.rb +78 -0
  80. data/apps/local_file_store/app_file_store.rb +32 -0
  81. data/apps/local_file_store/cached_file_store.rb +94 -0
  82. data/apps/local_file_store/features/testbed_handling_of_directories.feature +20 -0
  83. data/apps/local_file_store/local_file_store.rb +47 -0
  84. data/apps/local_file_store/spec/app_configuration_spec.rb +30 -0
  85. data/apps/local_file_store/spec/local_file_store_spec.rb +54 -0
  86. data/apps/local_object_storage/lib/cell.rb +29 -0
  87. data/apps/local_object_storage/lib/cellmgr.rb +57 -0
  88. data/apps/local_object_storage/lib/index.rb +43 -0
  89. data/apps/local_object_storage/lib/marshal.rb +96 -0
  90. data/apps/local_object_storage/lib/pagefile.rb +6 -0
  91. data/apps/local_object_storage/lib/persistent_object.rb +126 -0
  92. data/apps/local_object_storage/local_object_storage.rb +148 -0
  93. data/apps/local_object_storage/spec/local_object_storage_spec.rb +123 -0
  94. data/apps/local_secure_file_store/local_secure_file_store.rb +64 -0
  95. data/apps/local_secure_file_store/spec/local_secure_file_store_spec.rb +23 -0
  96. data/apps/local_tuple_space/local_tuple_space.rb +92 -0
  97. data/apps/local_tuple_space/spec/tuple_space_spec.rb +25 -0
  98. data/apps/local_web_server/features/parsing_args.feature +18 -0
  99. data/apps/local_web_server/local_web_server.rb +166 -0
  100. data/apps/logger/logger.rb +27 -0
  101. data/apps/master/master.rb +46 -0
  102. data/apps/master/spec/master_spec.rb +31 -0
  103. data/apps/my_spec_spec.rb +15 -0
  104. data/apps/name_service/name_service.rb +75 -0
  105. data/apps/name_service/spec/name_service_spec.rb +51 -0
  106. data/apps/network_discovery/network_discovery.rb +45 -0
  107. data/apps/network_discovery_localstore/network_discovery_localstore.rb +20 -0
  108. data/apps/network_discovery_udp/network_discovery_udp.rb +51 -0
  109. data/apps/network_lookup/network_lookup.rb +61 -0
  110. data/apps/network_node/abstract_node.rb +104 -0
  111. data/apps/network_node/drb_node.rb +90 -0
  112. data/apps/network_node/network_app.rb +9 -0
  113. data/apps/network_node/network_node.rb +471 -0
  114. data/apps/network_node/remote_service.rb +45 -0
  115. data/apps/network_node/secure_node.rb +125 -0
  116. data/apps/network_node/spec/drb_spec.rb +41 -0
  117. data/apps/network_node/spec/network_node_spec_not.rb +264 -0
  118. data/apps/new_network_node/new_network_node.rb +427 -0
  119. data/apps/new_network_node/spec/new_network_node_spec.rb +186 -0
  120. data/apps/node_broadcast/node_broadcast.rb +167 -0
  121. data/apps/node_broadcast/spec/node_broadcast_spec.rb +59 -0
  122. data/apps/permaspace/permaspace.rb +47 -0
  123. data/apps/plaindb/lib/btree.rb +38 -0
  124. data/apps/plaindb/plaindb.rb +199 -0
  125. data/apps/plaindb/spec/table_write_spec.rb +36 -0
  126. data/apps/routed_network/routed_network.rb +23 -0
  127. data/apps/routed_network/spec/routed_network_spec.rb +17 -0
  128. data/apps/session_manager/session_manager.rb +18 -0
  129. data/apps/spec_output.html +222 -0
  130. data/apps/todo/controllers/todo.rb +87 -0
  131. data/apps/todo/model/comment.rb +10 -0
  132. data/apps/todo/model/project.rb +20 -0
  133. data/apps/todo/model/todo.rb +16 -0
  134. data/apps/todo/model/user.rb +5 -0
  135. data/apps/todo/todo.rb +21 -0
  136. data/apps/todo/views/_commentList.rhtml +7 -0
  137. data/apps/todo/views/_createProject.rhtml +5 -0
  138. data/apps/todo/views/_partList.rhtml +12 -0
  139. data/apps/todo/views/_projectList.rhtml +16 -0
  140. data/apps/todo/views/edit.rhtml +11 -0
  141. data/apps/todo/views/editPart.rhtml +10 -0
  142. data/apps/todo/views/index.rhtml +2 -0
  143. data/apps/todo/views/question.rhtml +4 -0
  144. data/apps/transparent_network/transparent_network.rb +7 -0
  145. data/apps/udp_network/big_transfer.rb +97 -0
  146. data/apps/udp_network/features/information.feature +7 -0
  147. data/apps/udp_network/message_queue.rb +84 -0
  148. data/apps/udp_network/network_interface_api.rb +39 -0
  149. data/apps/udp_network/qos_queue.rb +186 -0
  150. data/apps/udp_network/simple_api.rb +180 -0
  151. data/apps/udp_network/spec/big_transfer_spec.rb +0 -0
  152. data/apps/udp_network/spec/qos_queue_spec.rb +99 -0
  153. data/apps/udp_network/spec/simple_api_spec.rb +35 -0
  154. data/apps/udp_network/spec/udp_network_spec.rb +115 -0
  155. data/apps/udp_network/spec/udp_transceiver_spec.rb +90 -0
  156. data/apps/udp_network/udp_network.rb +196 -0
  157. data/apps/udp_network/udp_transceiver.rb +329 -0
  158. data/apps/wiki/controllers/wiki.rb +56 -0
  159. data/apps/wiki/features/editing.feature +21 -0
  160. data/apps/wiki/layouts/main.rhtml +18 -0
  161. data/apps/wiki/lib/media_wiki_html.rb +35 -0
  162. data/apps/wiki/lib/wikicreole.rb +2147 -0
  163. data/apps/wiki/lib/wikicreole.tt +135 -0
  164. data/apps/wiki/lib/wikitest.rb +158 -0
  165. data/apps/wiki/lib/wikitest.tt +17 -0
  166. data/apps/wiki/model/menu.rb +15 -0
  167. data/apps/wiki/model/page.rb +31 -0
  168. data/apps/wiki/spec/wiki_creole_spec.rb +20 -0
  169. data/apps/wiki/spec/wiki_spec.rb +19 -0
  170. data/apps/wiki/static/Zeichnung.svg +240 -0
  171. data/apps/wiki/static/home.css +134 -0
  172. data/apps/wiki/static/mainMenu.css +32 -0
  173. data/apps/wiki/static/menu.css +99 -0
  174. data/apps/wiki/views/_mainMenu.rhtml +3 -0
  175. data/apps/wiki/views/_menu.rhtml +13 -0
  176. data/apps/wiki/views/edit.rhtml +13 -0
  177. data/apps/wiki/views/index.rhtml +2 -0
  178. data/apps/wiki/views/save.rhtml +1 -0
  179. data/apps/wiki/wiki.rb +17 -0
  180. data/bin/appswarm +47 -0
  181. data/cucumber.yml +2 -0
  182. data/data/PermaspaceApp/AFS_WikiApp_wiki_config +6 -0
  183. data/data/draft.txt +63 -0
  184. data/docs/appswarm_motivation.graffle +0 -0
  185. data/docs/appswarm_pics.graffle/QuickLook/Preview.pdf +0 -0
  186. data/docs/appswarm_pics.graffle/QuickLook/Thumbnail.tiff +0 -0
  187. data/docs/appswarm_pics.graffle/data.plist +63494 -0
  188. data/docs/appswarm_pics.graffle/image1.tiff +0 -0
  189. data/docs/appswarm_pics.graffle/image2.tif +0 -0
  190. data/docs/appswarm_pics.graffle/image3.tif +0 -0
  191. data/docs/appswarm_pics.graffle/image4.tif +0 -0
  192. data/docs/appswarm_pics.graffle/image5.tiff +0 -0
  193. data/docs/routing.graffle +0 -0
  194. data/features/step_definitions/appstart_steps.rb +28 -0
  195. data/features/step_definitions/cluster_steps.rb +18 -0
  196. data/features/step_definitions/testbed_steps.rb +64 -0
  197. data/features/step_definitions/webapp_steps.rb +257 -0
  198. data/features/support/env.rb +7 -0
  199. data/lib/appswarm.rb +127 -0
  200. data/lib/appswarm/README.txt +67 -0
  201. data/lib/appswarm/app_config.rb +19 -0
  202. data/lib/appswarm/application.rb +267 -0
  203. data/lib/appswarm/breaking_mutex.rb +41 -0
  204. data/lib/appswarm/cluster_funcs.rb +157 -0
  205. data/lib/appswarm/cross_spectool.rb +153 -0
  206. data/lib/appswarm/crypt.rb +10 -0
  207. data/lib/appswarm/crypt/crypto.rb +90 -0
  208. data/lib/appswarm/crypt/rsa_key +15 -0
  209. data/lib/appswarm/crypt/rsa_key.pub +5 -0
  210. data/lib/appswarm/crypt/test.rb +27 -0
  211. data/lib/appswarm/dir_tool.rb +41 -0
  212. data/lib/appswarm/event_api.rb +7 -0
  213. data/lib/appswarm/features_helper.rb +44 -0
  214. data/lib/appswarm/global_service.rb +38 -0
  215. data/lib/appswarm/http.rb +1 -0
  216. data/lib/appswarm/http/http_app.rb +257 -0
  217. data/lib/appswarm/http/http_controller.rb +267 -0
  218. data/lib/appswarm/http/http_provider.rb +80 -0
  219. data/lib/appswarm/http/static/favicon.ico +0 -0
  220. data/lib/appswarm/http/static/javascript/._prototype.js +0 -0
  221. data/lib/appswarm/http/static/javascript/prototype.js +2515 -0
  222. data/lib/appswarm/http/webrick_logger.rb +12 -0
  223. data/lib/appswarm/net_service.rb +69 -0
  224. data/lib/appswarm/package.rb +88 -0
  225. data/lib/appswarm/parallel_each.rb +46 -0
  226. data/lib/appswarm/protocols/protocol_dice.rb +25 -0
  227. data/lib/appswarm/proxy_testing.rb +48 -0
  228. data/lib/appswarm/public_api.rb +35 -0
  229. data/lib/appswarm/routing/matrix_math.rb +57 -0
  230. data/lib/appswarm/routing/pca.rb +211 -0
  231. data/lib/appswarm/routing/routetest.rb +85 -0
  232. data/lib/appswarm/routing/routing.rb +326 -0
  233. data/lib/appswarm/routing/spec/nods_spec.rb +23 -0
  234. data/lib/appswarm/routing/spec/pca_spec.rb +27 -0
  235. data/lib/appswarm/routing/spec/routing_spec.rb +91 -0
  236. data/lib/appswarm/secure_con.rb +437 -0
  237. data/lib/appswarm/secure_connection.rb +79 -0
  238. data/lib/appswarm/secure_marshal.rb +137 -0
  239. data/lib/appswarm/service.rb +76 -0
  240. data/lib/appswarm/simple_marshal.rb +96 -0
  241. data/lib/appswarm/simple_marshal_parser.rb +1243 -0
  242. data/lib/appswarm/simple_marshal_parser.tt +158 -0
  243. data/lib/appswarm/spec/application_spec.rb +50 -0
  244. data/lib/appswarm/spec/cluster_spec.rb +2 -0
  245. data/lib/appswarm/spec/hexdist_spec.rb +13 -0
  246. data/lib/appswarm/spec/http_controller_spec.rb +18 -0
  247. data/lib/appswarm/spec/main_spec.rb +6 -0
  248. data/lib/appswarm/spec/parallel_each_spec.rb +30 -0
  249. data/lib/appswarm/spec/secure_connection_spec.rb +108 -0
  250. data/lib/appswarm/spec/secure_marshal_spec.rb +93 -0
  251. data/lib/appswarm/spec/simple_marshal_spec.rb +87 -0
  252. data/lib/appswarm/spec/tools_spec.rb +13 -0
  253. data/lib/appswarm/spec/whiteboard_spec.rb +20 -0
  254. data/lib/appswarm/spec_helper.rb +18 -0
  255. data/lib/appswarm/test_bed.rb +207 -0
  256. data/lib/appswarm/tools.rb +284 -0
  257. data/lib/appswarm/tools/http_tunnel_client.rb +139 -0
  258. data/lib/appswarm/tools/http_tunnel_common.rb +8 -0
  259. data/lib/appswarm/tools/http_tunnel_server.rb +78 -0
  260. data/lib/appswarm/tools/parser/example_data.simple +102 -0
  261. data/lib/appswarm/tools/parser/match_test.rb +14 -0
  262. data/lib/appswarm/tools/parser/parser_lib.rb +165 -0
  263. data/lib/appswarm/tools/parser/parser_test.rb +104 -0
  264. data/lib/appswarm/tools/parser/spec/parser_spec.rb +44 -0
  265. data/lib/appswarm/tools/pipes.rb +95 -0
  266. data/lib/appswarm/tools/spec/tracing_spec.rb +16 -0
  267. data/lib/appswarm/tools/spec/waiting_queue_spec.rb +15 -0
  268. data/lib/appswarm/tools/thread_tool.rb +61 -0
  269. data/lib/appswarm/tools/tracing.rb +84 -0
  270. data/lib/appswarm/tools/treetop_test.rb +20 -0
  271. data/lib/appswarm/tools/treetop_test_grammar.rb +114 -0
  272. data/lib/appswarm/tools/treetop_test_grammar.tt +7 -0
  273. data/lib/appswarm/tools/waiting_prio_queue.rb +47 -0
  274. data/lib/appswarm/tools/waiting_queue.rb +34 -0
  275. data/lib/appswarm/whiteboard.rb +73 -0
  276. data/nettest.rb +50 -0
  277. data/packages/README.txt +1 -0
  278. data/packages/msandbox/data/packages/store/my.txt +1 -0
  279. data/packages/msandbox/interfaces.rb +172 -0
  280. data/packages/msandbox/old/defa.rb +3 -0
  281. data/packages/msandbox/old/test.rb +14 -0
  282. data/packages/msandbox/old/test2.rb +56 -0
  283. data/packages/msandbox/package.rb +67 -0
  284. data/packages/msandbox/packages/store/config.yml +1 -0
  285. data/packages/msandbox/packages/store/main.rb +27 -0
  286. data/packages/msandbox/packages/store/myinclude.rb +7 -0
  287. data/packages/msandbox/packages/store_test/config.yml +1 -0
  288. data/packages/msandbox/packages/store_test/main.rb +9 -0
  289. data/packages/msandbox/server.rb +146 -0
  290. data/packages/msandbox/test.rb +13 -0
  291. data/packages/msandbox/test2.rb +29 -0
  292. data/templates/web/appswarm/controllers/appswarm.rb +41 -0
  293. data/templates/web/appswarm/layouts/main.rhtml +20 -0
  294. data/templates/web/appswarm/models/asmenu.rb +14 -0
  295. data/templates/web/appswarm/models/asuser.rb +30 -0
  296. data/templates/web/appswarm/static/custom.css +15 -0
  297. data/templates/web/appswarm/static/home.css +134 -0
  298. data/templates/web/appswarm/static/mainMenu.css +32 -0
  299. data/templates/web/appswarm/static/menu.css +99 -0
  300. data/templates/web/appswarm/views/_mainMenu.rhtml +5 -0
  301. data/templates/web/appswarm/views/_menu.rhtml +13 -0
  302. data/templates/web/appswarm/views/_userInfo.rhtml +7 -0
  303. data/templates/web/appswarm/views/login.rhtml +9 -0
  304. data/tools/checkPort.rb +11 -0
  305. metadata +379 -0
@@ -0,0 +1,427 @@
1
+ require 'service.rb'
2
+ require 'net_service.rb'
3
+ require 'breaking_mutex.rb'
4
+ require File.expand_path('../../network_node/secure_node.rb',__FILE__)
5
+
6
+ class NewNetworkNodeApp<Service
7
+
8
+ NODE_TYPE=SecureNetNode
9
+
10
+ class NodeNotReachable<Exception
11
+ end
12
+
13
+
14
+ Node=Struct.new(:node,:hops,:route,:timestamp)
15
+ class Node
16
+ alias :oldInit :initialize
17
+ def initialize(n=nil,h=nil,r=nil)
18
+ h||=:unreachable
19
+ oldInit(n,h,r,Node::currentTimestamp)
20
+ end
21
+
22
+ def self.currentTimestamp
23
+ Time.now.to_f
24
+ end
25
+
26
+ def olderThan(other)
27
+ assert{(self<=>other)==0}
28
+ timestamp<other.timestamp
29
+ end
30
+ def ==(other)
31
+ [:node,:hops,:route].each{|i|
32
+ return false if self.send(i)!=other.send(i)
33
+ }
34
+ true
35
+ end
36
+ def <=>(other)
37
+ assert{self.class==other.class}
38
+ if self.hops==:unreachable
39
+ if other.hops!=:unreachable
40
+ return -1
41
+ end
42
+ else
43
+ if other.hops==:unreachable
44
+ return 1
45
+ else
46
+ a=(self.hops<=>other.hops)
47
+ return a if a!=0
48
+ end
49
+ end
50
+ a=(self.node<=>other.node)
51
+ return a if a!=0
52
+ if self.route.nil?
53
+ unless other.route.nil?
54
+ return -1
55
+ end
56
+ else
57
+ if other.route.nil?
58
+ return 1
59
+ else
60
+ a=(self.route<=>other.route)
61
+ return a if a!=0
62
+ end
63
+ end
64
+ 0
65
+ end
66
+ end
67
+
68
+
69
+
70
+ # these are default settings and can be overridden by *options*
71
+ MIN_COMPANIONS=5
72
+ MAX_COMPANIONS=10
73
+ MAX_HOPS=5
74
+
75
+ attr_reader :transceiver, :services
76
+
77
+ event :connected,1
78
+
79
+ def initialize(cluster,options)
80
+
81
+ super(cluster,options,:newNetworkNode)
82
+
83
+ @minCompanions=options[:minCompanions]
84
+ @maxCompanions=options[:maxCompanions]
85
+
86
+ @minCompanions||=MIN_COMPANIONS
87
+ @maxCompanions||=MAX_COMPANIONS
88
+
89
+ port=nil
90
+ port=cluster.options[:port]
91
+ loop do
92
+ break if NetService.checkPort(port)
93
+ port=rand(2000)+2000
94
+ end
95
+ sleep 0.1
96
+ @listMutex=BreakingMutex.new
97
+ @nodeList=[]
98
+
99
+ hash=options[:nodeHash]
100
+ hash||=genNodeHash
101
+
102
+ assert{hash.is_a?(String)}
103
+
104
+ @transceiver=NODE_TYPE.new(port,self,hash)
105
+ @hooks={}
106
+ @transceiver.setHook do |*s|
107
+ pp "NetworkNode hook #{s[0]}"
108
+ case s[0]
109
+ when :nodeListRoute
110
+ nodeListRoute
111
+ when :newNodes
112
+ log "new Nodes:-)"
113
+ gotNewNodes(*(s[1..-1]))
114
+ when :eventConnected
115
+ eventConnected(*(s[1..-1]))
116
+ when :serviceList
117
+ cluster.getGlobalServices.map{|s|RemoteServiceID.new(myNodeId,s.name,s.provides)}
118
+ when :call
119
+ incomingCall(*(s[1..-1]))
120
+ when :remoteApp
121
+ remoteApp(*(s[1..-1]))
122
+ when :run
123
+ incomingRun(*(s[1..-1]))
124
+ when :hook
125
+ if @hooks.key?(s[0])
126
+ @hooks[s[0]].call(*(s[1..-1]))
127
+ end
128
+ else
129
+ log "Unknown Message #{s}"
130
+ end
131
+ end
132
+ end
133
+
134
+ def hook(name,&block)
135
+ @hooks[name]=block
136
+ end
137
+ def unhook(name)
138
+ @hooks.delete(name)
139
+ end
140
+ def remoteApp(nodeId,name,*args)
141
+ log "remoteApp called #{nodeId} #{myNodeId}"
142
+ if nodeId==myNodeId
143
+ log "LOCAL"
144
+ if @hooks.key?(name)
145
+ log "hook found"
146
+ @hooks[name].call(*args)
147
+ else
148
+ log "no hook found for #{name}!"
149
+ end
150
+ else
151
+ puts "REMOTE #{nodeId}"
152
+ nextHop=getValidRoutes(nodeId)[0].node
153
+ puts "ROUTE #{nextHop.inspect}"
154
+ pp @transceiver.nodeList
155
+ nextHop=nodeId if @transceiver.nodeList.member?(nodeId)
156
+ puts "ROUTE #{nextHop.inspect}"
157
+ return nil if nextHop.nil?
158
+ @transceiver.getConnection(nextHop).remoteCallSync(:remoteApp,nodeId,name,*args)
159
+ end
160
+ end
161
+
162
+ def genNodeHash
163
+ Crypt::digest(rand.to_s)
164
+ end
165
+
166
+ def info
167
+ {
168
+ :transceiver=>@transceiver.info,
169
+ :nodelist=>@nodeList,
170
+ :services=>@services
171
+ }
172
+ end
173
+
174
+ # @deprecated
175
+ def nodeList
176
+ nodeIdList
177
+ #@nodeList.map{|node|node.node}
178
+ end
179
+ def nodeIdList
180
+ @nodeList.map{|node|node.node}.uniq
181
+ end
182
+ def nodeListRoute(timestamp=0)
183
+ @nodeList.map{|node|
184
+ n=node.dup
185
+ n.route=myNodeId
186
+ n
187
+ }.select{|n|n.timestamp>timestamp}
188
+ end
189
+
190
+ def getRoutesDirectly
191
+ @nodeList
192
+ end
193
+ def getAllNodes
194
+ @nodeList
195
+ end
196
+
197
+ def cron
198
+ log("cron")
199
+ measureTime {
200
+ #log "routes:",getRoutesDirectly
201
+ begin
202
+ log "register at master..."
203
+ registerAtMasterServer
204
+ log "get new from local storage..."
205
+ getNewFromLocalStorage
206
+ if @nodeList.length==0
207
+ log "get new from master..."
208
+ getNewFromMaster
209
+ end
210
+ log "get new from neighbors..."
211
+ log "connected nodes:",@transceiver.nodeList.length
212
+ getNodesFromNeighbors
213
+ log "call connectNodes..."
214
+ connectNodes
215
+ log "ready connectNodes."
216
+ log "ndodelist:",@nodeList.length
217
+ log "connected nodes:",@transceiver.nodeList.length
218
+ super
219
+ rescue Exception=>e
220
+ log "Error in cron:",e,e.backtrace,e.class
221
+ end
222
+ #log("cron ready",getRoutesDirectly,"--")
223
+
224
+ log("checking connected nodes")
225
+ #pp getRoutesDirectly
226
+ @transceiver.nodeList.each{|l|
227
+ log "checking:",l
228
+ assert{nodeReachable(l)}
229
+ }
230
+ log("checked connected nodes")
231
+ }
232
+ @cronCount||=0
233
+ @cronCount+=1
234
+ log "connected nodes:",@transceiver.nodeList.length
235
+ log "cron #",@cronCount
236
+ end
237
+
238
+ def myNodeId
239
+ @transceiver.nodeId
240
+ end
241
+
242
+
243
+ def stop
244
+ super
245
+ @transceiver.stop
246
+ end
247
+
248
+
249
+ def getNodesFromNeighbors
250
+ @lastTimestamp||=0
251
+ time=Node::currentTimestamp
252
+ result=(@transceiver.sendAll(:nodeListRoute,@lastTimestamp)+nodeListRoute).flatten.uniq
253
+ @lastTimestamp=time
254
+ log "getNodesFromNeighbors..."
255
+ result.each{|node|
256
+ insertNodeFromNeighbor(node)
257
+ }
258
+
259
+ result.map{|node|node.node}.uniq
260
+ end
261
+
262
+ def getValidRoutes(node,maxAge=100000)
263
+ @nodeList.select{|n|n.node==node && n.timestamp>Node::currentTimestamp-maxAge && n.hops!=:unreachable && n.route!=nil}
264
+ end
265
+
266
+ def nodeReachable(node)
267
+ getValidRoutes(node).length>0
268
+ end
269
+
270
+ def call(service,s)
271
+ nextHop=getRoute(service.nodeInformation)
272
+ raise NodeNotReachable.new if nextHop.nil?
273
+ # maybe raise ???
274
+ @transceiver.getConnection(nextHop).remoteCallSync(:call,service,s)
275
+ end
276
+ def callRun(service,s)
277
+ nextHop=getRoute(service.nodeInformation)
278
+ raise NodeNotReachable.new if nextHop.nil?
279
+ # maybe raise ???
280
+ @transceiver.getConnection(nextHop).remoteCall(:call,service,s)
281
+ end
282
+
283
+ private
284
+
285
+ def insertNodeFromNeighbor(node)
286
+ node.hops+=1 if node.hops!=:unreachable
287
+ insertNode(node)
288
+ end
289
+
290
+ def insertNode(node)
291
+ @listMutex.synchronize {
292
+ @nodeList<<node
293
+
294
+ cleanUpNodeList
295
+ }
296
+ end
297
+
298
+ def cleanUpNodeList
299
+ log "-----",@nodeList
300
+
301
+ # remove nodes without route, if route is available
302
+ routeAvail=@nodeList.select{|n|n.route}.map{|n|n.node}
303
+
304
+ @nodeList=@nodeList.select{|n| not (routeAvail.member?(n) and n.route.nil?)}
305
+
306
+ # remote route-entries, that are older than others with same route
307
+ routeAge=@nodeList.group_by{|n|[n.node,n.route]}.max_by_value{|n|n.timestamp}
308
+
309
+ @nodeList=@nodeList.select{|n|n.route.nil? or routeAge[[n.node,n.route]]==n.timestamp}
310
+
311
+ log "=======",@nodeList.uniq_count{|n|n.node}
312
+
313
+ log "----",@nodeList
314
+ end
315
+
316
+
317
+ def incomingCall(service,s)
318
+ if service.nodeInformation==myNodeId
319
+ # do it
320
+ # FIXME: check rights
321
+ pp "doing it",*s
322
+ app=cluster.getApp(service.name)
323
+ pp "on:",app
324
+ app.send(*s)
325
+ else
326
+ # relay
327
+ call(service,s)
328
+ end
329
+ end
330
+
331
+ def registerAtMasterServer
332
+ app=getApp(:networkLookup)
333
+ app.register(myNodeId) if app
334
+ end
335
+
336
+ def eventConnected(by)
337
+ log "eventConnected by #{by.pretty_inspect} me:#{myNodeId}"
338
+ insertNode( Node.new(by,0,by))
339
+ isConnected(by)
340
+ end
341
+
342
+ def getNewFromLocalStorage
343
+ pp "getNewFromLOCAL"
344
+ if @nodeList.length==0
345
+ app=cluster.getApp(:localTupleSpace)
346
+ if app
347
+ servers=app.read(:networkNodeList)
348
+ if servers
349
+ servers.each{|server|
350
+ log "got server #{server} from local storage"
351
+ n=Node.new(server,:unreachable,nil)
352
+ pp n
353
+ log "add to list #{n.inspect}"
354
+ insertNode(n)
355
+ log "inserted server #{server}"
356
+ }
357
+ end
358
+ end
359
+ end
360
+ end
361
+
362
+
363
+ def connectNodes
364
+ log "connectNodes..."
365
+ if @transceiver.nodeList.length<@minCompanions
366
+
367
+
368
+ # FIXME: make this tx shorter !!!!
369
+ log "connectNode!"
370
+ # only reading - no mutex needed
371
+ possible=nodeIdList-@transceiver.nodeList
372
+ log "nodelist #:",@nodeList.length
373
+ log "possible #:",possible.length
374
+ if possible.length>0
375
+ log possible
376
+ possible.shuffle!
377
+
378
+ log "sorting"
379
+
380
+ # TODO: sort by distance - take this, which is farthest away
381
+
382
+
383
+ begin
384
+ @transceiver.connect(possible[0]) if possible.length>0
385
+
386
+ possible=possible[0]
387
+ insertNode(Node.new(possible,0,possible))
388
+ rescue Errno::ECONNREFUSED
389
+ log "Connection refused"
390
+ end
391
+ end
392
+
393
+ end
394
+ end
395
+
396
+ def getNewFromMaster
397
+ log "current nodecount #{@nodeList.length}"
398
+ lookupApp=getApp(:networkLookup)
399
+ if lookupApp
400
+ servers=lookupApp.getServers
401
+ log "loaded Servers from master:",servers
402
+ servers.each{|server|
403
+ log "add to list #{server}"
404
+ insertNode(Node.new(server))
405
+ #if @nodeList[server].nil?
406
+ # n=Node.new(server,:unreachable,nil)
407
+ # log "add to list #{n.inspect}"
408
+ # @nodeList[server]=n
409
+ #end
410
+ }
411
+ else
412
+ log "getNewFromMaster - failed - no networklookup"
413
+ end
414
+ log "getNewFromMaster - ready"
415
+ end
416
+
417
+ def getFromMaster
418
+ log "fetch servers from master"
419
+ servers=cluster.getApp(:networkLookup).getServers
420
+ servers.each{|server|
421
+ log "got server #{server} from master"
422
+ insertNewNodeDirect(Node.new(server,0))
423
+ log "inserted server #{server}"
424
+ }
425
+ end
426
+
427
+ end
@@ -0,0 +1,186 @@
1
+ require 'network_node.rb'
2
+
3
+ describe "New Network node" do
4
+
5
+ after(:each) do
6
+ TestBed::testbeds.should == []
7
+ TestBed::testbeds.each{|tb|tb.stop}
8
+ end
9
+
10
+ it "should gather nodes from local storage" do
11
+ testBed1=TestBed.new
12
+ node1=testBed1.run("NewNetworkNode")
13
+ testBed2=TestBed.new
14
+ st=testBed2.run("LocalTupleSpace")
15
+ nodeList=[node1.myNodeId]
16
+ st.store(:networkNodeList,nodeList)
17
+ node2=testBed2.run("NewNetworkNode")
18
+ sleep 2
19
+ ((node2.nodeList-[node2.myNodeId]).sort).should == (nodeList.sort)
20
+ ((node1.nodeList-[node1.myNodeId]).sort).should == [node2.myNodeId]
21
+ testBed1.stop
22
+ testBed2.stop
23
+ end
24
+
25
+ it "should gather nodes from master server and connect some nodes" do
26
+ TestBed::testbeds.should == []
27
+ testBed=TestBed.new
28
+ testBed2=TestBed.new
29
+ testBed2.options[:httpPort]=2001
30
+ s=testBed.run("Master")
31
+ l1=testBed.run("NetworkLookup")
32
+
33
+ l1=testBed2.run("NetworkLookup")
34
+
35
+ n0=testBed.run("NewNetworkNode")
36
+ n1=testBed2.run("NewNetworkNode")
37
+ n0.runCron
38
+ n1.runCron
39
+ n0.runCron
40
+ sleep 0.5
41
+ s.clients.length == 2
42
+ sleep 2
43
+ pp "MYNODELIST:",n0.nodeList
44
+ pp "MYNODELIST:",n1.nodeList
45
+ n0.nodeList.sort.should == ([n1.myNodeId,n0.myNodeId].sort)
46
+ n0.nodeList.should be_member(n1.myNodeId)
47
+ n1.nodeList.should be_member(n0.myNodeId)
48
+ testBed.stop
49
+ testBed2.stop
50
+ end
51
+
52
+ it "should not connect an already connected node"
53
+
54
+ it "should get nodes from neighbors" do
55
+ bs=[]
56
+ ns=[]
57
+ st=[]
58
+ 3.times{bs<<TestBed.new}
59
+ bs.each{|b|
60
+ ns<<b.run("NewNetworkNode",{:cronTime=>10000})
61
+ st<<b.run("LocalTupleSpace")
62
+ }
63
+ st[0].store(:networkNodeList,[ns[1].myNodeId])
64
+ puts "CRON>>>>>>>>>"
65
+ ns[0].runCron
66
+ # wait for ns[1] to answer
67
+ sleep 0.5
68
+ puts "CRON<<<<<<<<<<"
69
+ ns[0].nodeList.should==[ns[1].myNodeId]
70
+ puts "_______"
71
+ ns.each{|n|
72
+ pp n.myNodeId,n.transceiver.nodeList,n.nodeList,":::"
73
+ }
74
+ puts "_______"
75
+ ns[0].transceiver.nodeList.should==[ns[1].myNodeId]
76
+ ns[1].transceiver.nodeList.should==[ns[0].myNodeId]
77
+ ns[1].nodeList.should==[ns[0].myNodeId]
78
+
79
+ st[2].store(:networkNodeList,[ns[0].myNodeId])
80
+ ns[2].runCron # getting at least ns0
81
+ sleep 0.5 # let network process a little
82
+ ns[2].nodeList.member?(ns[0].myNodeId).should be_true
83
+ ns[2].transceiver.nodeList.member?(ns[0].myNodeId).should be_true
84
+ puts "CRON>>>>>>>>>"
85
+ ns[2].runCron # getting ns2
86
+ sleep 0.5 # let network process a little
87
+ pp "TRANSLIST",ns[2].transceiver.nodeList
88
+ ns[2].transceiver.nodeList.length.should >= 2
89
+ puts "CRON<<<<<<<<<<"
90
+ ns[1].runCron # getting ns2
91
+ sleep 0.5 # let network process a little
92
+ ns[1].nodeList.member?(ns[2].myNodeId).should be_true
93
+
94
+
95
+ bs.each{|b|b.stop}
96
+
97
+ end
98
+
99
+
100
+
101
+ it "should process local routes correctly" do
102
+ options={:minCompanions=>1}
103
+ testBed1=TestBed.new
104
+ testBed2=TestBed.new
105
+ testBed3=TestBed.new
106
+ n1=testBed1.run("NewNetworkNode",options)
107
+ n2=testBed2.run("NewNetworkNode",options)
108
+ n3=testBed3.run("NewNetworkNode",options)
109
+
110
+ t1=testBed1.run("LocalTupleSpace")
111
+ t3=testBed3.run("LocalTupleSpace")
112
+
113
+ t1.store(:networkNodeList,[n2.myNodeId])
114
+ t3.store(:networkNodeList,[n2.myNodeId])
115
+
116
+ n1.runCron
117
+ n3.runCron
118
+ sleep 2
119
+
120
+ nodes=[n1,n2,n3]
121
+
122
+ nodes.map{|node|node.getRoutesDirectly}.flatten.each{|n|nodes.map{|m|m.myNodeId}.member?(n.node).should == true}
123
+
124
+ # chcek direct routes
125
+ n1.getValidRoutes(n2.myNodeId).map{|n|n.node}.should ==[n2.myNodeId]
126
+ n3.getValidRoutes(n2.myNodeId).map{|n|n.node}.should ==[n2.myNodeId]
127
+
128
+ n1.runCron
129
+ n3.runCron
130
+
131
+ pp "NODELISTROUTE:","____________________________________"
132
+
133
+
134
+ pp "N1:",n1.myNodeId, n1.getRoutesDirectly,n1.transceiver.nodeList
135
+ pp "N2:",n2.myNodeId, n2.getRoutesDirectly
136
+ pp "N3:",n3.myNodeId, n3.getRoutesDirectly
137
+
138
+ l1=n1.getRoutesDirectly.select{|node|node.node==n3.myNodeId}
139
+ l1.length.should == 1
140
+ l1.each{|info|info.hops.should == 1
141
+ info.route.should == n2.myNodeId
142
+ }
143
+
144
+ nodes.each{|node|
145
+ node.getRoutesDirectly.select{|info|info.node==node.myNodeId}.each{|info|
146
+ [0,1].member?(info.hops).should be_true
147
+ }
148
+ }
149
+
150
+ testBed1.stop
151
+ testBed2.stop
152
+ testBed3.stop
153
+
154
+ end
155
+
156
+
157
+ it "should be possible to define a hook from another app" do
158
+ bed1=TestBed.new
159
+ bed2=TestBed.new
160
+ bed1.run("Master")
161
+ bed1.run("NetworkLookup")
162
+ bed2.run("NetworkLookup")
163
+ n1=bed1.run("NewNetworkNode")
164
+ n2=bed2.run("NewNetworkNode")
165
+ sleep 2
166
+ check=false
167
+ b=binding
168
+ n1.hook("MyTest"){|*args|
169
+ eval("check=true",b)
170
+ }
171
+ #n2.runCron
172
+ #n1.runCron
173
+ n2.remoteApp(n1.myNodeId,"MyTest",:check)
174
+ sleep 0.5
175
+ check.should be_true
176
+ bed1.stop
177
+ bed2.stop
178
+ end
179
+
180
+ def dummyServers
181
+ [
182
+ NodeInformation.new("127.0.0.1",5678,:secure,"1234"),
183
+ NodeInformation.new("127.0.0.1",5900,:secure,"3456")
184
+ ]
185
+ end
186
+ end