From 19adc3189d98d785a4e4487fbad7dd217190745f Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 17 Dec 2011 16:58:54 -0800 Subject: [PATCH] `vagrant package` --- lib/vagrant.rb | 1 + lib/vagrant/command.rb | 1 + lib/vagrant/command/package.rb | 72 +++++++++++++++++++++++++--------- 3 files changed, 56 insertions(+), 18 deletions(-) diff --git a/lib/vagrant.rb b/lib/vagrant.rb index a7a3f9443..5858a7a56 100644 --- a/lib/vagrant.rb +++ b/lib/vagrant.rb @@ -96,6 +96,7 @@ I18n.load_path << File.expand_path("templates/locales/en.yml", Vagrant.source_ro # Register the built-in commands Vagrant.commands.register(:destroy) { Vagrant::Command::Destroy } Vagrant.commands.register(:halt) { Vagrant::Command::Halt } +Vagrant.commands.register(:package) { Vagrant::Command::Package } Vagrant.commands.register(:provision) { Vagrant::Command::Provision } Vagrant.commands.register(:reload) { Vagrant::Command::Reload } Vagrant.commands.register(:resume) { Vagrant::Command::Resume } diff --git a/lib/vagrant/command.rb b/lib/vagrant/command.rb index 99b7ba828..48c3cfba0 100644 --- a/lib/vagrant/command.rb +++ b/lib/vagrant/command.rb @@ -4,6 +4,7 @@ module Vagrant autoload :Destroy, 'vagrant/command/destroy' autoload :Halt, 'vagrant/command/halt' + autoload :Package, 'vagrant/command/package' autoload :Provision, 'vagrant/command/provision' autoload :Reload, 'vagrant/command/reload' autoload :Resume, 'vagrant/command/resume' diff --git a/lib/vagrant/command/package.rb b/lib/vagrant/command/package.rb index 78bbb58ae..b07351d27 100644 --- a/lib/vagrant/command/package.rb +++ b/lib/vagrant/command/package.rb @@ -1,33 +1,69 @@ +require 'optparse' + module Vagrant module Command - class PackageCommand < NamedBase - class_option :base, :type => :string, :default => nil - class_option :output, :type => :string, :default => nil - class_option :include, :type => :array, :default => nil - class_option :vagrantfile, :type => :string, :default => nil - register "package", "Package a Vagrant environment for distribution" - + class Package < Base def execute - return package_base if options[:base] - package_target + options = {} + + opts = OptionParser.new do |opts| + opts.banner = "Usage: vagrant package [vm-name] [--base name] [--output name.box]" + opts.separator " [--include one,two,three] [--vagrantfile file]" + + opts.separator "" + + opts.on("--base NAME", "Name of a VM in virtualbox to package as a base box") do |b| + options[:base] = b + end + + opts.on("--output NAME", "Name of the file to output") do |o| + options[:output] = o + end + + opts.on("--include x,y,z", Array, "Additional files to package with the box.") do |i| + options[:include] = i + end + + opts.on("--vagrantfile file", "Vagrantfile to package with the box.") do |v| + options[:vagrantfile] = v + end + end + + # Parse the options + argv = parse_options(opts) + return if !argv + + @logger.debug("package options: #{options.inspect}") + if options[:base] + package_base(options) + else + package_target(argv[0], options) + end end protected - def package_base - vm = VM.find(options[:base], env) + def package_base(options) + vm = VM.find(options[:base], @env) raise Errors::BaseVMNotFound, :name => options[:base] if !vm.created? - package_vm(vm) + @logger.debug("Packaging base VM: #{vm.name}") + package_vm(vm, options) end - def package_target - raise Errors::MultiVMTargetRequired, :command => "package" if target_vms.length > 1 - vm = target_vms.first - raise Errors::VMNotCreatedError if !vm.created? - package_vm(vm) + def package_target(name, options) + if @env.multivm? && name.nil? + # In a multi-VM environment, a name is required. + raise Errors::MultiVMTargetRequired, :command => "package" + end + + with_target_vms(name) do |vm| + raise Errors::VMNotCreatedError if !vm.created? + @logger.debug("Packaging VM: #{vm.name}") + package_vm(vm, options) + end end - def package_vm(vm) + def package_vm(vm, options) opts = options.inject({}) do |acc, data| k,v = data acc["package.#{k}"] = v