diff options
Diffstat (limited to 'lib/leap_cli/commands/vagrant.rb')
-rw-r--r-- | lib/leap_cli/commands/vagrant.rb | 197 |
1 files changed, 0 insertions, 197 deletions
diff --git a/lib/leap_cli/commands/vagrant.rb b/lib/leap_cli/commands/vagrant.rb deleted file mode 100644 index 27c739b..0000000 --- a/lib/leap_cli/commands/vagrant.rb +++ /dev/null @@ -1,197 +0,0 @@ -autoload :IPAddr, 'ipaddr' -require 'fileutils' - -module LeapCli; module Commands - - desc "Manage local virtual machines." - long_desc "This command provides a convient way to manage Vagrant-based virtual machines. If FILTER argument is missing, the command runs on all local virtual machines. The Vagrantfile is automatically generated in 'test/Vagrantfile'. If you want to run vagrant commands manually, cd to 'test'." - command [:local, :l] do |local| - local.desc 'Starts up the virtual machine(s)' - local.arg_name 'FILTER', :optional => true #, :multiple => false - local.command :start do |start| - start.flag(:basebox, - :desc => "The basebox to use. This value is passed to vagrant as the "+ - "`config.vm.box` option. The value here should be the name of an installed box or a "+ - "shorthand name of a box in HashiCorp's Atlas.", - :arg_name => 'BASEBOX', - :default_value => 'LEAP/wheezy' - ) - start.action do |global_options,options,args| - vagrant_command(["up", "sandbox on"], args, options) - end - end - - local.desc 'Shuts down the virtual machine(s)' - local.arg_name 'FILTER', :optional => true #, :multiple => false - local.command :stop do |stop| - stop.action do |global_options,options,args| - if global_options[:yes] - vagrant_command("halt --force", args) - else - vagrant_command("halt", args) - end - end - end - - local.desc 'Destroys the virtual machine(s), reclaiming the disk space' - local.arg_name 'FILTER', :optional => true #, :multiple => false - local.command :destroy do |destroy| - destroy.action do |global_options,options,args| - if global_options[:yes] - vagrant_command("destroy --force", args) - else - vagrant_command("destroy", args) - end - end - end - - local.desc 'Print the status of local virtual machine(s)' - local.arg_name 'FILTER', :optional => true #, :multiple => false - local.command :status do |status| - status.action do |global_options,options,args| - vagrant_command("status", args) - end - end - - local.desc 'Saves the current state of the virtual machine as a new snapshot' - local.arg_name 'FILTER', :optional => true #, :multiple => false - local.command :save do |status| - status.action do |global_options,options,args| - vagrant_command("sandbox commit", args) - end - end - - local.desc 'Resets virtual machine(s) to the last saved snapshot' - local.arg_name 'FILTER', :optional => true #, :multiple => false - local.command :reset do |reset| - reset.action do |global_options,options,args| - vagrant_command("sandbox rollback", args) - end - end - end - - public - - # - # returns the path to a vagrant ssh key file. - # - # if the vagrant.key file is owned by root or ourselves, then - # we need to make sure that it owned by us and not world readable. - # - def vagrant_ssh_key_file - file_path = File.expand_path('../../../vendor/vagrant_ssh_keys/vagrant.key', File.dirname(__FILE__)) - Util.assert_files_exist! file_path - uid = File.new(file_path).stat.uid - if uid == 0 || uid == Process.euid - FileUtils.install file_path, '/tmp/vagrant.key', :mode => 0600 - file_path = '/tmp/vagrant.key' - end - return file_path - end - - protected - - def vagrant_command(cmds, args, options={}) - vagrant_setup(options) - cmds = cmds.to_a - if args.empty? - nodes = [""] - else - nodes = manager.filter(args)[:environment => "local"].field(:name) - end - if nodes.any? - vagrant_dir = File.dirname(Path.named_path(:vagrantfile)) - exec = ["cd #{vagrant_dir}"] - cmds.each do |cmd| - nodes.each do |node| - exec << "vagrant #{cmd} #{node}" - end - end - execute exec.join('; ') - else - bail! "No nodes found. This command only works on nodes with ip_address in the network #{LeapCli.leapfile.vagrant_network}" - end - end - - private - - def vagrant_setup(options) - assert_bin! 'vagrant', 'Vagrant is required for running local virtual machines. Run "sudo apt-get install vagrant".' - - if vagrant_version <= Gem::Version.new('1.0.0') - gem_path = assert_run!('vagrant gem which sahara') - if gem_path.nil? || gem_path.empty? || gem_path =~ /^ERROR/ - log :installing, "vagrant plugin 'sahara'" - assert_run! 'vagrant gem install sahara -v 0.0.13' - end - else - unless assert_run!('vagrant plugin list | grep sahara | cat').chars.any? - log :installing, "vagrant plugin 'sahara'" - assert_run! 'vagrant plugin install sahara' - end - end - create_vagrant_file(options) - end - - def vagrant_version - @vagrant_version ||= Gem::Version.new(assert_run!('vagrant --version').split(' ')[1]) - end - - def execute(cmd) - log 2, :run, cmd - exec cmd - end - - def create_vagrant_file(options) - lines = [] - netmask = IPAddr.new('255.255.255.255').mask(LeapCli.leapfile.vagrant_network.split('/').last).to_s - - basebox = options[:basebox] || 'LEAP/wheezy' - - if vagrant_version <= Gem::Version.new('1.1.0') - lines << %[Vagrant::Config.run do |config|] - manager.each_node do |node| - if node.vagrant? - lines << %[ config.vm.define :#{node.name} do |config|] - lines << %[ config.vm.box = "#{basebox}"] - lines << %[ config.vm.network :hostonly, "#{node.ip_address}", :netmask => "#{netmask}"] - lines << %[ config.vm.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]] - lines << %[ config.vm.customize ["modifyvm", :id, "--name", "#{node.name}"]] - lines << %[ #{leapfile.custom_vagrant_vm_line}] if leapfile.custom_vagrant_vm_line - lines << %[ end] - end - end - else - lines << %[Vagrant.configure("2") do |config|] - manager.each_node do |node| - if node.vagrant? - lines << %[ config.vm.define :#{node.name} do |config|] - lines << %[ config.vm.box = "#{basebox}"] - lines << %[ config.vm.network :private_network, ip: "#{node.ip_address}"] - lines << %[ config.vm.provider "virtualbox" do |v|] - lines << %[ v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]] - lines << %[ v.name = "#{node.name}"] - lines << %[ end] - lines << %[ #{leapfile.custom_vagrant_vm_line}] if leapfile.custom_vagrant_vm_line - lines << %[ end] - end - end - end - - lines << %[end] - lines << "" - write_file! :vagrantfile, lines.join("\n") - end - - def pick_next_vagrant_ip_address - taken_ips = manager.nodes[:environment => "local"].field(:ip_address) - if taken_ips.any? - highest_ip = taken_ips.map{|ip| IPAddr.new(ip)}.max - new_ip = highest_ip.succ - else - new_ip = IPAddr.new(LeapCli.leapfile.vagrant_network).succ.succ - end - return new_ip.to_s - end - -end; end |