vagrant-clone 0.0.1 → 0.0.3

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 (306) hide show
  1. checksums.yaml +4 -4
  2. data/.idea/.rakeTasks +7 -0
  3. data/.idea/inspectionProfiles/Project_Default.xml +6 -0
  4. data/.idea/misc.xml +4 -0
  5. data/.idea/modules.xml +8 -0
  6. data/.idea/runConfigurations/clone.xml +21 -0
  7. data/.idea/runConfigurations/libvirt.xml +21 -0
  8. data/.idea/vagrant-clone.iml +114 -0
  9. data/.idea/vcs.xml +6 -0
  10. data/.idea/workspace.xml +948 -0
  11. data/Gemfile +9 -3
  12. data/Gemfile.lock +123 -37
  13. data/Rakefile +2 -1
  14. data/Vagrantfile +9 -0
  15. data/cookbooks/apt/CHANGELOG.md +321 -0
  16. data/cookbooks/apt/CONTRIBUTING.md +2 -0
  17. data/cookbooks/apt/MAINTAINERS.md +15 -0
  18. data/cookbooks/apt/README.md +250 -0
  19. data/cookbooks/apt/attributes/default.rb +57 -0
  20. data/cookbooks/apt/files/15update-stamp +1 -0
  21. data/cookbooks/apt/files/apt-proxy-v2.conf +50 -0
  22. data/cookbooks/apt/libraries/helpers.rb +49 -0
  23. data/cookbooks/apt/libraries/matchers.rb +16 -0
  24. data/cookbooks/apt/metadata.json +1 -0
  25. data/cookbooks/apt/recipes/cacher-client.rb +52 -0
  26. data/cookbooks/apt/recipes/cacher-ng.rb +39 -0
  27. data/cookbooks/apt/recipes/default.rb +93 -0
  28. data/cookbooks/apt/recipes/unattended-upgrades.rb +47 -0
  29. data/cookbooks/apt/resources/preference.rb +90 -0
  30. data/cookbooks/apt/templates/01proxy.erb +11 -0
  31. data/cookbooks/apt/templates/10dpkg-options.erb +8 -0
  32. data/cookbooks/apt/templates/10recommends.erb +3 -0
  33. data/cookbooks/apt/templates/20auto-upgrades.erb +5 -0
  34. data/cookbooks/apt/templates/50unattended-upgrades.erb +75 -0
  35. data/cookbooks/apt/templates/acng.conf.erb +275 -0
  36. data/cookbooks/apt/templates/unattended-upgrades.seed.erb +1 -0
  37. data/cookbooks/build-essential/.foodcritic +1 -0
  38. data/cookbooks/build-essential/CHANGELOG.md +257 -0
  39. data/cookbooks/build-essential/CONTRIBUTING.md +2 -0
  40. data/cookbooks/build-essential/MAINTAINERS.md +15 -0
  41. data/cookbooks/build-essential/README.md +134 -0
  42. data/cookbooks/build-essential/attributes/default.rb +21 -0
  43. data/cookbooks/build-essential/libraries/matchers.rb +9 -0
  44. data/cookbooks/build-essential/metadata.json +1 -0
  45. data/cookbooks/build-essential/recipes/_windows.rb +53 -0
  46. data/cookbooks/build-essential/recipes/default.rb +24 -0
  47. data/cookbooks/build-essential/resources/build_essential.rb +106 -0
  48. data/cookbooks/build-essential/resources/xcode_command_line_tools.rb +61 -0
  49. data/cookbooks/compat_resource/CHANGELOG.md +53 -0
  50. data/cookbooks/compat_resource/CONTRIBUTING.md +2 -0
  51. data/cookbooks/compat_resource/MAINTAINERS.md +16 -0
  52. data/cookbooks/compat_resource/README.md +60 -0
  53. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/constants.rb +47 -0
  54. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/delayed_evaluator.rb +40 -0
  55. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/dsl/core.rb +73 -0
  56. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/dsl/declare_resource.rb +315 -0
  57. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/dsl/platform_introspection.rb +292 -0
  58. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/dsl/recipe.rb +37 -0
  59. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/dsl/universal.rb +70 -0
  60. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/mixin/lazy_module_include.rb +98 -0
  61. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/mixin/notifying_block.rb +74 -0
  62. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/mixin/params_validate.rb +510 -0
  63. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/mixin/powershell_out.rb +117 -0
  64. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/mixin/properties.rb +328 -0
  65. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb +713 -0
  66. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider/apt_repository.rb +269 -0
  67. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider/apt_update.rb +105 -0
  68. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider/noop.rb +56 -0
  69. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider/support/yum_repo.erb +132 -0
  70. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider/systemd_unit.rb +253 -0
  71. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider/yum_repository.rb +136 -0
  72. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider.rb +164 -0
  73. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource/action_class.rb +114 -0
  74. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource/apt_repository.rb +65 -0
  75. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource/apt_update.rb +52 -0
  76. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource/systemd_unit.rb +81 -0
  77. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource/yum_repository.rb +97 -0
  78. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource.rb +214 -0
  79. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource_builder.rb +174 -0
  80. data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef.rb +29 -0
  81. data/cookbooks/compat_resource/files/lib/chef_compat/mixin/properties.rb +8 -0
  82. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/exceptions.rb +10 -0
  83. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/log.rb +30 -0
  84. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/mixin/params_validate.rb +17 -0
  85. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/node.rb +9 -0
  86. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/property.rb +15 -0
  87. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/provider.rb +65 -0
  88. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/recipe.rb +118 -0
  89. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/recipe_hook.rb +20 -0
  90. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/resource/lwrp_base.rb +60 -0
  91. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/resource.rb +156 -0
  92. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/resource_builder.rb +167 -0
  93. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/resource_collection/resource_list.rb +49 -0
  94. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/resource_collection/resource_set.rb +49 -0
  95. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/resource_collection.rb +103 -0
  96. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/run_context.rb +691 -0
  97. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/runner.rb +153 -0
  98. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef.rb +33 -0
  99. data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches.rb +41 -0
  100. data/cookbooks/compat_resource/files/lib/chef_compat/property.rb +6 -0
  101. data/cookbooks/compat_resource/files/lib/chef_compat/recipe.rb +8 -0
  102. data/cookbooks/compat_resource/files/lib/chef_compat/resource/lwrp_base.rb +44 -0
  103. data/cookbooks/compat_resource/files/lib/chef_compat/resource.rb +56 -0
  104. data/cookbooks/compat_resource/files/lib/chef_upstream_version.rb +3 -0
  105. data/cookbooks/compat_resource/files/lib/compat_resource.rb +35 -0
  106. data/cookbooks/compat_resource/libraries/autoload.rb +31 -0
  107. data/cookbooks/compat_resource/metadata.json +1 -0
  108. data/cookbooks/inifile_chef_gem/CHANGELOG.md +11 -0
  109. data/cookbooks/inifile_chef_gem/README.md +46 -0
  110. data/cookbooks/inifile_chef_gem/metadata.json +51 -0
  111. data/cookbooks/inifile_chef_gem/metadata.rb +11 -0
  112. data/cookbooks/inifile_chef_gem/resources/default.rb +28 -0
  113. data/cookbooks/mariadb/CHANGELOG.md +332 -0
  114. data/cookbooks/mariadb/README.md +225 -0
  115. data/cookbooks/mariadb/attributes/default.rb +199 -0
  116. data/cookbooks/mariadb/libraries/mariadb_conn_helper.rb +53 -0
  117. data/cookbooks/mariadb/libraries/mariadb_helper.rb +216 -0
  118. data/cookbooks/mariadb/libraries/matchers.rb +21 -0
  119. data/cookbooks/mariadb/metadata.json +1 -0
  120. data/cookbooks/mariadb/providers/configuration.rb +39 -0
  121. data/cookbooks/mariadb/recipes/_audit_plugin.rb +63 -0
  122. data/cookbooks/mariadb/recipes/_debian_galera.rb +62 -0
  123. data/cookbooks/mariadb/recipes/_debian_server.rb +78 -0
  124. data/cookbooks/mariadb/recipes/_mariadb_repository.rb +29 -0
  125. data/cookbooks/mariadb/recipes/_redhat_client.rb +27 -0
  126. data/cookbooks/mariadb/recipes/_redhat_galera.rb +55 -0
  127. data/cookbooks/mariadb/recipes/_redhat_server.rb +58 -0
  128. data/cookbooks/mariadb/recipes/client.rb +47 -0
  129. data/cookbooks/mariadb/recipes/config.rb +115 -0
  130. data/cookbooks/mariadb/recipes/default.rb +46 -0
  131. data/cookbooks/mariadb/recipes/devel.rb +41 -0
  132. data/cookbooks/mariadb/recipes/galera.rb +324 -0
  133. data/cookbooks/mariadb/recipes/plugins.rb +3 -0
  134. data/cookbooks/mariadb/recipes/repository.rb +45 -0
  135. data/cookbooks/mariadb/recipes/server.rb +157 -0
  136. data/cookbooks/mariadb/resources/configuration.rb +13 -0
  137. data/cookbooks/mariadb/resources/mysql2_gem.rb +25 -0
  138. data/cookbooks/mariadb/resources/replication.rb +192 -0
  139. data/cookbooks/mariadb/templates/default/conf.d.generic.erb +19 -0
  140. data/cookbooks/mariadb/templates/default/debian.cnf.erb +12 -0
  141. data/cookbooks/mariadb/templates/default/mariadb-server.seed.erb +13 -0
  142. data/cookbooks/mariadb/templates/default/mariadb_grants.erb +42 -0
  143. data/cookbooks/mariadb/templates/default/my.cnf.erb +210 -0
  144. data/cookbooks/mariadb/templates/default/root.cnf.erb +5 -0
  145. data/cookbooks/mingw/.foodcritic +1 -0
  146. data/cookbooks/mingw/CHANGELOG.md +50 -0
  147. data/cookbooks/mingw/CONTRIBUTING.md +2 -0
  148. data/cookbooks/mingw/MAINTAINERS.md +14 -0
  149. data/cookbooks/mingw/README.md +133 -0
  150. data/cookbooks/mingw/files/default/bash.bat +17 -0
  151. data/cookbooks/mingw/files/default/custom-upgrade.sh +23 -0
  152. data/cookbooks/mingw/files/default/custom_prefix.sh +13 -0
  153. data/cookbooks/mingw/files/default/pthread.h +719 -0
  154. data/cookbooks/mingw/files/default/time.h +297 -0
  155. data/cookbooks/mingw/libraries/_helper.rb +38 -0
  156. data/cookbooks/mingw/metadata.json +1 -0
  157. data/cookbooks/mingw/recipes/default.rb +19 -0
  158. data/cookbooks/mingw/resources/get.rb +56 -0
  159. data/cookbooks/mingw/resources/msys2_package.rb +139 -0
  160. data/cookbooks/mingw/resources/tdm_gcc.rb +114 -0
  161. data/cookbooks/ohai/.foodcritic +2 -0
  162. data/cookbooks/ohai/CHANGELOG.md +166 -0
  163. data/cookbooks/ohai/CONTRIBUTING.md +2 -0
  164. data/cookbooks/ohai/MAINTAINERS.md +15 -0
  165. data/cookbooks/ohai/README.md +134 -0
  166. data/cookbooks/ohai/libraries/matchers.rb +41 -0
  167. data/cookbooks/ohai/metadata.json +1 -0
  168. data/cookbooks/ohai/recipes/default.rb +20 -0
  169. data/cookbooks/ohai/resources/hint.rb +55 -0
  170. data/cookbooks/ohai/resources/plugin.rb +117 -0
  171. data/cookbooks/selinux_policy/.gitignore +51 -0
  172. data/cookbooks/selinux_policy/.kitchen.yml +25 -0
  173. data/cookbooks/selinux_policy/.rubocop.yml +2 -0
  174. data/cookbooks/selinux_policy/.travis.yml +26 -0
  175. data/cookbooks/selinux_policy/Berksfile +8 -0
  176. data/cookbooks/selinux_policy/CHANGELOG.md +155 -0
  177. data/cookbooks/selinux_policy/LICENSE +13 -0
  178. data/cookbooks/selinux_policy/README.md +217 -0
  179. data/cookbooks/selinux_policy/Rakefile +68 -0
  180. data/cookbooks/selinux_policy/TESTING.md +2 -0
  181. data/cookbooks/selinux_policy/Thorfile +12 -0
  182. data/cookbooks/selinux_policy/attributes/default.rb +5 -0
  183. data/cookbooks/selinux_policy/chefignore +102 -0
  184. data/cookbooks/selinux_policy/libraries/helper-disabled.rb +29 -0
  185. data/cookbooks/selinux_policy/libraries/matchers.rb +57 -0
  186. data/cookbooks/selinux_policy/metadata.json +58 -0
  187. data/cookbooks/selinux_policy/metadata.rb +20 -0
  188. data/cookbooks/selinux_policy/providers/boolean.rb +28 -0
  189. data/cookbooks/selinux_policy/providers/fcontext.rb +78 -0
  190. data/cookbooks/selinux_policy/providers/module.rb +81 -0
  191. data/cookbooks/selinux_policy/providers/permissive.rb +26 -0
  192. data/cookbooks/selinux_policy/providers/port.rb +58 -0
  193. data/cookbooks/selinux_policy/recipes/default.rb +9 -0
  194. data/cookbooks/selinux_policy/recipes/install.rb +32 -0
  195. data/cookbooks/selinux_policy/resources/boolean.rb +8 -0
  196. data/cookbooks/selinux_policy/resources/fcontext.rb +8 -0
  197. data/cookbooks/selinux_policy/resources/module.rb +21 -0
  198. data/cookbooks/selinux_policy/resources/permissive.rb +6 -0
  199. data/cookbooks/selinux_policy/resources/port.rb +9 -0
  200. data/cookbooks/seven_zip/CHANGELOG.md +30 -0
  201. data/cookbooks/seven_zip/README.md +108 -0
  202. data/cookbooks/seven_zip/attributes/default.rb +31 -0
  203. data/cookbooks/seven_zip/libraries/matchers.rb +33 -0
  204. data/cookbooks/seven_zip/metadata.json +1 -0
  205. data/cookbooks/seven_zip/providers/archive.rb +68 -0
  206. data/cookbooks/seven_zip/recipes/default.rb +41 -0
  207. data/cookbooks/seven_zip/resources/archive.rb +29 -0
  208. data/cookbooks/windows/.foodcritic +2 -0
  209. data/cookbooks/windows/CHANGELOG.md +528 -0
  210. data/cookbooks/windows/CONTRIBUTING.md +2 -0
  211. data/cookbooks/windows/MAINTAINERS.md +21 -0
  212. data/cookbooks/windows/README.md +803 -0
  213. data/cookbooks/windows/attributes/default.rb +21 -0
  214. data/cookbooks/windows/files/dism_features.rb +45 -0
  215. data/cookbooks/windows/libraries/matchers.rb +586 -0
  216. data/cookbooks/windows/libraries/powershell_helper.rb +53 -0
  217. data/cookbooks/windows/libraries/registry_helper.rb +356 -0
  218. data/cookbooks/windows/libraries/version.rb +207 -0
  219. data/cookbooks/windows/libraries/version_helper.rb +79 -0
  220. data/cookbooks/windows/libraries/windows_helper.rb +174 -0
  221. data/cookbooks/windows/libraries/windows_privileged.rb +103 -0
  222. data/cookbooks/windows/libraries/wmi_helper.rb +32 -0
  223. data/cookbooks/windows/metadata.json +1 -0
  224. data/cookbooks/windows/recipes/default.rb +21 -0
  225. data/cookbooks/windows/resources/auto_run.rb +46 -0
  226. data/cookbooks/windows/resources/certificate.rb +166 -0
  227. data/cookbooks/windows/resources/certificate_binding.rb +128 -0
  228. data/cookbooks/windows/resources/feature.rb +82 -0
  229. data/cookbooks/windows/resources/feature_dism.rb +108 -0
  230. data/cookbooks/windows/resources/feature_powershell.rb +70 -0
  231. data/cookbooks/windows/resources/feature_servermanagercmd.rb +76 -0
  232. data/cookbooks/windows/resources/font.rb +80 -0
  233. data/cookbooks/windows/resources/http_acl.rb +110 -0
  234. data/cookbooks/windows/resources/pagefile.rb +152 -0
  235. data/cookbooks/windows/resources/path.rb +54 -0
  236. data/cookbooks/windows/resources/printer.rb +103 -0
  237. data/cookbooks/windows/resources/printer_port.rb +101 -0
  238. data/cookbooks/windows/resources/share.rb +291 -0
  239. data/cookbooks/windows/resources/shortcut.rb +53 -0
  240. data/cookbooks/windows/resources/task.rb +384 -0
  241. data/cookbooks/windows/resources/zipfile.rb +125 -0
  242. data/cookbooks/yum/.foodcritic +1 -0
  243. data/cookbooks/yum/CHANGELOG.md +351 -0
  244. data/cookbooks/yum/CONTRIBUTING.md +2 -0
  245. data/cookbooks/yum/MAINTAINERS.md +16 -0
  246. data/cookbooks/yum/README.md +125 -0
  247. data/cookbooks/yum/attributes/main.rb +103 -0
  248. data/cookbooks/yum/libraries/matchers.rb +9 -0
  249. data/cookbooks/yum/metadata.json +1 -0
  250. data/cookbooks/yum/recipes/default.rb +26 -0
  251. data/cookbooks/yum/recipes/dnf_yum_compat.rb +29 -0
  252. data/cookbooks/yum/resources/globalconfig.rb +119 -0
  253. data/cookbooks/yum/templates/.DS_Store +0 -0
  254. data/cookbooks/yum/templates/main.erb +276 -0
  255. data/cookbooks/yum-epel/CHANGELOG.md +138 -0
  256. data/cookbooks/yum-epel/CONTRIBUTING.md +2 -0
  257. data/cookbooks/yum-epel/MAINTAINERS.md +19 -0
  258. data/cookbooks/yum-epel/README.md +172 -0
  259. data/cookbooks/yum-epel/attributes/default.rb +8 -0
  260. data/cookbooks/yum-epel/attributes/epel-debuginfo.rb +15 -0
  261. data/cookbooks/yum-epel/attributes/epel-source.rb +15 -0
  262. data/cookbooks/yum-epel/attributes/epel-testing-debuginfo.rb +15 -0
  263. data/cookbooks/yum-epel/attributes/epel-testing-source.rb +15 -0
  264. data/cookbooks/yum-epel/attributes/epel-testing.rb +15 -0
  265. data/cookbooks/yum-epel/attributes/epel.rb +21 -0
  266. data/cookbooks/yum-epel/metadata.json +1 -0
  267. data/cookbooks/yum-epel/recipes/default.rb +27 -0
  268. data/cookbooks/yum-scl/.kitchen.dokken.yml +24 -0
  269. data/cookbooks/yum-scl/.kitchen.yml +24 -0
  270. data/cookbooks/yum-scl/.rubocop.yml +6 -0
  271. data/cookbooks/yum-scl/.travis.yml +28 -0
  272. data/cookbooks/yum-scl/Berksfile +3 -0
  273. data/cookbooks/yum-scl/Berksfile.lock +25 -0
  274. data/cookbooks/yum-scl/CHANGELOG.md +11 -0
  275. data/cookbooks/yum-scl/Gemfile +46 -0
  276. data/cookbooks/yum-scl/README.md +76 -0
  277. data/cookbooks/yum-scl/attributes/centos.rb +83 -0
  278. data/cookbooks/yum-scl/attributes/default.rb +15 -0
  279. data/cookbooks/yum-scl/attributes/scientific.rb +1 -0
  280. data/cookbooks/yum-scl/files/default/RPM-GPG-KEY-CentOS-SIG-SCLo +20 -0
  281. data/cookbooks/yum-scl/libraries/yum_scl_helper.rb +33 -0
  282. data/cookbooks/yum-scl/metadata.json +42 -0
  283. data/cookbooks/yum-scl/metadata.rb +12 -0
  284. data/cookbooks/yum-scl/recipes/chef_install.rb +52 -0
  285. data/cookbooks/yum-scl/recipes/default.rb +17 -0
  286. data/cookbooks/yum-scl/recipes/native_install.rb +35 -0
  287. data/lib/vagrant-clone/command/clone.rb +66 -61
  288. data/lib/vagrant-clone/errors.rb +61 -0
  289. data/lib/vagrant-clone/util/clone_manager_base.rb +69 -0
  290. data/lib/vagrant-clone/util/clone_managers/docker.rb +31 -0
  291. data/lib/vagrant-clone/util/clone_managers/libvirt.rb +254 -0
  292. data/lib/vagrant-clone/util/vagrantfile_managers/docker.rb +154 -0
  293. data/lib/vagrant-clone/util/vagrantfile_managers/libvirt.rb +159 -0
  294. data/lib/vagrant-clone/version.rb +2 -2
  295. data/lib/vagrant-clone.rb +6 -6
  296. data/libvirt.txt +7 -0
  297. data/performance_testing.rb +165 -0
  298. data/results.txt +45 -0
  299. data/scripts/create_box.sh +134 -0
  300. data/test.rb +92 -0
  301. data/tools/create_box.sh +130 -0
  302. data/vagrant-clone.gemspec +7 -7
  303. metadata +296 -5
  304. data/lib/vagrant-clone/command/errors.rb +0 -16
  305. data/lib/vagrant-clone/command/provider/docker.rb +0 -13
  306. data/lib/vagrant-clone/utils/vagrantfile_manager.rb +0 -47
@@ -0,0 +1,254 @@
1
+ require 'fileutils'
2
+ require 'pathname'
3
+ require 'libvirt'
4
+ require 'nokogiri'
5
+ require 'json'
6
+ require 'net/ssh'
7
+ require 'timeout'
8
+ require 'tmpdir'
9
+ require 'shellwords'
10
+
11
+ module VagrantClone
12
+ class CloneManager < CloneManagerBase
13
+
14
+ # This key will be in names ob boxes and
15
+ # libvirt images for ease of removing
16
+ VAGRANT_BOX_TAG = 'VAGRANTBOX'
17
+
18
+ VAGRANT_DEFAULT_PUBLIC_KEY = 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key'
19
+ METADATA_JSON = <<EOF
20
+ {
21
+ "provider": "libvirt",
22
+ "format": "qcow2",
23
+ "virtual_size": 300
24
+ }
25
+ EOF
26
+
27
+ VAGRANTFILE = <<EOF
28
+ Vagrant.configure("2") do |config|
29
+ config.vm.provider :libvirt do |libvirt|
30
+ libvirt.driver = "kvm"
31
+ libvirt.host = ""
32
+ libvirt.connect_via_ssh = false
33
+ libvirt.storage_pool_name = "default"
34
+ end
35
+ end
36
+ EOF
37
+
38
+ def add_default_vagrant_public_key(machine)
39
+ machine.action 'up', {:destroy_on_error => false, :provision => false, :provider => :libvirt}
40
+ host=machine.ssh_info[:host]
41
+ port=machine.ssh_info[:port]
42
+ user=machine.ssh_info[:username]
43
+ private_key_paths=machine.ssh_info[:private_key_path]
44
+ puts host, port, user, private_key_paths
45
+ Net::SSH.start(host, user, :port => port, :keys => private_key_paths, :paranoid => Net::SSH::Verifiers::Null.new) do |ssh|
46
+ ssh.exec! "echo '#{VAGRANT_DEFAULT_PUBLIC_KEY}' >> $HOME/.ssh/authorized_keys"
47
+ end
48
+ end
49
+
50
+ def create_vagrant_box(machine, vagrant_box_name, vagrant_box_version)
51
+ conn = Libvirt::open('qemu:///system')
52
+ domain = conn.lookup_domain_by_uuid machine.id
53
+ domain_xml_desc = Nokogiri::XML domain.xml_desc
54
+ domain_image_path = domain_xml_desc.xpath('//domain//devices//disk//source//@file')[0].content
55
+ Dir.mktmpdir do |dir|
56
+ new_image_name = "#{vagrant_box_name}_vagrant_box_image_#{vagrant_box_version}"
57
+ path_to_new_image = Pathname.new(dir).join "#{new_image_name}.img"
58
+ system "sudo chmod 644 #{Shellwords.escape domain_image_path}"
59
+ system "qemu-img create -f qcow2 -b '#{domain_image_path}' '#{path_to_new_image}'"
60
+ system "sudo chmod 600 #{Shellwords.escape domain_image_path}"
61
+ pool = conn.lookup_storage_pool_by_name 'default'
62
+ pool_vol_xml = <<EOF
63
+ <volume>
64
+ <name>#{vagrant_box_name}_vagrant_box_image_#{vagrant_box_version}.img</name>
65
+ <allocation>0</allocation>
66
+ <capacity unit="G">40</capacity>
67
+ </volume>
68
+ EOF
69
+ volume = pool.create_volume_xml(pool_vol_xml)
70
+ stream = conn.stream
71
+ image_file = File.open(path_to_new_image, 'rb')
72
+ volume.upload(stream, 0, image_file.size)
73
+ stream.sendall do |_opaque, n|
74
+ begin
75
+ r = image_file.read(n)
76
+ r ? [r.length, r] : [0, '']
77
+ rescue Exception => e
78
+ @vagrant_env.ui.error "Got exception #{e}"
79
+ [-1, '']
80
+ end
81
+ end
82
+ stream.finish
83
+ path_to_vagrant_box = Pathname.new(dir).join "#{new_image_name}.box"
84
+ path_to_vagrant_box_image = Pathname.new(dir).join 'box.img'
85
+ path_to_metadata = Pathname.new(dir).join 'metadata.json'
86
+ path_to_vagrantfile = Pathname.new(dir).join 'Vagrantfile'
87
+ FileUtils.mv path_to_new_image, path_to_vagrant_box_image
88
+ File.open(path_to_metadata, 'w') {|file| file.write METADATA_JSON}
89
+ File.open(path_to_vagrantfile, 'w') {|file| file.write VAGRANTFILE}
90
+ raise VagrantClone::Errors::TarNotInstalled unless system 'which tar'
91
+ Dir.chdir(dir){
92
+ system 'tar', 'cvzf', "#{path_to_vagrant_box}", '-S' ,'--totals', './metadata.json', './Vagrantfile', './box.img'
93
+ }
94
+ box_collection = Vagrant::BoxCollection.new(@vagrant_env.boxes_path)
95
+ box_collection.add path_to_vagrant_box, vagrant_box_name, vagrant_box_version
96
+
97
+ end
98
+ end
99
+
100
+ def create_image_or_box(machine)
101
+ add_default_vagrant_public_key(machine)
102
+ machine.action 'halt', {:destroy_on_error => false, :provision => false, :provider => :docker}
103
+ box_name = "#{machine.name}_#{VAGRANT_BOX_TAG}_#{Time.new.to_i}"
104
+ create_vagrant_box(machine, box_name, '0')
105
+ box_name
106
+ end
107
+ end
108
+ end
109
+
110
+
111
+ =begin
112
+ module VagrantClone
113
+ class CloneManager #< CloneManagerBase
114
+
115
+ VAGRANT_DEFAULT_PUBLIC_KEY = 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key'
116
+
117
+ # Use this variable like: METADATA_JSON % [SIZE]
118
+ METADATA_JSON = <<EOF
119
+ {
120
+ "provider": "libvirt",
121
+ "format": "qcow2",
122
+ "virtual_size": %s
123
+ }
124
+ EOF
125
+
126
+ VAGRANTFILE = <<EOF
127
+ Vagrant.configure("2") do |config|
128
+ config.vm.provider :libvirt do |libvirt|
129
+ libvirt.driver = "kvm"
130
+ libvirt.host = ""
131
+ libvirt.connect_via_ssh = false
132
+ libvirt.storage_pool_name = "default"
133
+ end
134
+ end
135
+ EOF
136
+
137
+ def wait_domain_state(domain, state, duration)
138
+ begin
139
+ Timeout::timeout(duration) {
140
+ sleep 1 until domain.state[0] == state
141
+ }
142
+ rescue Timeout::Error
143
+ raise VagrantClone::Errors::MachineStateNotAchieved
144
+ end
145
+ end
146
+
147
+ # Cloned image contain public key from original machine
148
+ # Vagrant can not start ssh session because virtual machine
149
+ # does not have default Vagrant public key
150
+ # SSH new machine with previous private key
151
+ # wait 10 seconds for ssh to available
152
+ # if SSH available - add default Vagrant public key to authorized keys
153
+ def add_default_vagrant_public_key(machine_uuid, host, port, user, private_key_path)
154
+ conn = Libvirt::open('qemu:///system')
155
+ domain = conn.lookup_domain_by_uuid machine_uuid
156
+ domain.create unless domain.state[0] == Libvirt::Domain::RUNNING
157
+ wait_domain_state domain, Libvirt::Domain::RUNNING, 10
158
+ timeout = 10
159
+ while timeout > 0
160
+ begin
161
+ Net::SSH.start(host, user, :port => port, :keys => [private_key_path]) do |ssh|
162
+ ssh.exec! "echo '#{VAGRANT_DEFAULT_PUBLIC_KEY}' >> $HOME/.ssh/authorized_keys"
163
+ end
164
+ break
165
+ rescue Exception => e
166
+ puts e.message
167
+ timeout -= 1
168
+ sleep 1
169
+ end
170
+ end
171
+ raise VagrantClone::Errors::SSHNotAccessible if timeout == 0
172
+ end
173
+
174
+ # Clone domain
175
+ # undefine cloned domain
176
+ # Returns path to cloned image
177
+ def create_clone(machine_uuid, vagrant_box_name, vagrant_box_version)
178
+ conn = Libvirt::open('qemu:///system')
179
+ domain = conn.lookup_domain_by_uuid machine_uuid
180
+ domain_xml_desc = Nokogiri::XML domain.xml_desc
181
+ domain_name = domain_xml_desc.xpath('//domain//name')[0].children[0].content
182
+ raise VagrantClone::Errors::VirtCloneCommandNotFound unless system('which virt-clone')
183
+ domain.suspend if domain.active?
184
+ wait_domain_state domain, Libvirt::Domain::PAUSED, 10
185
+ clone_name = "#{vagrant_box_name}_vagrant_box_image_#{vagrant_box_version}"
186
+ unless system('virt-clone', '-o', domain_name, '-n', clone_name, '--auto-clone', out: $stdout, err: $stderr)
187
+ raise VagrantClone::Errors::VirtCloneCommandFailed
188
+ end
189
+ domain.resume
190
+ wait_domain_state domain, Libvirt::Domain::RUNNING, 10
191
+ cloned_domain = conn.lookup_domain_by_name clone_name
192
+ cloned_domain_xml_desc = Nokogiri::XML cloned_domain.xml_desc
193
+ cloned_domain_xml_desc.xpath('//domain//devices//disk//source//@file')[0].content
194
+ end
195
+
196
+ # Create new Vagrant box directory
197
+ # create metadata.json in Vagrant box directory
198
+ # create Vagrantfile in Vagrant box directory
199
+ # copy libvirt image to Vagrant box directory
200
+ # remove original cloned image
201
+ # returns Vagrant box name
202
+ def create_vagrant_box(path_to_cloned_image, vagrant_box_name, vagrant_box_version, vagrant_boxes_dir)
203
+ new_vagrant_box_dir = Pathname.new(vagrant_boxes_dir).join(vagrant_box_name)
204
+ VagrantClone::Errors::VagrantBoxAlreadyExists if Dir.exists? new_vagrant_box_dir
205
+ new_vagrant_box_content_dir = new_vagrant_box_dir.join(vagrant_box_version).join('libvirt')
206
+ FileUtils.mkdir_p new_vagrant_box_content_dir
207
+ raise VagrantClone::Errors::QemuImgCommandNotFound unless system('which qemu-img')
208
+ qemu_img_info = `qemu-img info --output=json '#{path_to_cloned_image}'`
209
+ raise VagrantClone::Errors::QemuImgCommandFailed unless $?.success?
210
+ qemu_img_info_json = JSON.parse qemu_img_info
211
+ image_virtual_size = qemu_img_info_json['virtual-size'].to_i / (1024**3)
212
+ File.open(new_vagrant_box_content_dir.join('metadata.json'), 'w') do |file|
213
+ file.write METADATA_JSON % [image_virtual_size]
214
+ end
215
+ File.open(new_vagrant_box_content_dir.join('Vagrantfile'), 'w') do |file|
216
+ file.write VAGRANTFILE
217
+ end
218
+ new_vagrant_box_image_path = new_vagrant_box_content_dir.join('box.img')
219
+ FileUtils.ln_s File.expand_path(path_to_cloned_image), File.expand_path(new_vagrant_box_image_path)
220
+ vagrant_box_name
221
+ end
222
+
223
+ end
224
+ end
225
+
226
+ def func1
227
+ vc = VagrantClone::CloneManager.new
228
+ puts 'HERE 1111111111111111111111'
229
+ #vc.add_default_vagrant_public_key '5b30d071-8a8a-4855-b59d-c3ac82a7e7fb', '192.168.121.39', 22, 'vagrant', '/home/galiaf95/bachelors/product/vagrant-clone/LibvirtTest/.vagrant/machines/node0/libvirt/private_key'
230
+ puts 'HERE 2222222222222222222222'
231
+ path_to_cloned_image = vc.create_clone '5b30d071-8a8a-4855-b59d-c3ac82a7e7fb', 'test0', '0.0.1'
232
+ puts 'HERE 3333333333333333333333'
233
+ vc.create_vagrant_box path_to_cloned_image, 'test0', '0.0.1', '/home/galiaf95/.vagrant.d/boxes/'
234
+ end
235
+
236
+ def func2
237
+ vc = VagrantClone::CloneManager.new
238
+ puts 'HERE 1111111111111111111111'
239
+ #vc.add_default_vagrant_public_key '6e47ca84-9ed4-45e7-aeed-be15dc3b876d', '192.168.121.142', 22, 'vagrant', '/home/galiaf95/bachelors/product/vagrant-clone/LibvirtTest/.vagrant/machines/node1/libvirt/private_key'
240
+ puts 'HERE 2222222222222222222222'
241
+ path_to_cloned_image = vc.create_clone '6e47ca84-9ed4-45e7-aeed-be15dc3b876d', 'test1', '0.0.1'
242
+ puts 'HERE 3333333333333333333333'
243
+ vc.create_vagrant_box path_to_cloned_image, 'test1', '0.0.1', '/home/galiaf95/.vagrant.d/boxes/'
244
+ end
245
+
246
+ #puts "Started At #{Time.now}"
247
+ #func1
248
+ #func2
249
+ #t1 = Thread.new{func1}
250
+ #t2 = Thread.new{func2}
251
+ #t1.join
252
+ #t2.join
253
+ #puts "End at #{Time.now}"
254
+ =end
@@ -0,0 +1,154 @@
1
+ require 'parser/current'
2
+ require 'unparser'
3
+ require 'pathname'
4
+
5
+ module VagrantClone
6
+ class VagrantfileManager
7
+
8
+ VAGRANTFILE_NAME = 'Vagrantfile'
9
+
10
+ def initialize(clone_config, new_env_path, vagrant_env)
11
+ @clone_config = clone_config
12
+ @new_env_path = new_env_path
13
+ @vagrant_env = vagrant_env
14
+ end
15
+
16
+ def rewrite
17
+ buffer = Parser::Source::Buffer.new(VAGRANTFILE_NAME)
18
+ buffer.source = File.read(Pathname.new(@vagrant_env.cwd).join(VAGRANTFILE_NAME))
19
+ parser = Parser::CurrentRuby.new
20
+ ast = parser.parse(buffer)
21
+ rewriter = VagrantfileRewriter.new(@clone_config, @vagrant_env)
22
+ File.open(Pathname.new(@new_env_path).join(VAGRANTFILE_NAME), 'w') do |vagrantfile|
23
+ vagrantfile.write rewriter.rewrite(buffer, ast)
24
+ end
25
+ end
26
+
27
+ class VagrantfileRewriter < Parser::Rewriter
28
+ def initialize(clone_config, vagrant_env)
29
+ @vagrant_env = vagrant_env
30
+ @blocks = {}
31
+ @vms = {}
32
+ @clone_config = clone_config
33
+ @checked_nodes = []
34
+ end
35
+
36
+ def on_block(node)
37
+ super
38
+ get_vm_block(node)
39
+ end
40
+
41
+ def change_image(vm_name, node, image_path_or_id)
42
+ if node.class == Parser::AST::Node
43
+ node.children.each do |vm_block_child|
44
+ if vm_block_child.class == Parser::AST::Node and vm_block_child.type == :begin
45
+ vm_block_child.children.each do |first_send_child|
46
+ if first_send_child.class == Parser::AST::Node and first_send_child.type == :send
47
+ if first_send_child.children.size >= 2 and first_send_child.children[1] == :image=
48
+ if @vms[vm_name].nil? or !@vms[vm_name].include? first_send_child
49
+ @vagrant_env.ui.info "Replacing image for '#{vm_name}' with '#{image_path_or_id}'..."
50
+ replace(
51
+ first_send_child.children[2].loc.expression,
52
+ "\"#{image_path_or_id}\""
53
+ )
54
+ @vagrant_env.ui.info "Done replacing image for '#{vm_name}' with '#{image_path_or_id}'..."
55
+ if @vms[vm_name].nil?
56
+ @vms[vm_name] = [first_send_child]
57
+ else
58
+ @vms[vm_name] << first_send_child
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ change_image vm_name, vm_block_child, image_path_or_id
66
+ end
67
+ end
68
+ end
69
+
70
+ def get_vm_block(node)
71
+ if node.class == Parser::AST::Node
72
+ send_vm_found = false
73
+ send_define_found = false
74
+ node.children.each do |vm_block_child|
75
+ if vm_block_child.class == Parser::AST::Node and vm_block_child.type == :send
76
+ vm_block_child.children.each do |first_send_child|
77
+ if first_send_child.class == Parser::AST::Node
78
+ if first_send_child.type == :send
79
+ first_send_child.children.each do |second_send_child|
80
+ send_vm_found = true if second_send_child == :vm
81
+ end
82
+ end
83
+ if first_send_child.type == :str or first_send_child.type == :sym and
84
+ send_define_found and send_vm_found
85
+ str_provider = first_send_child.children[0]
86
+ send_vm_found = false
87
+ send_define_found = false
88
+ if not @blocks.keys.include? str_provider and @clone_config.has_key? str_provider.to_sym
89
+ if @clone_config[str_provider.to_sym][:amount] <= 0
90
+ @vagrant_env.ui.info "Amount of clones for '#{str_provider}' is 0, excluding from config..."
91
+ insert_before node.loc.expression, "if false\n"
92
+ else
93
+ @vagrant_env.ui.info "Updating config with clones for '#{str_provider}'..."
94
+ var_name = "i_#{Time.new.to_i}"
95
+ amount = @clone_config[str_provider.to_sym][:amount]
96
+ machine_name = Unparser.unparse node.children[0].children[2]
97
+ box_name = @clone_config[str_provider.to_sym][:box_or_image]
98
+ insert_before node.loc.expression, "(0...#{amount}).each do |#{var_name}|\n"
99
+ replace node.children[0].children[2].loc.expression, %Q["\#{#{machine_name}}_\#{#{var_name}}"]
100
+ change_image(str_provider, node, box_name)
101
+ end
102
+ insert_after node.loc.expression, "\nend"
103
+ @blocks[str_provider] = node
104
+ end
105
+ end
106
+ end
107
+ send_define_found = true if first_send_child == :define
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+ =begin
118
+ class Dummy
119
+ attr_accessor :ui
120
+
121
+ def initialize
122
+ @ui = Ui.new
123
+ end
124
+
125
+ def cwd
126
+ '/home/galiaf95/bachelors/product/vagrant-clone/DockerTest'
127
+ end
128
+
129
+ def vagrantfile_name
130
+ 'Vagrantfile'
131
+ end
132
+
133
+ class Ui
134
+ def info(msg)
135
+ puts msg
136
+ end
137
+ end
138
+ end
139
+
140
+ timestamp = Time.new.to_i
141
+ new_env_path = Pathname.new("/home/galiaf95/bachelors/product/vagrant-clone/DockerTest#{timestamp}")
142
+ clone_config = {
143
+ :node0 => {
144
+ :box_or_image => "sha256:23f4a4c37463f65a76afb2688c309e574bb991e66016eda1845b07dec67223c9",
145
+ :amount => 2
146
+ }
147
+ }
148
+ Dir.mkdir new_env_path
149
+ VagrantClone::VagrantfileManager.new(
150
+ clone_config,
151
+ new_env_path,
152
+ Dummy.new
153
+ ).rewrite
154
+ =end
@@ -0,0 +1,159 @@
1
+ require 'parser/current'
2
+ require 'unparser'
3
+ require 'pathname'
4
+
5
+ module VagrantClone
6
+ class VagrantfileManager
7
+
8
+ VAGRANTFILE_NAME = 'Vagrantfile'
9
+
10
+ def initialize(clone_config, new_env_path, vagrant_env)
11
+ @clone_config = clone_config
12
+ @new_env_path = new_env_path
13
+ @vagrant_env = vagrant_env
14
+ end
15
+
16
+ def rewrite
17
+ buffer = Parser::Source::Buffer.new(VAGRANTFILE_NAME)
18
+ buffer.source = File.read(Pathname.new(@vagrant_env.cwd).join(VAGRANTFILE_NAME))
19
+ parser = Parser::CurrentRuby.new
20
+ ast = parser.parse(buffer)
21
+ rewriter = VagrantfileRewriter.new(@clone_config, @vagrant_env)
22
+ File.open(Pathname.new(@new_env_path).join(VAGRANTFILE_NAME), 'w') do |vagrantfile|
23
+ vagrantfile.write rewriter.rewrite(buffer, ast)
24
+ end
25
+ end
26
+
27
+ class VagrantfileRewriter < Parser::Rewriter
28
+ def initialize(clone_config, vagrant_env)
29
+ @vagrant_env = vagrant_env
30
+ @blocks = {}
31
+ @vms = {}
32
+ @clone_config = clone_config
33
+ @checked_nodes = []
34
+ end
35
+
36
+ def on_block(node)
37
+ super
38
+ get_vm_block(node)
39
+ end
40
+
41
+ def change_image(vm_name, node, image_path_or_id)
42
+ if node.class == Parser::AST::Node
43
+ node.children.each do |vm_block_child|
44
+ if vm_block_child.class == Parser::AST::Node and vm_block_child.type == :send
45
+ if vm_block_child.children.size >= 2 and vm_block_child.children[1] == :box=
46
+ if @vms[vm_name].nil? or !@vms[vm_name].include? vm_block_child
47
+ @vagrant_env.ui.info "Replacing image for '#{vm_name}' with '#{image_path_or_id}'..."
48
+ replace(
49
+ vm_block_child.children[2].loc.expression,
50
+ "\"#{image_path_or_id}\""
51
+ )
52
+ @vagrant_env.ui.info "Done replacing image for '#{vm_name}' with '#{image_path_or_id}'..."
53
+ if @vms[vm_name].nil?
54
+ @vms[vm_name] = [vm_block_child]
55
+ else
56
+ @vms[vm_name] << vm_block_child
57
+ end
58
+ end
59
+ end
60
+ end
61
+ change_image vm_name, vm_block_child, image_path_or_id
62
+ end
63
+ end
64
+ end
65
+
66
+ def get_vm_block(node)
67
+ if node.class == Parser::AST::Node
68
+ send_vm_found = false
69
+ send_define_found = false
70
+ node.children.each do |vm_block_child|
71
+ if vm_block_child.class == Parser::AST::Node and vm_block_child.type == :send
72
+ vm_block_child.children.each do |first_send_child|
73
+ if first_send_child.class == Parser::AST::Node
74
+ if first_send_child.type == :send
75
+ first_send_child.children.each do |second_send_child|
76
+ send_vm_found = true if second_send_child == :vm
77
+ end
78
+ end
79
+ if first_send_child.type == :str or first_send_child.type == :sym and
80
+ send_define_found and send_vm_found
81
+ str_provider = first_send_child.children[0]
82
+ send_vm_found = false
83
+ send_define_found = false
84
+ if not @blocks.keys.include? str_provider and @clone_config.has_key? str_provider.to_sym
85
+ if @clone_config[str_provider.to_sym][:amount] <= 0
86
+ @vagrant_env.ui.info "Amount of clones for '#{str_provider}' is 0, excluding from config..."
87
+ insert_before node.loc.expression, "if false\n"
88
+ else
89
+ @vagrant_env.ui.info "Updating config with clones for '#{str_provider}'..."
90
+ var_name = "i_#{Time.new.to_i}"
91
+ amount = @clone_config[str_provider.to_sym][:amount]
92
+ machine_name = Unparser.unparse node.children[0].children[2]
93
+ box_name = @clone_config[str_provider.to_sym][:box_or_image]
94
+ insert_before node.loc.expression, "(0...#{amount}).each do |#{var_name}|\n"
95
+ replace node.children[0].children[2].loc.expression, %Q["\#{#{machine_name}}_\#{#{var_name}}"]
96
+ change_image(str_provider, node, box_name)
97
+ end
98
+ insert_after node.loc.expression, "\nend"
99
+ @blocks[str_provider] = node
100
+ end
101
+ end
102
+ end
103
+ send_define_found = true if first_send_child == :define
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ =begin
114
+ class Dummy
115
+ attr_accessor :ui
116
+
117
+ def initialize
118
+ @ui = Ui.new
119
+ end
120
+
121
+ def cwd
122
+ '/home/galiaf95/bachelors/product/vagrant-clone/LibvirtTest'
123
+ end
124
+
125
+ def vagrantfile_name
126
+ 'Vagrantfile'
127
+ end
128
+
129
+ class Ui
130
+ def info(msg)
131
+ puts msg
132
+ end
133
+ end
134
+ end
135
+
136
+
137
+ timestamp = Time.new.to_i
138
+ new_env_path = Pathname.new("/home/galiaf95/bachelors/product/vagrant-clone/LibvirtTest#{timestamp}")
139
+ clone_config = {
140
+ :node0 => {
141
+ :box_or_image => nil,
142
+ :amount => 0
143
+ },
144
+ :node1 => {
145
+ :box_or_image => "test",
146
+ :amount => 2
147
+ },
148
+ :node2 => {
149
+ :box_or_image => nil,
150
+ :amount => 0
151
+ }
152
+ }
153
+ Dir.mkdir new_env_path
154
+ VagrantClone::VagrantfileManager.new(
155
+ clone_config,
156
+ new_env_path,
157
+ Dummy.new
158
+ ).rewrite
159
+ =end
@@ -1,3 +1,3 @@
1
1
  module VagrantClone
2
- VERSION = "0.0.1"
3
- end
2
+ VERSION = '0.0.3'
3
+ end
data/lib/vagrant-clone.rb CHANGED
@@ -1,17 +1,17 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # vim: set fileencoding=utf-8
3
3
 
4
- require "vagrant"
4
+ require 'vagrant'
5
5
 
6
6
  module VagrantClone
7
- class Plugin < Vagrant.plugin("2")
7
+ class Plugin < Vagrant.plugin('2')
8
8
 
9
9
  name 'vagrant-clone'
10
10
 
11
11
  command 'clone' do
12
- require_relative 'vagrant-clone/command/clone'
13
- Command
12
+ require_relative 'vagrant-clone/errors'
13
+ require_relative 'vagrant-clone/command/clone.rb'
14
+ Clone
14
15
  end
15
-
16
16
  end
17
- end
17
+ end
data/libvirt.txt ADDED
@@ -0,0 +1,7 @@
1
+ test
2
+ 6 => 6.533333333333333
3
+ 6 => 6.8
4
+ 7 => 7.5
5
+ 6 => 1.7333333333333334
6
+ 7 => 2.0
7
+ 8 => 2.3