vagrant-provider 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c236101358d3c6019739c1041b9a936d6129bcba
4
+ data.tar.gz: 873a57fa6b59074710d21ff01678513f8ea28d6f
5
+ SHA512:
6
+ metadata.gz: 678facfc07e3a5fd8c67f9c69b077c086fbd8e55e2507a552f31bc4f72bb165d1bace3ae9f4e2655ba1ff9d4829a9fcde5cb39502f4467a932c187327e0ea961
7
+ data.tar.gz: 497788de461af7f48b56cc7c5c96046514ac25882e3bef700102ba1b60f9e5a38c04f3d432c4c267d9bb913c0c8a0880cdcfedf86076c488438a914a1d841b3b
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ /.vagrant/
data/Gemfile ADDED
@@ -0,0 +1,54 @@
1
+ source 'https://rubygems.org'
2
+ source "http://gems.hashicorp.com"
3
+
4
+ # see https://github.com/scalefactory/vagrant-cucumber/blob/master/Gemfile
5
+
6
+ require 'fileutils'
7
+
8
+ embedded_locations = %w{/Applications/Vagrant/embedded /opt/vagrant/embedded}
9
+
10
+ embedded_locations.each do |p|
11
+ ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"] = p if File.directory?(p)
12
+ end
13
+
14
+ unless ENV.has_key?('VAGRANT_INSTALLER_EMBEDDED_DIR')
15
+ $stderr.puts "Couldn't find a packaged install of vagrant, and we need this"
16
+ $stderr.puts "in order to make use of the RubyEncoder libraries."
17
+ $stderr.puts "I looked in:"
18
+ embedded_locations.each do |p|
19
+ $stderr.puts " #{p}"
20
+ end
21
+ end
22
+
23
+ group :development do
24
+ gem "vagrant", :git => "https://github.com/mitchellh/vagrant.git"
25
+
26
+ # Jump through annoying hoops so we can use this plugin in the
27
+ # bundler environment.
28
+
29
+ fusion_path = Gem::Specification.find_by_name('vagrant-vmware-fusion').gem_dir
30
+
31
+ unless File.symlink?( File.join( fusion_path, 'rgloader' ) )
32
+ $stderr.puts "Linking local 'rgloader' file to embedded installer"
33
+ FileUtils.ln_s(
34
+ File.join( ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"], 'rgloader' ),
35
+ File.join( fusion_path, 'rgloader' )
36
+ )
37
+ end
38
+
39
+ unless File.symlink?( File.join( fusion_path, 'license-vagrant-vmware-fusion.lic' ) )
40
+ $stderr.puts "Linking your license file for vmware plugin"
41
+ FileUtils.ln_s(
42
+ File.join( ENV["HOME"], '.vagrant.d', 'license-vagrant-vmware-fusion.lic' ),
43
+ File.join( fusion_path, 'license-vagrant-vmware-fusion.lic' )
44
+ )
45
+ end
46
+ end
47
+
48
+ group :plugins do
49
+ gem "vagrant-vmware-fusion"
50
+ gem "vagrant-provider", path: "."
51
+ end
52
+
53
+ # Specify your gem's dependencies in vagrant-provider.gemspec
54
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Glen Mailer
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # Vagrant Provider Swapper
2
+
3
+ Some rather hacky tricks to swap between different providers for a single
4
+ vagrant machine without destroying anything.
5
+
6
+ Useful for building a VM locally, then pushing up to a cloud provider,
7
+ for example.
8
+
9
+ ## Installation
10
+
11
+ vagrant plugin install provider
12
+
13
+ ## Usage
14
+
15
+ ```
16
+ # list machines and providers
17
+ $ vagrant provider list
18
+
19
+ Machines
20
+ --------
21
+
22
+ default:
23
+ virtualbox (current)
24
+ vmware_fusion
25
+ digital_ocean
26
+
27
+ # stash the current provider state for later
28
+ $ vagrant provider stash [machine-name]
29
+
30
+ # bring back the named provider state
31
+ $ vagrant provider pick <provider> [machine-name]
32
+
33
+ ```
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/Vagrantfile ADDED
@@ -0,0 +1,5 @@
1
+ Vagrant.configure('2') do |config|
2
+
3
+ config.vm.box = "hashicorp/precise64"
4
+
5
+ end
@@ -0,0 +1,66 @@
1
+ module VagrantPlugins::Provider
2
+ class BaseCommand < Vagrant.plugin('2', :command)
3
+
4
+ def machine_names
5
+ @env.machine_names
6
+ end
7
+
8
+ def providers_for(name)
9
+ return [] unless machine_folder.directory?
10
+
11
+ name = name.to_s
12
+
13
+ machine_folder.children(true)
14
+ .select(&:directory?)
15
+ .map { |f| f.basename.to_s }
16
+ .select { |f| f.start_with?(name) }
17
+ .map do |f|
18
+ {
19
+ name: provider_name(machine_folder.join(f)),
20
+ active: f == name
21
+ }
22
+ end
23
+ .select { |f| f[:name] }
24
+ end
25
+
26
+ def provider_name(folder)
27
+ folder.children(true)
28
+ .select(&:directory?)
29
+ .select { |f| f.join("id").file? }
30
+ .map { |f| f.basename.to_s.to_sym }
31
+ .first
32
+ end
33
+
34
+ def active_provider(machine_name)
35
+ providers_for(machine_name).detect { |p| p[:active] }
36
+ end
37
+
38
+ def machine_provider(machine_name, provider)
39
+ providers_for(machine_name).detect { |p| p[:name] == provider }
40
+ end
41
+
42
+ def machine_folder
43
+ @env.local_data_path.join("machines")
44
+ end
45
+
46
+ def line(msg = "")
47
+ @env.ui.info msg
48
+ end
49
+
50
+ class NoActiveProvider < ::Vagrant::Errors::VagrantError
51
+ error_message "There is no currently active provider"
52
+ end
53
+
54
+ class HasActiveProvider < ::Vagrant::Errors::VagrantError
55
+ error_message "Sorry, you cannot replace an active provider"
56
+ end
57
+
58
+ class NoStashedProvider < ::Vagrant::Errors::VagrantError
59
+ error_message "There is no matching stashed provider"
60
+ end
61
+
62
+ class AlreadyStashedProvider < ::Vagrant::Errors::VagrantError
63
+ error_message "There is already a stashed provider of this type"
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,71 @@
1
+ require 'optparse'
2
+
3
+ module VagrantPlugins::Provider
4
+ class Command < Vagrant.plugin('2', :command)
5
+
6
+ def self.synopsis
7
+ "hacky stuff for switching providers around"
8
+ end
9
+
10
+ def initialize(argv, env)
11
+ super
12
+
13
+ @main_args, @sub_command, @sub_args = split_main_and_subcommand(argv)
14
+
15
+ @subcommands = Vagrant::Registry.new
16
+
17
+ @subcommands.register(:list) do
18
+ require_relative "list-command"
19
+ ListCommand
20
+ end
21
+
22
+ @subcommands.register(:stash) do
23
+ require_relative "stash-command"
24
+ StashCommand
25
+ end
26
+
27
+ @subcommands.register(:pick) do
28
+ require_relative "pick-command"
29
+ PickCommand
30
+ end
31
+
32
+ end
33
+
34
+ def execute
35
+ if @main_args.include?("-h") || @main_args.include?("--help")
36
+ return help
37
+ end
38
+
39
+ # If we reached this far then we must have a subcommand. If not,
40
+ # then we also just print the help and exit.
41
+ command_class = @subcommands.get(@sub_command.to_sym) if @sub_command
42
+ return help if !command_class || !@sub_command
43
+
44
+ # Initialize and execute the command class
45
+ command_class.new(@sub_args, @env).execute
46
+ end
47
+
48
+ def help
49
+ opts = OptionParser.new do |opts|
50
+ opts.banner = "Usage: vagrant provider <subcommand> [<args>]"
51
+ opts.separator ""
52
+ opts.separator "Available subcommands:"
53
+
54
+ # Add the available subcommands as separators in order to print them
55
+ # out as well.
56
+ keys = []
57
+ @subcommands.each { |key, value| keys << key.to_s }
58
+
59
+ keys.sort.each do |key|
60
+ opts.separator " #{key}"
61
+ end
62
+
63
+ opts.separator ""
64
+ opts.separator "For help on any individual subcommand run `vagrant provider <subcommand> -h`"
65
+ end
66
+
67
+ @env.ui.info(opts.help, prefix: false)
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,31 @@
1
+ require_relative "base-command"
2
+
3
+ module VagrantPlugins::Provider
4
+ class ListCommand < BaseCommand
5
+ def execute
6
+ opts = OptionParser.new do |o|
7
+ o.banner = "Usage: vagrant provider list"
8
+ o.separator ""
9
+ o.separator "List all active providers"
10
+ end
11
+
12
+ # Parse the options
13
+ argv = parse_options(opts)
14
+ return if !argv
15
+
16
+ line "Machines"
17
+ line "--------"
18
+ line
19
+
20
+ machine_names.each do |machine_name|
21
+ line "#{machine_name}:"
22
+ providers_for(machine_name).each do |provider|
23
+ line " #{provider[:name]}" << (provider[:active] ? " (active)" : "")
24
+ end
25
+ end
26
+
27
+ # Success, exit status 0
28
+ 0
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,50 @@
1
+ require_relative "base-command"
2
+
3
+ module VagrantPlugins::Provider
4
+ class PickCommand < BaseCommand
5
+ def execute
6
+ opts = OptionParser.new do |o|
7
+ o.banner = "Usage: vagrant provider pick <provider> [machine-name]"
8
+ o.separator ""
9
+ o.separator "Bring back previously stored provider state"
10
+ o.separator ""
11
+ end
12
+
13
+ # Parse the options
14
+ argv = parse_options(opts)
15
+ return if !argv
16
+ if argv.empty? or argv.length > 2
17
+ raise Vagrant::Errors::CLIInvalidUsage,
18
+ help: opts.help.chomp
19
+ end
20
+
21
+ provider_name = argv[0].to_sym
22
+ machine_name = (argv[1] || @env.primary_machine_name).to_sym
23
+
24
+ if not machine_names.include? machine_name
25
+ raise Vagrant::Errors::MachineNotFound,
26
+ name: machine_name
27
+ end
28
+
29
+ if active_provider(machine_name)
30
+ raise HasActiveProvider
31
+ end
32
+
33
+ provider = machine_provider(machine_name, provider_name)
34
+ if not provider
35
+ raise NoStashedProvider
36
+ end
37
+
38
+ source = machine_folder.join("#{machine_name}_#{provider_name}")
39
+ target = machine_folder.join("#{machine_name}")
40
+
41
+ target.rmtree if target.exist?
42
+ source.rename(target)
43
+
44
+ line "Restored #{provider[:name]} provider from stash"
45
+
46
+ # Success, exit status 0
47
+ 0
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,49 @@
1
+ require_relative "base-command"
2
+
3
+ module VagrantPlugins::Provider
4
+ class StashCommand < BaseCommand
5
+ def execute
6
+ opts = OptionParser.new do |o|
7
+ o.banner = "Usage: vagrant provider stash [machine-name]"
8
+ o.separator ""
9
+ o.separator "Store current provider state for later"
10
+ o.separator ""
11
+ end
12
+
13
+ # Parse the options
14
+ argv = parse_options(opts)
15
+ return if !argv
16
+ if argv.length > 1
17
+ raise Vagrant::Errors::CLIInvalidUsage,
18
+ help: opts.help.chomp
19
+ end
20
+
21
+ machine_name = (argv[0] || @env.primary_machine_name).to_sym
22
+
23
+ if not machine_names.include? machine_name
24
+ raise Vagrant::Errors::MachineNotFound,
25
+ name: machine_name
26
+ end
27
+
28
+ provider = active_provider(machine_name)
29
+
30
+ if not provider
31
+ raise NoActiveProvider
32
+ end
33
+
34
+ source = machine_folder.join("#{machine_name}")
35
+ target = machine_folder.join("#{machine_name}_#{provider[:name]}")
36
+
37
+ if target.exist?
38
+ raise AlreadyStashedProvider
39
+ end
40
+
41
+ source.rename(target)
42
+
43
+ line "Stored #{provider[:name]} provider for later use"
44
+
45
+ # Success, exit status 0
46
+ 0
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,14 @@
1
+ require "vagrant"
2
+
3
+ module VagrantPlugins
4
+ module Provider
5
+ class Plugin < Vagrant.plugin("2")
6
+ name "Provider"
7
+
8
+ command :provider do
9
+ require_relative "vagrant-provider/command"
10
+ Command
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ # coding: utf-8
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "vagrant-provider"
5
+ spec.version = "0.1.0"
6
+ spec.authors = ["Glen Mailer"]
7
+ spec.email = ["glenjamin@gmail.com"]
8
+ spec.description = %q{Vagrant plugin for provider swapping}
9
+ spec.summary = %q{Vagrant plugin for provider swapping}
10
+ spec.homepage = "http://github.com/glenjamin/vagrant-provider"
11
+ spec.license = "MIT"
12
+
13
+ spec.files = `git ls-files`.split($/)
14
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
15
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
16
+ spec.require_paths = ["lib"]
17
+
18
+ spec.add_development_dependency "bundler", "~> 1.3"
19
+ spec.add_development_dependency "rake"
20
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-provider
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Glen Mailer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Vagrant plugin for provider swapping
42
+ email:
43
+ - glenjamin@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - .gitignore
49
+ - Gemfile
50
+ - LICENSE
51
+ - README.md
52
+ - Rakefile
53
+ - Vagrantfile
54
+ - lib/vagrant-provider.rb
55
+ - lib/vagrant-provider/base-command.rb
56
+ - lib/vagrant-provider/command.rb
57
+ - lib/vagrant-provider/list-command.rb
58
+ - lib/vagrant-provider/pick-command.rb
59
+ - lib/vagrant-provider/stash-command.rb
60
+ - vagrant-provider.gemspec
61
+ homepage: http://github.com/glenjamin/vagrant-provider
62
+ licenses:
63
+ - MIT
64
+ metadata: {}
65
+ post_install_message:
66
+ rdoc_options: []
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ requirements: []
80
+ rubyforge_project:
81
+ rubygems_version: 2.2.2
82
+ signing_key:
83
+ specification_version: 4
84
+ summary: Vagrant plugin for provider swapping
85
+ test_files: []