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>