Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Jun 2016 12:36:24 GMT
From:      litong@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r305039 - in soc2016/litong/vagrant-bhyve/trunk: example_box lib lib/vagrant-bhyve
Message-ID:  <201606101236.u5ACaOiS042393@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: litong
Date: Fri Jun 10 12:36:23 2016
New Revision: 305039
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305039

Log:
  add executor and update box format

Added:
  soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve/executor.rb
Modified:
  soc2016/litong/vagrant-bhyve/trunk/example_box/README.md
  soc2016/litong/vagrant-bhyve/trunk/example_box/metadata.json
  soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve.rb
  soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve/driver.rb
  soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve/errors.rb

Modified: soc2016/litong/vagrant-bhyve/trunk/example_box/README.md
==============================================================================
--- soc2016/litong/vagrant-bhyve/trunk/example_box/README.md	Fri Jun 10 12:36:12 2016	(r305038)
+++ soc2016/litong/vagrant-bhyve/trunk/example_box/README.md	Fri Jun 10 12:36:23 2016	(r305039)
@@ -17,8 +17,9 @@
 
 Bhyve box should define at least two data fields in `metadata.json` file.
 
-* provider - Provider name is bhyve
-* loader - Loader should be grub2-bhyve or bhyveload
+* provider - Provider name is bhyve.
+* firmaware - Firmware should be bios or uefi.
+* loader - Loader should be grub-bhyve or bhyveload when firmware is bios. This key should keep blank when firmware is uefi.
 
 ## Converting Boxes
 

Modified: soc2016/litong/vagrant-bhyve/trunk/example_box/metadata.json
==============================================================================
--- soc2016/litong/vagrant-bhyve/trunk/example_box/metadata.json	Fri Jun 10 12:36:12 2016	(r305038)
+++ soc2016/litong/vagrant-bhyve/trunk/example_box/metadata.json	Fri Jun 10 12:36:23 2016	(r305039)
@@ -1,4 +1,5 @@
 {
     "provider"     : "libvirt",
+    "firmware"	   : "bios",
     "loader"       : "bhyveload"
 }

Modified: soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve.rb
==============================================================================
--- soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve.rb	Fri Jun 10 12:36:12 2016	(r305038)
+++ soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve.rb	Fri Jun 10 12:36:23 2016	(r305039)
@@ -5,6 +5,7 @@
   module ProviderBhyve
     lib_path = Pathname.new(File.expand_path("../vagrant-bhyve", __FILE__))
     autoload :Action, lib_path.join('action')
+    autoload :Executor, lib_path.join('executor')
     autoload :Driver, lib_path.join('driver')
     autoload :Errors, lib_path.join('errors')
 

Modified: soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve/driver.rb
==============================================================================
--- soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve/driver.rb	Fri Jun 10 12:36:12 2016	(r305038)
+++ soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve/driver.rb	Fri Jun 10 12:36:23 2016	(r305039)
@@ -4,28 +4,31 @@
 module VagrantPlugins
   module ProviderBhyve
     class Driver
+
+      # This executor is responsible for actually executing commands, including 
+      # bhyve, dnsmasq and other shell utils used to get VM's state
+      attr_accessor :executor
       
       @@sudo = ''
 
       def initialize(machine)
 	@logger = Log4r::Logger.new("vagrant::bhyve::driver")
 	@machine = machine
+	@executor = Executor::Exec.new
       end
 
       # if vagrant is excecuted by root (or with sudo) then the variable
       # will be empty string, otherwise it will be 'sudo' to make sure we
       # can run bhyve, bhyveload and pf with sudo privilege
       def sudo
-	if Process.uid == 0
-	  @@sudo = ''
-	else
-	  @@sudo = 'sudo'
-	end
+	@@sudo = '' if Process.uid == 0
+	@@sudo = 'sudo'
       end
 
-      def execute(command)
-	process = Subprocess.new(command)
-	process.execute
+      def state(&block)
+	IO.popen("test -e #{name}").tap { |f| f.read }.close
+	return :running if $?.success?
+	return :not_running
       end
 
     end

Modified: soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve/errors.rb
==============================================================================
--- soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve/errors.rb	Fri Jun 10 12:36:12 2016	(r305038)
+++ soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve/errors.rb	Fri Jun 10 12:36:23 2016	(r305039)
@@ -7,10 +7,14 @@
 	error_namespace('vagrant_bhyve.errors')
       end
 
-      class NotRootUser << VagrantError
+      class HasNoRootPrivilege << VagrantBhyveError
 	error_key(:has_no_root_privilege)
       end
 
+      class ExecuteError << VagrantBhyveError
+	error_key(:execute_error)
+      end
+
     end
   end
 end

Added: soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve/executor.rb
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2016/litong/vagrant-bhyve/trunk/lib/vagrant-bhyve/executor.rb	Fri Jun 10 12:36:23 2016	(r305039)
@@ -0,0 +1,39 @@
+require "vagrant/util/busy"
+require "vagrant/util/subprocess"
+
+module VagrantPlugins
+  module ProviderBhyve
+    module Executor
+      # This class is used to execute commands as subprocess.
+      class Exec
+	# When test is true, this method will return the executed command's
+	# exit code. Otherwise it will return the result's stdout
+	def execute(test, *cmd, **opts, &block)
+	  # Append in the options for subprocess
+	  cmd << { notify: [:stdout, :stderr] }
+
+	  interrupted = false
+	  # Lambda to change interrupted to true
+	  int_callback = ->{ interrupted = true }
+	  result = ::Vagrant::Util::Busy.busy(int_callback) do
+	    ::Vagrant::Util::Subprocess.execute(*cmd, &block)
+	  end
+
+	  return result.exit_code if test
+
+	  result.stderr.gsub!("\r\n", "\n")
+	  result.stdout.gsub!("\r\n", "\n")
+
+	  if result.exit_code != 0 && interrupted
+	    raise Errors::ExecuteError,
+	      command: cmd.inspect,
+	      stderr: result.stderr,
+	      stdout: result.stdout
+	  end
+
+	  result.stdout
+	end
+      end
+    end
+  end
+end



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201606101236.u5ACaOiS042393>