]> gitweb.fluxo.info Git - leap/leap_cli.git/commitdiff
better vagrant commands, now all grouped under 'leap local'
authorelijah <elijah@riseup.net>
Tue, 27 Nov 2012 09:40:52 +0000 (01:40 -0800)
committerelijah <elijah@riseup.net>
Tue, 27 Nov 2012 09:40:52 +0000 (01:40 -0800)
lib/leap_cli/commands/vagrant.rb

index 41dccc9afdd57ef5f1aefaf1805d9982968b54a2..7765de0c26d58558ea5beb5aaeee6b8fe21cfd15 100644 (file)
@@ -3,27 +3,52 @@ require 'fileutils'
 
 module LeapCli; module Commands
 
-  desc 'Bring up one or more local virtual machines'
-  arg_name '[node-filter]', :optional => true, :multiple => false
-  command :'local-up' do |c|
-    c.action do |global_options,options,args|
-      vagrant_command("up", args)
+  desc "Manage local virtual machines"
+  long_desc "This command provides a convient way to manage Vagrant-based virtual machines. The Vagrantfile is automatically generated in test/Vagrantfile."
+  command :local do |c|
+    c.desc 'Starts up the virtual machine'
+    c.arg_name 'node-name', :optional => false #, :multiple => false
+    c.command :start do |c|
+      c.action do |global_options,options,args|
+        vagrant_setup
+        vagrant_command(["up", "sandbox on"], args)
+      end
     end
-  end
 
-  desc 'Halt one or more local virtual machines'
-  arg_name '[node-filter]', :optional => true, :multiple => false
-  command :'local-down' do |c|
-    c.action do |global_options,options,args|
-      vagrant_command("halt", args)
+    c.desc 'Shuts down the virtual machine'
+    c.arg_name 'node-name', :optional => false #, :multiple => false
+    c.command :stop do |c|
+      c.action do |global_options,options,args|
+        vagrant_setup
+        vagrant_command("halt", args)
+      end
     end
-  end
 
-  desc 'Destroy one or more local virtual machines'
-  arg_name '[node-filter]', :optional => true, :multiple => false
-  command :'local-reset' do |c|
-    c.action do |global_options,options,args|
-      vagrant_command("destroy", args)
+    c.desc 'Resets virtual machine to a pristine state'
+    c.arg_name 'node-name', :optional => false #, :multiple => false
+    c.command :reset do |c|
+      c.action do |global_options,options,args|
+        vagrant_setup
+        vagrant_command("sandbox rollback")
+      end
+    end
+
+    c.desc 'Destroys the virtual machine, reclaiming the disk space'
+    c.arg_name 'node-name', :optional => false #, :multiple => false
+    c.command :destroy do |c|
+      c.action do |global_options,options,args|
+        vagrant_setup
+        vagrant_command("destroy", args)
+      end
+    end
+
+    c.desc 'Print the status of local virtual machine'
+    c.arg_name 'node-name', :optional => false #, :multiple => false
+    c.command :status do |c|
+      c.action do |global_options,options,args|
+        vagrant_setup
+        vagrant_command("status", args)
+      end
     end
   end
 
@@ -43,12 +68,26 @@ module LeapCli; module Commands
 
   private
 
-  def vagrant_command(cmd, args)
-    assert_config! 'provider.vagrant.network'
+  def vagrant_setup
+    assert_bin! 'vagrant', 'run "sudo gem install vagrant"'
+    unless `vagrant gem which sahara`.chars.any?
+      log :installing, "vagrant plugin 'sahara'"
+      assert_run! 'vagrant gem install sahara'
+    end
     create_vagrant_file
+  end
+
+  def vagrant_command(cmds, args)
+    cmds = cmds.to_a
+    assert_config! 'provider.vagrant.network'
     nodes = manager.filter(args)[:local => true].field(:name)
     if nodes.any?
-      execute "cd #{File.dirname(Path.named_path(:vagrantfile))}; vagrant #{cmd} #{nodes.join(' ')}"
+      vagrant_dir = File.dirname(Path.named_path(:vagrantfile))
+      exec = ["cd #{vagrant_dir}"]
+      cmds.each do |cmd|
+        exec << "vagrant #{cmd} #{nodes.join(' ')}"
+      end
+      execute exec.join('; ')
     else
       bail! "No nodes found. This command only works on nodes with ip_address in the network #{manager.provider.vagrant.network}"
     end