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.
- checksums.yaml +4 -4
- data/.idea/.rakeTasks +7 -0
- data/.idea/inspectionProfiles/Project_Default.xml +6 -0
- data/.idea/misc.xml +4 -0
- data/.idea/modules.xml +8 -0
- data/.idea/runConfigurations/clone.xml +21 -0
- data/.idea/runConfigurations/libvirt.xml +21 -0
- data/.idea/vagrant-clone.iml +114 -0
- data/.idea/vcs.xml +6 -0
- data/.idea/workspace.xml +948 -0
- data/Gemfile +9 -3
- data/Gemfile.lock +123 -37
- data/Rakefile +2 -1
- data/Vagrantfile +9 -0
- data/cookbooks/apt/CHANGELOG.md +321 -0
- data/cookbooks/apt/CONTRIBUTING.md +2 -0
- data/cookbooks/apt/MAINTAINERS.md +15 -0
- data/cookbooks/apt/README.md +250 -0
- data/cookbooks/apt/attributes/default.rb +57 -0
- data/cookbooks/apt/files/15update-stamp +1 -0
- data/cookbooks/apt/files/apt-proxy-v2.conf +50 -0
- data/cookbooks/apt/libraries/helpers.rb +49 -0
- data/cookbooks/apt/libraries/matchers.rb +16 -0
- data/cookbooks/apt/metadata.json +1 -0
- data/cookbooks/apt/recipes/cacher-client.rb +52 -0
- data/cookbooks/apt/recipes/cacher-ng.rb +39 -0
- data/cookbooks/apt/recipes/default.rb +93 -0
- data/cookbooks/apt/recipes/unattended-upgrades.rb +47 -0
- data/cookbooks/apt/resources/preference.rb +90 -0
- data/cookbooks/apt/templates/01proxy.erb +11 -0
- data/cookbooks/apt/templates/10dpkg-options.erb +8 -0
- data/cookbooks/apt/templates/10recommends.erb +3 -0
- data/cookbooks/apt/templates/20auto-upgrades.erb +5 -0
- data/cookbooks/apt/templates/50unattended-upgrades.erb +75 -0
- data/cookbooks/apt/templates/acng.conf.erb +275 -0
- data/cookbooks/apt/templates/unattended-upgrades.seed.erb +1 -0
- data/cookbooks/build-essential/.foodcritic +1 -0
- data/cookbooks/build-essential/CHANGELOG.md +257 -0
- data/cookbooks/build-essential/CONTRIBUTING.md +2 -0
- data/cookbooks/build-essential/MAINTAINERS.md +15 -0
- data/cookbooks/build-essential/README.md +134 -0
- data/cookbooks/build-essential/attributes/default.rb +21 -0
- data/cookbooks/build-essential/libraries/matchers.rb +9 -0
- data/cookbooks/build-essential/metadata.json +1 -0
- data/cookbooks/build-essential/recipes/_windows.rb +53 -0
- data/cookbooks/build-essential/recipes/default.rb +24 -0
- data/cookbooks/build-essential/resources/build_essential.rb +106 -0
- data/cookbooks/build-essential/resources/xcode_command_line_tools.rb +61 -0
- data/cookbooks/compat_resource/CHANGELOG.md +53 -0
- data/cookbooks/compat_resource/CONTRIBUTING.md +2 -0
- data/cookbooks/compat_resource/MAINTAINERS.md +16 -0
- data/cookbooks/compat_resource/README.md +60 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/constants.rb +47 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/delayed_evaluator.rb +40 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/dsl/core.rb +73 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/dsl/declare_resource.rb +315 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/dsl/platform_introspection.rb +292 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/dsl/recipe.rb +37 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/dsl/universal.rb +70 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/mixin/lazy_module_include.rb +98 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/mixin/notifying_block.rb +74 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/mixin/params_validate.rb +510 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/mixin/powershell_out.rb +117 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/mixin/properties.rb +328 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/property.rb +713 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider/apt_repository.rb +269 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider/apt_update.rb +105 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider/noop.rb +56 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider/support/yum_repo.erb +132 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider/systemd_unit.rb +253 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider/yum_repository.rb +136 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/provider.rb +164 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource/action_class.rb +114 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource/apt_repository.rb +65 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource/apt_update.rb +52 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource/systemd_unit.rb +81 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource/yum_repository.rb +97 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource.rb +214 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef/chef/resource_builder.rb +174 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/copied_from_chef.rb +29 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/mixin/properties.rb +8 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/exceptions.rb +10 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/log.rb +30 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/mixin/params_validate.rb +17 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/node.rb +9 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/property.rb +15 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/provider.rb +65 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/recipe.rb +118 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/recipe_hook.rb +20 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/resource/lwrp_base.rb +60 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/resource.rb +156 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/resource_builder.rb +167 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/resource_collection/resource_list.rb +49 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/resource_collection/resource_set.rb +49 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/resource_collection.rb +103 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/run_context.rb +691 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef/runner.rb +153 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches/chef.rb +33 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/monkeypatches.rb +41 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/property.rb +6 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/recipe.rb +8 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/resource/lwrp_base.rb +44 -0
- data/cookbooks/compat_resource/files/lib/chef_compat/resource.rb +56 -0
- data/cookbooks/compat_resource/files/lib/chef_upstream_version.rb +3 -0
- data/cookbooks/compat_resource/files/lib/compat_resource.rb +35 -0
- data/cookbooks/compat_resource/libraries/autoload.rb +31 -0
- data/cookbooks/compat_resource/metadata.json +1 -0
- data/cookbooks/inifile_chef_gem/CHANGELOG.md +11 -0
- data/cookbooks/inifile_chef_gem/README.md +46 -0
- data/cookbooks/inifile_chef_gem/metadata.json +51 -0
- data/cookbooks/inifile_chef_gem/metadata.rb +11 -0
- data/cookbooks/inifile_chef_gem/resources/default.rb +28 -0
- data/cookbooks/mariadb/CHANGELOG.md +332 -0
- data/cookbooks/mariadb/README.md +225 -0
- data/cookbooks/mariadb/attributes/default.rb +199 -0
- data/cookbooks/mariadb/libraries/mariadb_conn_helper.rb +53 -0
- data/cookbooks/mariadb/libraries/mariadb_helper.rb +216 -0
- data/cookbooks/mariadb/libraries/matchers.rb +21 -0
- data/cookbooks/mariadb/metadata.json +1 -0
- data/cookbooks/mariadb/providers/configuration.rb +39 -0
- data/cookbooks/mariadb/recipes/_audit_plugin.rb +63 -0
- data/cookbooks/mariadb/recipes/_debian_galera.rb +62 -0
- data/cookbooks/mariadb/recipes/_debian_server.rb +78 -0
- data/cookbooks/mariadb/recipes/_mariadb_repository.rb +29 -0
- data/cookbooks/mariadb/recipes/_redhat_client.rb +27 -0
- data/cookbooks/mariadb/recipes/_redhat_galera.rb +55 -0
- data/cookbooks/mariadb/recipes/_redhat_server.rb +58 -0
- data/cookbooks/mariadb/recipes/client.rb +47 -0
- data/cookbooks/mariadb/recipes/config.rb +115 -0
- data/cookbooks/mariadb/recipes/default.rb +46 -0
- data/cookbooks/mariadb/recipes/devel.rb +41 -0
- data/cookbooks/mariadb/recipes/galera.rb +324 -0
- data/cookbooks/mariadb/recipes/plugins.rb +3 -0
- data/cookbooks/mariadb/recipes/repository.rb +45 -0
- data/cookbooks/mariadb/recipes/server.rb +157 -0
- data/cookbooks/mariadb/resources/configuration.rb +13 -0
- data/cookbooks/mariadb/resources/mysql2_gem.rb +25 -0
- data/cookbooks/mariadb/resources/replication.rb +192 -0
- data/cookbooks/mariadb/templates/default/conf.d.generic.erb +19 -0
- data/cookbooks/mariadb/templates/default/debian.cnf.erb +12 -0
- data/cookbooks/mariadb/templates/default/mariadb-server.seed.erb +13 -0
- data/cookbooks/mariadb/templates/default/mariadb_grants.erb +42 -0
- data/cookbooks/mariadb/templates/default/my.cnf.erb +210 -0
- data/cookbooks/mariadb/templates/default/root.cnf.erb +5 -0
- data/cookbooks/mingw/.foodcritic +1 -0
- data/cookbooks/mingw/CHANGELOG.md +50 -0
- data/cookbooks/mingw/CONTRIBUTING.md +2 -0
- data/cookbooks/mingw/MAINTAINERS.md +14 -0
- data/cookbooks/mingw/README.md +133 -0
- data/cookbooks/mingw/files/default/bash.bat +17 -0
- data/cookbooks/mingw/files/default/custom-upgrade.sh +23 -0
- data/cookbooks/mingw/files/default/custom_prefix.sh +13 -0
- data/cookbooks/mingw/files/default/pthread.h +719 -0
- data/cookbooks/mingw/files/default/time.h +297 -0
- data/cookbooks/mingw/libraries/_helper.rb +38 -0
- data/cookbooks/mingw/metadata.json +1 -0
- data/cookbooks/mingw/recipes/default.rb +19 -0
- data/cookbooks/mingw/resources/get.rb +56 -0
- data/cookbooks/mingw/resources/msys2_package.rb +139 -0
- data/cookbooks/mingw/resources/tdm_gcc.rb +114 -0
- data/cookbooks/ohai/.foodcritic +2 -0
- data/cookbooks/ohai/CHANGELOG.md +166 -0
- data/cookbooks/ohai/CONTRIBUTING.md +2 -0
- data/cookbooks/ohai/MAINTAINERS.md +15 -0
- data/cookbooks/ohai/README.md +134 -0
- data/cookbooks/ohai/libraries/matchers.rb +41 -0
- data/cookbooks/ohai/metadata.json +1 -0
- data/cookbooks/ohai/recipes/default.rb +20 -0
- data/cookbooks/ohai/resources/hint.rb +55 -0
- data/cookbooks/ohai/resources/plugin.rb +117 -0
- data/cookbooks/selinux_policy/.gitignore +51 -0
- data/cookbooks/selinux_policy/.kitchen.yml +25 -0
- data/cookbooks/selinux_policy/.rubocop.yml +2 -0
- data/cookbooks/selinux_policy/.travis.yml +26 -0
- data/cookbooks/selinux_policy/Berksfile +8 -0
- data/cookbooks/selinux_policy/CHANGELOG.md +155 -0
- data/cookbooks/selinux_policy/LICENSE +13 -0
- data/cookbooks/selinux_policy/README.md +217 -0
- data/cookbooks/selinux_policy/Rakefile +68 -0
- data/cookbooks/selinux_policy/TESTING.md +2 -0
- data/cookbooks/selinux_policy/Thorfile +12 -0
- data/cookbooks/selinux_policy/attributes/default.rb +5 -0
- data/cookbooks/selinux_policy/chefignore +102 -0
- data/cookbooks/selinux_policy/libraries/helper-disabled.rb +29 -0
- data/cookbooks/selinux_policy/libraries/matchers.rb +57 -0
- data/cookbooks/selinux_policy/metadata.json +58 -0
- data/cookbooks/selinux_policy/metadata.rb +20 -0
- data/cookbooks/selinux_policy/providers/boolean.rb +28 -0
- data/cookbooks/selinux_policy/providers/fcontext.rb +78 -0
- data/cookbooks/selinux_policy/providers/module.rb +81 -0
- data/cookbooks/selinux_policy/providers/permissive.rb +26 -0
- data/cookbooks/selinux_policy/providers/port.rb +58 -0
- data/cookbooks/selinux_policy/recipes/default.rb +9 -0
- data/cookbooks/selinux_policy/recipes/install.rb +32 -0
- data/cookbooks/selinux_policy/resources/boolean.rb +8 -0
- data/cookbooks/selinux_policy/resources/fcontext.rb +8 -0
- data/cookbooks/selinux_policy/resources/module.rb +21 -0
- data/cookbooks/selinux_policy/resources/permissive.rb +6 -0
- data/cookbooks/selinux_policy/resources/port.rb +9 -0
- data/cookbooks/seven_zip/CHANGELOG.md +30 -0
- data/cookbooks/seven_zip/README.md +108 -0
- data/cookbooks/seven_zip/attributes/default.rb +31 -0
- data/cookbooks/seven_zip/libraries/matchers.rb +33 -0
- data/cookbooks/seven_zip/metadata.json +1 -0
- data/cookbooks/seven_zip/providers/archive.rb +68 -0
- data/cookbooks/seven_zip/recipes/default.rb +41 -0
- data/cookbooks/seven_zip/resources/archive.rb +29 -0
- data/cookbooks/windows/.foodcritic +2 -0
- data/cookbooks/windows/CHANGELOG.md +528 -0
- data/cookbooks/windows/CONTRIBUTING.md +2 -0
- data/cookbooks/windows/MAINTAINERS.md +21 -0
- data/cookbooks/windows/README.md +803 -0
- data/cookbooks/windows/attributes/default.rb +21 -0
- data/cookbooks/windows/files/dism_features.rb +45 -0
- data/cookbooks/windows/libraries/matchers.rb +586 -0
- data/cookbooks/windows/libraries/powershell_helper.rb +53 -0
- data/cookbooks/windows/libraries/registry_helper.rb +356 -0
- data/cookbooks/windows/libraries/version.rb +207 -0
- data/cookbooks/windows/libraries/version_helper.rb +79 -0
- data/cookbooks/windows/libraries/windows_helper.rb +174 -0
- data/cookbooks/windows/libraries/windows_privileged.rb +103 -0
- data/cookbooks/windows/libraries/wmi_helper.rb +32 -0
- data/cookbooks/windows/metadata.json +1 -0
- data/cookbooks/windows/recipes/default.rb +21 -0
- data/cookbooks/windows/resources/auto_run.rb +46 -0
- data/cookbooks/windows/resources/certificate.rb +166 -0
- data/cookbooks/windows/resources/certificate_binding.rb +128 -0
- data/cookbooks/windows/resources/feature.rb +82 -0
- data/cookbooks/windows/resources/feature_dism.rb +108 -0
- data/cookbooks/windows/resources/feature_powershell.rb +70 -0
- data/cookbooks/windows/resources/feature_servermanagercmd.rb +76 -0
- data/cookbooks/windows/resources/font.rb +80 -0
- data/cookbooks/windows/resources/http_acl.rb +110 -0
- data/cookbooks/windows/resources/pagefile.rb +152 -0
- data/cookbooks/windows/resources/path.rb +54 -0
- data/cookbooks/windows/resources/printer.rb +103 -0
- data/cookbooks/windows/resources/printer_port.rb +101 -0
- data/cookbooks/windows/resources/share.rb +291 -0
- data/cookbooks/windows/resources/shortcut.rb +53 -0
- data/cookbooks/windows/resources/task.rb +384 -0
- data/cookbooks/windows/resources/zipfile.rb +125 -0
- data/cookbooks/yum/.foodcritic +1 -0
- data/cookbooks/yum/CHANGELOG.md +351 -0
- data/cookbooks/yum/CONTRIBUTING.md +2 -0
- data/cookbooks/yum/MAINTAINERS.md +16 -0
- data/cookbooks/yum/README.md +125 -0
- data/cookbooks/yum/attributes/main.rb +103 -0
- data/cookbooks/yum/libraries/matchers.rb +9 -0
- data/cookbooks/yum/metadata.json +1 -0
- data/cookbooks/yum/recipes/default.rb +26 -0
- data/cookbooks/yum/recipes/dnf_yum_compat.rb +29 -0
- data/cookbooks/yum/resources/globalconfig.rb +119 -0
- data/cookbooks/yum/templates/.DS_Store +0 -0
- data/cookbooks/yum/templates/main.erb +276 -0
- data/cookbooks/yum-epel/CHANGELOG.md +138 -0
- data/cookbooks/yum-epel/CONTRIBUTING.md +2 -0
- data/cookbooks/yum-epel/MAINTAINERS.md +19 -0
- data/cookbooks/yum-epel/README.md +172 -0
- data/cookbooks/yum-epel/attributes/default.rb +8 -0
- data/cookbooks/yum-epel/attributes/epel-debuginfo.rb +15 -0
- data/cookbooks/yum-epel/attributes/epel-source.rb +15 -0
- data/cookbooks/yum-epel/attributes/epel-testing-debuginfo.rb +15 -0
- data/cookbooks/yum-epel/attributes/epel-testing-source.rb +15 -0
- data/cookbooks/yum-epel/attributes/epel-testing.rb +15 -0
- data/cookbooks/yum-epel/attributes/epel.rb +21 -0
- data/cookbooks/yum-epel/metadata.json +1 -0
- data/cookbooks/yum-epel/recipes/default.rb +27 -0
- data/cookbooks/yum-scl/.kitchen.dokken.yml +24 -0
- data/cookbooks/yum-scl/.kitchen.yml +24 -0
- data/cookbooks/yum-scl/.rubocop.yml +6 -0
- data/cookbooks/yum-scl/.travis.yml +28 -0
- data/cookbooks/yum-scl/Berksfile +3 -0
- data/cookbooks/yum-scl/Berksfile.lock +25 -0
- data/cookbooks/yum-scl/CHANGELOG.md +11 -0
- data/cookbooks/yum-scl/Gemfile +46 -0
- data/cookbooks/yum-scl/README.md +76 -0
- data/cookbooks/yum-scl/attributes/centos.rb +83 -0
- data/cookbooks/yum-scl/attributes/default.rb +15 -0
- data/cookbooks/yum-scl/attributes/scientific.rb +1 -0
- data/cookbooks/yum-scl/files/default/RPM-GPG-KEY-CentOS-SIG-SCLo +20 -0
- data/cookbooks/yum-scl/libraries/yum_scl_helper.rb +33 -0
- data/cookbooks/yum-scl/metadata.json +42 -0
- data/cookbooks/yum-scl/metadata.rb +12 -0
- data/cookbooks/yum-scl/recipes/chef_install.rb +52 -0
- data/cookbooks/yum-scl/recipes/default.rb +17 -0
- data/cookbooks/yum-scl/recipes/native_install.rb +35 -0
- data/lib/vagrant-clone/command/clone.rb +66 -61
- data/lib/vagrant-clone/errors.rb +61 -0
- data/lib/vagrant-clone/util/clone_manager_base.rb +69 -0
- data/lib/vagrant-clone/util/clone_managers/docker.rb +31 -0
- data/lib/vagrant-clone/util/clone_managers/libvirt.rb +254 -0
- data/lib/vagrant-clone/util/vagrantfile_managers/docker.rb +154 -0
- data/lib/vagrant-clone/util/vagrantfile_managers/libvirt.rb +159 -0
- data/lib/vagrant-clone/version.rb +2 -2
- data/lib/vagrant-clone.rb +6 -6
- data/libvirt.txt +7 -0
- data/performance_testing.rb +165 -0
- data/results.txt +45 -0
- data/scripts/create_box.sh +134 -0
- data/test.rb +92 -0
- data/tools/create_box.sh +130 -0
- data/vagrant-clone.gemspec +7 -7
- metadata +296 -5
- data/lib/vagrant-clone/command/errors.rb +0 -16
- data/lib/vagrant-clone/command/provider/docker.rb +0 -13
- 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 =
|
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
|
4
|
+
require 'vagrant'
|
5
5
|
|
6
6
|
module VagrantClone
|
7
|
-
class Plugin < Vagrant.plugin(
|
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/
|
13
|
-
|
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
|