nuri 0.5.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 (169) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.travis.yml +12 -0
  4. data/CHANGELOG +146 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +28 -0
  7. data/README.md +64 -0
  8. data/Rakefile +15 -0
  9. data/VERSION +1 -0
  10. data/bin/delete_modules +11 -0
  11. data/bin/install_agent +18 -0
  12. data/bin/install_module +65 -0
  13. data/bin/nuri +519 -0
  14. data/bin/nuri.old +183 -0
  15. data/bin/push_model +16 -0
  16. data/examples/.gitignore +3 -0
  17. data/examples/bonfire.sfp +95 -0
  18. data/examples/bonfire/epcc.sfp +43 -0
  19. data/examples/bonfire/epcc0.sfp +49 -0
  20. data/examples/bonfire/epcc2.sfp +52 -0
  21. data/examples/bonfire/epcc2a.sfp +25 -0
  22. data/examples/bonfire/inria.sfp +72 -0
  23. data/examples/bonfire/inria0.sfp +49 -0
  24. data/examples/bonfire/inria2.sfp +71 -0
  25. data/examples/bonfire/inria2a.sfp +44 -0
  26. data/examples/bonfire/inria2b.sfp +54 -0
  27. data/examples/bonfire/inria2c.sfp +62 -0
  28. data/examples/bonfire/inria2d.sfp +71 -0
  29. data/examples/bonfire/inria2e.sfp +80 -0
  30. data/examples/bonfire/main.sfp +33 -0
  31. data/examples/bonfire/old/bonfire-1-1-1.sfp +76 -0
  32. data/examples/bonfire/old/bonfire-1-10-1.sfp +77 -0
  33. data/examples/bonfire/old/bonfire-1-2-1.sfp +58 -0
  34. data/examples/bonfire/old/bonfire-1-3-1.sfp +61 -0
  35. data/examples/bonfire/old/bonfire-1-4-1.sfp +64 -0
  36. data/examples/bonfire/old/bonfire-1-5-1.sfp +67 -0
  37. data/examples/bonfire/old/bonfire-1-6-1.sfp +82 -0
  38. data/examples/bonfire/old/bonfire-1-7-1.sfp +82 -0
  39. data/examples/bonfire/old/bonfire-1-8-1.sfp +79 -0
  40. data/examples/bonfire/old/bonfire-1-9-1.sfp +83 -0
  41. data/examples/bonfire/old/wp-test1a.sfp +38 -0
  42. data/examples/bonfire/old/wp-test1b.sfp +18 -0
  43. data/examples/bonfire/old/wp-test1c.sfp +7 -0
  44. data/examples/bonfire/old/wp-test2.sfp +47 -0
  45. data/examples/bonfire/old3/bonfire-epcc.sfp +57 -0
  46. data/examples/bonfire/old3/bonfire-inria.sfp +72 -0
  47. data/examples/bonfire/old3/bonfire-master.sfp +18 -0
  48. data/examples/bonfire/old3/bonfire.sfp +23 -0
  49. data/examples/bonfire/old3/bonfire2.sfp +49 -0
  50. data/examples/bonfire/old3/bonfire3.sfp +76 -0
  51. data/examples/bonfire/old3/bonfire4.sfp +78 -0
  52. data/examples/bonfire/old3/bonfire5.sfp +34 -0
  53. data/examples/bonfire/old3/bonfire5b.sfp +84 -0
  54. data/examples/bonfire/old3/hpvm6.sfp +22 -0
  55. data/examples/bonfire/old3/model.json +1 -0
  56. data/examples/bonfire/old3/test0.sfp +16 -0
  57. data/examples/bonfire/old3/test1.sfp +5 -0
  58. data/examples/bonfire/old3/test10.sfp +5 -0
  59. data/examples/bonfire/old3/test2.sfp +18 -0
  60. data/examples/bonfire/old3/test3.sfp +10 -0
  61. data/examples/bonfire/old3/test4.sfp +11 -0
  62. data/examples/bonfire/old3/test5.sfp +18 -0
  63. data/examples/bonfire/old3/test6.sfp +19 -0
  64. data/examples/bonfire/old3/test7.sfp +34 -0
  65. data/examples/bonfire/old3/test8.sfp +5 -0
  66. data/examples/bonfire/old3/test9.sfp +16 -0
  67. data/examples/bonfire/old3/wordpress-test-cluster.sfp +38 -0
  68. data/examples/bonfire/old3/wordpress-test.sfp +22 -0
  69. data/examples/bonfire/old3/wp-test-2.sfp +49 -0
  70. data/examples/bonfire/test.sfp +13 -0
  71. data/examples/generator.rb +66 -0
  72. data/examples/hadoop2.sfp +20 -0
  73. data/examples/hpcloud.sfp +18 -0
  74. data/examples/run.rb +17 -0
  75. data/examples/test.inc +0 -0
  76. data/examples/test.sfp +11 -0
  77. data/lib/naas/d3.js +5 -0
  78. data/lib/naas/d3.v3.min.js +5 -0
  79. data/lib/naas/index.css +0 -0
  80. data/lib/naas/index.html +18 -0
  81. data/lib/naas/index.js +18 -0
  82. data/lib/naas/jquery-1.10.2.min.js +6 -0
  83. data/lib/naas/jquery.js +6 -0
  84. data/lib/naas/naas.rb +160 -0
  85. data/lib/nuri.rb +62 -0
  86. data/lib/nuri/choreographer.rb +151 -0
  87. data/lib/nuri/constraint_helper.rb +9 -0
  88. data/lib/nuri/directory.rb +40 -0
  89. data/lib/nuri/master.rb +725 -0
  90. data/lib/nuri/net_helper.rb +65 -0
  91. data/lib/nuri/orchestrator.rb +224 -0
  92. data/lib/nuri/server.rb +212 -0
  93. data/modules/.gitignore +4 -0
  94. data/modules/apache/apache.rb +255 -0
  95. data/modules/apache/apache.rb.old +167 -0
  96. data/modules/apache/apache.sfp +146 -0
  97. data/modules/apache/apache.sfp.future +100 -0
  98. data/modules/apache/load_balancer +20 -0
  99. data/modules/apache/model.json +1 -0
  100. data/modules/apache/test.sfp +8 -0
  101. data/modules/aptpackage/aptpackage.rb +82 -0
  102. data/modules/aptpackage/aptpackage.sfp +5 -0
  103. data/modules/bonfire/.gitignore +2 -0
  104. data/modules/bonfire/README.md +12 -0
  105. data/modules/bonfire/bonfire.rb +60 -0
  106. data/modules/bonfire/bonfire.sfp +9 -0
  107. data/modules/bonfire/config.yml +4 -0
  108. data/modules/bonfire/helper.rb +149 -0
  109. data/modules/bonfire/stresstest.rb +144 -0
  110. data/modules/bonfire/test.sfp +8 -0
  111. data/modules/client/client.rb +22 -0
  112. data/modules/client/client.sfp +14 -0
  113. data/modules/cloud/cloud.rb +11 -0
  114. data/modules/cloud/cloud.sfp +26 -0
  115. data/modules/file/file.rb +91 -0
  116. data/modules/file/file.sfp +9 -0
  117. data/modules/hadoop1/core-site.xml +17 -0
  118. data/modules/hadoop1/hadoop-env.sh +55 -0
  119. data/modules/hadoop1/hadoop1.rb +384 -0
  120. data/modules/hadoop1/hadoop1.sfp +93 -0
  121. data/modules/hadoop1/hdfs-site.xml +16 -0
  122. data/modules/hadoop1/mapred-site.xml +17 -0
  123. data/modules/hadoop2/core-site.xml +31 -0
  124. data/modules/hadoop2/hadoop-env.sh +77 -0
  125. data/modules/hadoop2/hadoop2.rb +401 -0
  126. data/modules/hadoop2/hadoop2.sfp +114 -0
  127. data/modules/hadoop2/hdfs-site.xml +47 -0
  128. data/modules/hadoop2/mapred-site.xml +71 -0
  129. data/modules/hadoop2/ports +14 -0
  130. data/modules/hadoop2/yarn-env.sh +112 -0
  131. data/modules/hadoop2/yarn-site.xml +107 -0
  132. data/modules/hpcloud/.gitignore +2 -0
  133. data/modules/hpcloud/README.md +16 -0
  134. data/modules/hpcloud/config.yml +3 -0
  135. data/modules/hpcloud/example.sfp +18 -0
  136. data/modules/hpcloud/hpcloud.rb +241 -0
  137. data/modules/hpcloud/hpcloud.sfp +22 -0
  138. data/modules/hpcloud/test.sfp +5 -0
  139. data/modules/install_module +65 -0
  140. data/modules/machine/machine.rb +95 -0
  141. data/modules/machine/machine.sfp +9 -0
  142. data/modules/mockcloud/mockcloud.rb +20 -0
  143. data/modules/mockcloud/mockcloud.sfp +6 -0
  144. data/modules/mysql/mysql.rb +118 -0
  145. data/modules/mysql/mysql.sfp +38 -0
  146. data/modules/mysql/test.sfp +3 -0
  147. data/modules/node/node.rb +8 -0
  148. data/modules/node/node.sfp +7 -0
  149. data/modules/object/object.rb +7 -0
  150. data/modules/object/object.sfp +1 -0
  151. data/modules/os/os.rb +38 -0
  152. data/modules/os/os.sfp +11 -0
  153. data/modules/package/package.rb +26 -0
  154. data/modules/package/package.sfp +22 -0
  155. data/modules/package/test.sfp +6 -0
  156. data/modules/service/model.json +1 -0
  157. data/modules/service/service.rb +50 -0
  158. data/modules/service/service.sfp +46 -0
  159. data/modules/service/test.sfp +6 -0
  160. data/modules/tarpackage/tarpackage.rb +93 -0
  161. data/modules/tarpackage/tarpackage.sfp +5 -0
  162. data/modules/vm/vm.rb +8 -0
  163. data/modules/vm/vm.sfp +18 -0
  164. data/modules/wordpress/wordpress.rb +98 -0
  165. data/modules/wordpress/wordpress.sfp +34 -0
  166. data/modules/wordpresscluster/wordpresscluster.rb +150 -0
  167. data/modules/wordpresscluster/wordpresscluster.sfp +74 -0
  168. data/nuri.gemspec +26 -0
  169. metadata +281 -0
@@ -0,0 +1,100 @@
1
+ schema ServiceState
2
+ uninstalled isa ServiceState { }
3
+ installed isa ServiceState { }
4
+ running isa ServiceState { }
5
+
6
+ schema VHost {
7
+ serverName = ""
8
+ port = 80
9
+ documentRoot = ""
10
+ serverAdmin = ""
11
+ }
12
+
13
+ schema Apache {
14
+ state = uninstalled
15
+ version = "latest"
16
+ module_php = false
17
+ module_php_mysql = false
18
+
19
+ default isa VHost {
20
+ serverName = "*"
21
+ port = 80
22
+ document = "/var/www"
23
+ serverAdmin = "webmaster@localhost"
24
+ }
25
+
26
+ sub install {
27
+ condition {
28
+ this.state = uninstalled
29
+ }
30
+ effect {
31
+ this.state = installed
32
+ }
33
+ }
34
+
35
+ sub uninstall {
36
+ condition {
37
+ this.state = installed
38
+ }
39
+ effect {
40
+ this.state = uninstalled
41
+ }
42
+ }
43
+
44
+ sub start {
45
+ condition {
46
+ this.state = installed
47
+ }
48
+ effect {
49
+ this.state = running
50
+ }
51
+ }
52
+
53
+ sub stop {
54
+ condition {
55
+ this.state = running
56
+ }
57
+ effect {
58
+ this.state = uninstalled
59
+ }
60
+ }
61
+
62
+ sub install_module_php {
63
+ condition {
64
+ this.installed = true
65
+ this.running = false
66
+ }
67
+ effect {
68
+ this.module_php = true
69
+ }
70
+ }
71
+
72
+ sub uninstall_module_php {
73
+ condition {
74
+ this.running = false
75
+ }
76
+ effect {
77
+ this.php_module = false
78
+ }
79
+ }
80
+
81
+ sub install_module_php_mysql {
82
+ condition {
83
+ this.module_php = true
84
+ this.installed = true
85
+ this.running = false
86
+ }
87
+ effect {
88
+ this.module_php_mysql = true
89
+ }
90
+ }
91
+
92
+ sub uninstall_module_php_mysql {
93
+ condition {
94
+ this.running = false
95
+ }
96
+ effect {
97
+ this.module_php_mysql = false
98
+ }
99
+ }
100
+ }
@@ -0,0 +1,20 @@
1
+ <VirtualHost *:80>
2
+ ProxyRequests off
3
+ ServerName <server_name>
4
+
5
+ <Proxy balancer://nuricluster>
6
+ ### Balancer Members ###
7
+ Order Deny,Allow
8
+ Deny from none
9
+ Allow from all
10
+ ProxySet lbmethod=byrequests
11
+ </Proxy>
12
+ <Location /balancer-manager>
13
+ SetHandler balancer-manager
14
+ Order Deny,Allow
15
+ Allow from all
16
+ </Location>
17
+ ProxyPass /balancer-manager !
18
+ ProxyPass / balancer://nuricluster/
19
+ </VirtualHost>
20
+
@@ -0,0 +1 @@
1
+ {"Object":{"_self":"Object","_context":"class"},"Package":{"_self":"Package","_context":"class","package_name":"","installed":false,"version":"","install":{"_self":"install","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.installed":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.installed":{"_context":"mutation","_type":"equals","_value":true}}},"uninstall":{"_self":"uninstall","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.installed":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.installed":{"_context":"mutation","_type":"equals","_value":false}}},"_extends":"$.Object","_super":["$.Object"]},"Service":{"_self":"Service","_context":"class","_extends":"$.Package","service_name":"","running":false,"uninstall":{"_self":"uninstall","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.running":{"_context":"constraint","_type":"equals","_value":false},"$.this.installed":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.this.installed":{"_context":"mutation","_type":"equals","_value":false}}},"start":{"_self":"start","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.installed":{"_context":"constraint","_type":"equals","_value":true},"$.this.running":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.running":{"_context":"mutation","_type":"equals","_value":true}}},"stop":{"_self":"stop","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.running":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.this.running":{"_context":"mutation","_type":"equals","_value":false}}},"package_name":"","installed":false,"version":"","install":{"_self":"install","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.installed":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.installed":{"_context":"mutation","_type":"equals","_value":true}}},"_super":["$.Object","$.Package"]},"Apache":{"_self":"Apache","_context":"class","_extends":"$.Service","package_name":"apache2","service_name":"apache2","port":80,"document_root":"/var/www","php_module":false,"php_mysql_module":false,"server_name":"","libaugeas_ruby":{"_self":"libaugeas_ruby","_context":"object","_isa":"$.Package","_is_array":false,"package_name":"libaugeas-ruby","installed":true,"version":"","install":{"_self":"install","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.installed":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.installed":{"_context":"mutation","_type":"equals","_value":true}}},"uninstall":{"_self":"uninstall","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.installed":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.installed":{"_context":"mutation","_type":"equals","_value":false}}},"_classes":["$.Object","$.Package"]},"install":{"_self":"install","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.installed":{"_context":"constraint","_type":"equals","_value":false},"$.this.libaugeas.installed":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.this.installed":{"_context":"mutation","_type":"equals","_value":true}}},"uninstall":{"_self":"uninstall","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.installed":{"_context":"constraint","_type":"equals","_value":true},"$.this.running":{"_context":"constraint","_type":"equals","_value":false},"$.this.php_module":{"_context":"constraint","_type":"equals","_value":false},"$.this.php_mysql_module":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.installed":{"_context":"mutation","_type":"equals","_value":false}}},"set_document_root":{"_self":"set_document_root","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.running":{"_context":"constraint","_type":"equals","_value":false},"$.this.installed":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.this.document_root":{"_context":"mutation","_type":"equals","_value":"$.target"}},"target":{"_context":"null","_isa":"$.String"}},"set_server_name":{"_self":"set_server_name","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.running":{"_context":"constraint","_type":"equals","_value":false},"$.this.installed":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.this.server_name":{"_context":"mutation","_type":"equals","_value":"$.target"}},"target":{"_context":"null","_isa":"$.String"}},"install_php_module":{"_self":"install_php_module","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.installed":{"_context":"constraint","_type":"equals","_value":true},"$.this.running":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.php_module":{"_context":"mutation","_type":"equals","_value":true}}},"uninstall_php_module":{"_self":"uninstall_php_module","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.running":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.php_module":{"_context":"mutation","_type":"equals","_value":false}}},"install_php_mysql_module":{"_self":"install_php_mysql_module","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.php_module":{"_context":"constraint","_type":"equals","_value":true},"$.this.installed":{"_context":"constraint","_type":"equals","_value":true},"$.this.running":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.php_mysql_module":{"_context":"mutation","_type":"equals","_value":true}}},"uninstall_php_mysql_module":{"_self":"uninstall_php_mysql_module","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.running":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.php_mysql_module":{"_context":"mutation","_type":"equals","_value":false}}},"running":false,"start":{"_self":"start","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.installed":{"_context":"constraint","_type":"equals","_value":true},"$.this.running":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.running":{"_context":"mutation","_type":"equals","_value":true}}},"stop":{"_self":"stop","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.running":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.this.running":{"_context":"mutation","_type":"equals","_value":false}}},"installed":false,"version":"","_super":["$.Object","$.Package","$.Service"]},"apache":{"_self":"apache","_context":"object","_isa":"$.Apache","_is_array":false,"package_name":"apache2","service_name":"apache2","port":80,"document_root":"/var/www","php_module":false,"php_mysql_module":false,"server_name":"","libaugeas_ruby":{"_self":"libaugeas_ruby","_context":"object","_isa":"$.Package","_is_array":false,"package_name":"libaugeas-ruby","installed":true,"version":"","install":{"_self":"install","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.installed":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.installed":{"_context":"mutation","_type":"equals","_value":true}}},"uninstall":{"_self":"uninstall","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.installed":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.installed":{"_context":"mutation","_type":"equals","_value":false}}},"_classes":["$.Object","$.Package"]},"install":{"_self":"install","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.installed":{"_context":"constraint","_type":"equals","_value":false},"$.this.libaugeas.installed":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.this.installed":{"_context":"mutation","_type":"equals","_value":true}}},"uninstall":{"_self":"uninstall","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.installed":{"_context":"constraint","_type":"equals","_value":true},"$.this.running":{"_context":"constraint","_type":"equals","_value":false},"$.this.php_module":{"_context":"constraint","_type":"equals","_value":false},"$.this.php_mysql_module":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.installed":{"_context":"mutation","_type":"equals","_value":false}}},"set_document_root":{"_self":"set_document_root","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.running":{"_context":"constraint","_type":"equals","_value":false},"$.this.installed":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.this.document_root":{"_context":"mutation","_type":"equals","_value":"$.target"}},"target":{"_context":"null","_isa":"$.String"}},"set_server_name":{"_self":"set_server_name","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.running":{"_context":"constraint","_type":"equals","_value":false},"$.this.installed":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.this.server_name":{"_context":"mutation","_type":"equals","_value":"$.target"}},"target":{"_context":"null","_isa":"$.String"}},"install_php_module":{"_self":"install_php_module","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.installed":{"_context":"constraint","_type":"equals","_value":true},"$.this.running":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.php_module":{"_context":"mutation","_type":"equals","_value":true}}},"uninstall_php_module":{"_self":"uninstall_php_module","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.running":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.php_module":{"_context":"mutation","_type":"equals","_value":false}}},"install_php_mysql_module":{"_self":"install_php_mysql_module","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.php_module":{"_context":"constraint","_type":"equals","_value":true},"$.this.installed":{"_context":"constraint","_type":"equals","_value":true},"$.this.running":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.php_mysql_module":{"_context":"mutation","_type":"equals","_value":true}}},"uninstall_php_mysql_module":{"_self":"uninstall_php_mysql_module","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.running":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.php_mysql_module":{"_context":"mutation","_type":"equals","_value":false}}},"running":false,"start":{"_self":"start","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.installed":{"_context":"constraint","_type":"equals","_value":true},"$.this.running":{"_context":"constraint","_type":"equals","_value":false}},"_effect":{"_context":"effect","_type":"and","$.this.running":{"_context":"mutation","_type":"equals","_value":true}}},"stop":{"_self":"stop","_context":"procedure","_cost":1,"_condition":{"_context":"constraint","_type":"and","$.this.running":{"_context":"constraint","_type":"equals","_value":true}},"_effect":{"_context":"effect","_type":"and","$.this.running":{"_context":"mutation","_type":"equals","_value":false}}},"installed":false,"version":"","_classes":["$.Object","$.Package","$.Service","$.Apache"]}}
@@ -0,0 +1,8 @@
1
+ include "apache.sfp"
2
+
3
+ apache isa Apache
4
+
5
+ /*augeas isa Package {
6
+ package_name = "libaugeas-ruby"
7
+ installed = true
8
+ }*/
@@ -0,0 +1,82 @@
1
+ class Sfp::Module::AptPackage
2
+ include Sfp::Resource
3
+
4
+ def update_state
5
+ to_model
6
+
7
+ @state['installed'] = installed?
8
+ @state['version'] = version?
9
+ end
10
+
11
+ ##############################
12
+ #
13
+ # Action methods (see TarPackage.sfp)
14
+ #
15
+ ##############################
16
+
17
+ def install(p={})
18
+ Sfp::Module::AptPackage.install(@model['package_name'].to_s.strip)
19
+ end
20
+
21
+ def uninstall(p={})
22
+ Sfp::Module::AptPackage.uninstall(@model['package_name'].to_s.strip)
23
+ end
24
+
25
+ ##############################
26
+ #
27
+ # Helper methods
28
+ #
29
+ ##############################
30
+
31
+ def self.installed?(package)
32
+ package = package.to_s.strip
33
+ return false if package.length <= 0
34
+ data = `/usr/bin/dpkg-query -W #{package} 2> /dev/null`.strip.chop.split(' ')
35
+ return true if data[0].to_s == package
36
+ false
37
+ end
38
+
39
+ def self.version?(package)
40
+ package = package.to_s.strip
41
+ return nil if package.length <= 0
42
+ data = `/usr/bin/dpkg-query -W #{package} 2> /dev/null`.strip.chop.split(' ')
43
+ return data[1] if data[0].to_s == package
44
+ nil
45
+ end
46
+
47
+ def self.install(package)
48
+ return false if not package.is_a?(String) or package.length <= 0
49
+ return true if Sfp::Module::Package.installed?(package)
50
+ system("dpkg --configure -a")
51
+ system("apt-get -y --purge autoremove")
52
+ return true if system("apt-get -y install #{package}")
53
+ system("dpkg --configure -a")
54
+ system("apt-get -y update")
55
+ !!system("apt-get -y install #{package}")
56
+ end
57
+
58
+ def self.uninstall(package)
59
+ return false if not package.is_a?(String) or package.length <= 0
60
+ return true if not Sfp::Module::Package.installed?(package)
61
+ system("dpkg --configure -a")
62
+ system("apt-get -y --purge autoremove")
63
+ return (!!system("sudo apt-get -y --purge remove #{package}") and
64
+ !!system("sudo apt-get -y --purge autoremove") and
65
+ !!system("sudo apt-get -y --purge autoremove"))
66
+ end
67
+
68
+ protected
69
+ def installed?
70
+ Sfp::Module::AptPackage.installed?(@model['package_name'].to_s.strip)
71
+ end
72
+
73
+ def version?
74
+ package = @model['package_name'].to_s.strip
75
+ return nil if package.length <= 0
76
+ installed = `apt-cache policy #{package} | grep Installed`.strip.split(' ', 2)[1].to_s.strip
77
+ return "" if installed.length <= 0
78
+ candidate = `apt-cache policy #{package} | grep Candidate`.strip.split(' ', 2)[1].to_s.strip
79
+ return "latest" if candidate == installed
80
+ installed
81
+ end
82
+ end
@@ -0,0 +1,5 @@
1
+ include "../package/package.sfp"
2
+
3
+ schema AptPackage extends Package {
4
+ final source = "default"
5
+ }
@@ -0,0 +1,2 @@
1
+ *.pem
2
+ model.json
@@ -0,0 +1,12 @@
1
+ BonFIRE Module
2
+ ==============
3
+
4
+ Required Gems
5
+ -------------
6
+ - restfully
7
+ - restfully-addons
8
+
9
+ Additional Files
10
+ ----------------
11
+ - bonfire.pem : A private key file to access your BonFIRE account. This file should be put in module's directory.
12
+ - config.yml : The username and password of your BonFIRE account should be defined in this file.
@@ -0,0 +1,60 @@
1
+ require 'restfully'
2
+ require 'restfully/addons/bonfire'
3
+
4
+ load File.expand_path(File.dirname(__FILE__)) + "/helper.rb"
5
+
6
+ class Sfp::Module::Bonfire
7
+ include Sfp::Resource
8
+
9
+ def initialize
10
+ @home_dir = File.expand_path(File.dirname(__FILE__))
11
+ @session = @experiment = @location = nil
12
+ end
13
+
14
+ def update_state
15
+ to_model
16
+ @state['running'] = self.open_connection
17
+ @state['vms'] = self.get_vms
18
+ end
19
+
20
+ def create_vm(p={})
21
+ name = p['vm'].to_s.strip
22
+ return false if name == ''
23
+
24
+ begin
25
+ name.sub!(/^\$\./, '')
26
+ server = self.create_server({
27
+ :name => name,
28
+ :image => @model['image_name'],
29
+ :wan => @model['wan_name'],
30
+ })
31
+ if !server.nil?
32
+ if !self.install_agent(server)
33
+ delete_vm(p)
34
+ return false
35
+ end
36
+ return true
37
+ end
38
+ rescue Exception => e
39
+ Sfp::Agent.logger.error "Delete VM [Failed] #{e}\n#{e.backtrace.join("\n")}"
40
+ end
41
+ false
42
+ end
43
+
44
+ def delete_vm(p={})
45
+ name = p['vm'].to_s.strip
46
+ return false if name == ''
47
+
48
+ begin
49
+ name.sub!(/^\$\./, '')
50
+ return self.delete_server({
51
+ :name => name
52
+ })
53
+ rescue Exception => e
54
+ Sfp::Agent.logger.error "Delete VM [Failed] #{e}\n#{e.backtrace.join("\n")}"
55
+ end
56
+ false
57
+ end
58
+
59
+ include Sfp::Module::BonfireHelper
60
+ end
@@ -0,0 +1,9 @@
1
+ include "../cloud/cloud.sfp"
2
+
3
+ schema Bonfire extends Cloud {
4
+ final gateway is "ssh.bonfire.grid5000.fr"
5
+ final experiment is ""
6
+ final location is "uk-epcc"
7
+ final image_name is "BonFIRE Debian Squeeze 10G v5"
8
+ final wan_name is "BonFIRE WAN"
9
+ }
@@ -0,0 +1,4 @@
1
+ uri: https://api.bonfire-project.eu/
2
+ username:
3
+ password:
4
+ require: ['ApplicationVndBonfireXml']
@@ -0,0 +1,149 @@
1
+ require 'rubygems'
2
+ require 'restfully'
3
+ require 'restfully/addons/bonfire'
4
+
5
+ module Sfp::Module::BonfireHelper
6
+ def open_connection
7
+ return true if not @session.nil?
8
+
9
+ begin
10
+ @session = Restfully::Session.new(
11
+ :configuration_file => @home_dir + '/config.yml',
12
+ :gateway => @model['gateway'],
13
+ :keys => @home_dir + '/bonfire.pem',
14
+ :cache => false,
15
+ :logger => Sfp::Agent.logger
16
+ ) if @session.nil?
17
+
18
+ @experiment = (@session.root.experiments.find { |e|
19
+ e['name'] == @model['experiment'] && e['status'] == 'running'
20
+ } || false) if @experiment.nil? and !@session.nil?
21
+
22
+ @location = @session.root.locations[@model['location'].to_sym] if
23
+ @location.nil? and !@session.nil?
24
+
25
+ return (!@session.nil? and !@experiment.nil? and !@location.nil?)
26
+ rescue Exception => e
27
+ Sfp::Agent.logger.warn "Cannot open connection! #{e}\n#{e.backtrace.join("\n")}"
28
+ end
29
+ false
30
+ end
31
+
32
+ def running?(vm)
33
+ (vm.reload['state'] == 'ACTIVE' || vm.reload['state'] == 'RUNNING' ||
34
+ vm.reload['state'] == 'up')
35
+ end
36
+
37
+ def create_server(p={})
38
+ open_connection
39
+
40
+ name = p[:name]
41
+ image_name = p[:image]
42
+ wan_name = p[:wan]
43
+
44
+ @session.logger.info "Launching #{name} in #{@location['name']}..."
45
+ server = @experiment.computes.find { |vm|
46
+ vm['name'] == name
47
+ } || @experiment.computes.submit(
48
+ :name => name,
49
+ :instance_type => "small",
50
+ :disk => [{
51
+ :storage => @location.storages.find { |s|
52
+ s['name'] == image_name
53
+ },
54
+ :type => "OS"
55
+ }],
56
+ :nic => [
57
+ {:network => @location.networks.find { |n| n['name'] == wan_name }}
58
+ ],
59
+ :location => @location
60
+ )
61
+ server_ip = server['nic'][0]['ip']
62
+ @session.logger.info "#{name} IP=#{server_ip}"
63
+
64
+ @experiment.update(:status => "running")
65
+
66
+ @session.logger.info "#{name} is not ready. Waiting..."
67
+ wait_time = 3600 # 1-hour
68
+ tries = wait_time # 30 # 10 minutes
69
+ until [server].all? { |vm|
70
+ tries <= 0 || (running?(vm) && vm.ssh.accessible?)
71
+ } do
72
+ fail "#{name} has failed" if [server].any? { |vm|
73
+ vm['state'] == "FAILED"
74
+ }
75
+ sleep 1 #20
76
+ tries -= 1
77
+ end
78
+ fail "Cannot create #{name}: too long waiting!" if !running?(server)
79
+
80
+ server.ssh do |ssh|
81
+ @session.logger.info "Setting hostname..."
82
+ output = ssh.exec! "hostname"
83
+ if output.chop != name
84
+ ssh.exec! "/bin/echo #{name} > /etc/hostname"
85
+ ssh.exec! "/etc/init.d/hostname.sh start"
86
+ ssh.exec! "/bin/sed -i 's/#{name}.*/#{name}/g' /etc/hosts"
87
+ ssh.exec! "/bin/echo '127.0.0.1 #{name}' >> /etc/hosts"
88
+ end
89
+ end
90
+
91
+ @session.logger.info "VM:#{server['name']} is READY! IP: #{server['nic'][0]['ip']}"
92
+
93
+ server
94
+ end
95
+
96
+ def install_agent(server)
97
+ begin
98
+ @session.logger.info "Installing agent to #{server['name']}:#{server['nic'][0]['ip']}"
99
+ server.ssh do |ssh|
100
+ ssh.exec! 'apt-get update; apt-get -y install sudo ruby1.9.1 ruby1.9.1-dev libz-dev libaugeas-ruby1.9.1 make gcc libxml2-dev libxslt-dev libreadline-dev'
101
+ ssh.exec! 'ln -sf /usr/bin/ruby1.9.1 /usr/bin/ruby'
102
+ ssh.exec! 'ln -sf /usr/bin/gem1.9.1 /usr/bin/gem'
103
+ ssh.exec! 'gem install sfp sfpagent fog restfully restfully-addons --no-ri --no-rdoc'
104
+ ssh.exec! 'ln -sf /var/lib/gems/1.9.1/bin/sfpagent /usr/local/bin/sfpagent'
105
+ ssh.exec! 'sfpagent -t ; sfpagent -s'
106
+ end
107
+ return true
108
+ rescue Exception => e
109
+ Sfp::Agent.logger.error "Cannot install the agent. #{e}\n#{e.backtrace.join("\n")}"
110
+ end
111
+ false
112
+ end
113
+
114
+ def delete_server(p={})
115
+ open_connection
116
+ name = p[:name]
117
+
118
+ server = @experiment.computes.find { |vm|
119
+ vm['name'] == name
120
+ } || (return true)
121
+ @session.logger.info "Deleting #{name} ..."
122
+ server.delete
123
+ tries = 30
124
+ until [server].all? { |vm|
125
+ tries > 0 && !running?(vm)
126
+ } do
127
+ @session.logger.info "#{name} is not deleted. Waiting..."
128
+ sleep 10
129
+ tries -= 1
130
+ end
131
+ !running?(server)
132
+ end
133
+
134
+ def get_vms(p={})
135
+ open_connection
136
+
137
+ vms = {}
138
+ @experiment.computes.each { |server|
139
+ if server.uri.to_s =~ /\/locations\/#{@model['location']}\/computes\//
140
+ vms[ server['name'] ] = {
141
+ 'running' => running?(server),
142
+ 'ip' => server['nic'][0]['ip'],
143
+ 'uri' => server.uri,
144
+ }
145
+ end
146
+ } if @experiment
147
+ vms
148
+ end
149
+ end