vagrant-cloner 0.9.3 → 2.0.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.
data.tar.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -26,7 +26,7 @@ Vagrant::Config.run do |config|
26
26
  end
27
27
 
28
28
  config.vm.provision :cloner do |cfg|
29
- cfg.cloners.mysql.tap do |c|
29
+ cfg.cloner.mysql.tap do |c|
30
30
  # Set options here.
31
31
  c.enabled = true
32
32
  c.run_order = 10
@@ -38,7 +38,7 @@ end
38
38
 
39
39
  The following keys are valid:
40
40
 
41
- - **cloners**
41
+ - **cloner**
42
42
  - **(all cloners)**
43
43
  - **enabled** - Required: Boolean whether to use this cloner or not. Defaults to false.
44
44
  - **run_order** - Suggested: Integer value that dictates which order cloners run in. Lower orders run first. Defaults to 1000.
@@ -93,16 +93,16 @@ If you make an error in your script, you may have a hard time uninstalling it wi
93
93
  To operate as a cloner, a class must inherit from `Vagrant::Cloners::Cloner`, and implement at a bare minimum these methods:
94
94
 
95
95
  - `name` - Returns a string representation of the cloner's name; used for namespacing config.
96
- - `validate!(env, errors)` - Can be used to call `errors.add` if there are validations that need to be performed on configuration values.
96
+ - `validate(machine, errors)` - Can be used to call `errors.add` if there are validations that need to be performed on configuration values.
97
97
  - `call` - Executes the cloner's routine.
98
98
 
99
99
  A cloner must also be registered in the config to be run. This is best done after the class has been closed, at the bottom of the file:
100
100
 
101
- `Vagrant::Provisioners::Cloner::ClonerConfig.register_cloner <Class>.instance.name, <Class>.instance`
101
+ `Vagrant::ClonerContainer.instance.send("#{<Class>.instance.name}=".to_sym, <Class>.instance)`
102
102
 
103
103
  So for the MySQL cloner (which is `Vagrant::Cloners::MysqlCloner`), the line would read
104
104
 
105
- `Vagrant::Provisioners::Cloner::ClonerConfig.register_cloner Vagrant::Cloners::MysqlCloner.instance.name, Vagrant::Cloners::MysqlCloner.instance`
105
+ `Vagrant::ClonerContainer.instance.send("#{Vagrant::Cloners::MysqlCloner.instance.name}=".to_sym, Vagrant::Cloners::MysqlCloner.instance)`
106
106
 
107
107
  A very minimal example [can be found in the cloners directory](lib/vagrant-cloner/cloners/testcloner.rb). For more detailed examples, look at the other cloners there!
108
108
 
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDWDCCAkCgAwIBAgIBADANBgkqhkiG9w0BAQUFADBSMQ8wDQYDVQQDDAZnaXRo
3
+ dWIxFjAUBgoJkiaJk/IsZAEZFgZyb2JlcnQxEzARBgoJkiaJk/IsZAEZFgNuZXQx
4
+ EjAQBgoJkiaJk/IsZAEZFgJuejAeFw0xMzAyMDQwMzAxMTdaFw0xNDAyMDQwMzAx
5
+ MTdaMFIxDzANBgNVBAMMBmdpdGh1YjEWMBQGCgmSJomT8ixkARkWBnJvYmVydDET
6
+ MBEGCgmSJomT8ixkARkWA25ldDESMBAGCgmSJomT8ixkARkWAm56MIIBIjANBgkq
7
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5iRa6UYCDf6iH+wOnuQtItD+cc6zk9n
8
+ zNROTcz34f9Kc60EBvBQdr1K3dxd3Cg/8KZ8ScldFbDQ5pOQTn83Vp57KW+vXq3W
9
+ Cs5kfYmfPrX+h77NhsyvlPDxXEUfEHYQNXok9GsUmwOMKt4/QmhnPyk0sQ00UFCx
10
+ LIUv23tqTwbkR9cKLGyQL3Wqu35yodLqFA7J3HAV+FLwfaUDbyYwUIOIijtjzzya
11
+ 7qsYn6JyFaHULRNVugP8HI5btXbCmOmP87hwXTkRE5PV9QlKsN9gw7RyYJvIAHZm
12
+ Kob9X1khIoqcoEhwU41R55oxIsF6X99oK7Logjh/KQ1ad2U8taidkQIDAQABozkw
13
+ NzAJBgNVHRMEAjAAMB0GA1UdDgQWBBQm8KrxyAkNbIEOkjt3Q0IqHayIcTALBgNV
14
+ HQ8EBAMCBLAwDQYJKoZIhvcNAQEFBQADggEBAJRN7tzK177JE1Qrc/42+Rv0nGMa
15
+ AGDw9Vq5dg0ZOeeDc/R7KwauQm55c9xgiaiZDVPuTcQMrlhVnF7V19upgaSozpOJ
16
+ G3ds/5Dz8YW7417ygOvqU3EJgyk6mRBsuZnqEdZaIqm4W4iTmawBwizNqPucK7tv
17
+ +Y2/hwxUAPN018IUJtqyeDktIaEvel5Zxz8otmtoRC++8qZRMN3+AaVNSGRRIgBT
18
+ T9H/4+4jHUDAyjhtWSvSUvcpxODHn5pnz6EdzwDPxHcsGAYKT15qWh1Q30OW9sfO
19
+ 1n1MjdAhfkkUVxrbjfGOEjpTeeQ3rAcHkUNAWNLeIeH+2z8ska6zAHl41aU=
20
+ -----END CERTIFICATE-----
@@ -1,8 +1,2 @@
1
1
  require 'vagrant'
2
- require 'vagrant-cloner/provisioner'
3
- require 'vagrant-cloner/config'
4
- require 'vagrant-cloner/cloner'
5
-
6
- Dir[File.join(File.dirname(__FILE__), 'vagrant-cloner', 'cloners', '*.rb')].each {|f| require f }
7
-
8
- Vagrant.provisioners.register(:cloner, Vagrant::Provisioners::Cloner)
2
+ require 'vagrant-cloner/plugin'
@@ -0,0 +1,71 @@
1
+ require 'net/ssh'
2
+ require 'net/scp'
3
+ require 'date'
4
+ require 'singleton'
5
+
6
+ module VagrantCloner
7
+ # Cloner defines the base API that a cloner has to modify a VM or remote systems.
8
+ # TODO: Create a method that downloads to local and then uploads to VM?
9
+
10
+ class BaseCloner
11
+ include Singleton
12
+
13
+ attr_accessor :enabled, :machine, :options, :run_order
14
+ attr_reader :env
15
+
16
+ def name
17
+ raise "Cloner must define #name and return a string."
18
+ end
19
+
20
+ def validate(machine, errors)
21
+ true
22
+ end
23
+
24
+ def enabled?
25
+ @enabled.nil? ? false : @enabled
26
+ end
27
+
28
+ def run_order
29
+ @run_order ||= 1000
30
+ end
31
+
32
+ # Shorthand for addressing the SSH communicator to the VM. View available methods
33
+ # here:
34
+ # https://github.com/mitchellh/vagrant/blob/master/plugins/communicators/ssh/communicator.rb
35
+ def vm
36
+ @machine.communicate
37
+ end
38
+
39
+ # Opens an SSH connection to an arbitrary server and passes it to a supplied block.
40
+ #
41
+ # See netssh documentation for further method options.
42
+ # http://net-ssh.github.com/net-ssh/
43
+ def ssh(*args, &block)
44
+ Net::SSH.start(*args, &block)
45
+ end
46
+
47
+ # Opens an SCP connection to an arbitrary server, downloading or uploading to the
48
+ # machine currently in scope (whether the host machine or the VM).
49
+ # Recommended params:
50
+ # remote_host, remote_user, {:password => remote_password}
51
+ #
52
+ # See netscp documentation for further method options.
53
+ # https://github.com/net-ssh/net-scp
54
+ def scp(*args, &block)
55
+ Net::SCP.start(*args, &block)
56
+ end
57
+
58
+ def datestring
59
+ Date.today.to_s
60
+ end
61
+ protected :datestring
62
+
63
+ # Wrap debugging options.
64
+ %w(info warn error success).each do |meth|
65
+ define_method(meth) do |message|
66
+ @machine.env.ui.send(meth.to_sym, message)
67
+ end
68
+ protected meth.to_sym
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,31 @@
1
+ require 'ostruct'
2
+ require 'singleton'
3
+
4
+ module VagrantCloner
5
+ class ClonerContainer < OpenStruct
6
+ include Singleton
7
+ include Enumerable
8
+
9
+ def members
10
+ methods(false).grep(/=/).map {|m| m[0...-1] }
11
+ end
12
+
13
+ def each
14
+ members.each {|m| yield send(m) }
15
+ self
16
+ end
17
+
18
+ def each_pair
19
+ members.each {|m| yield m, send(m)}
20
+ self
21
+ end
22
+
23
+ def enabled_by_order
24
+ members.collect {|m| send(m)} # Get all plugin instances
25
+ .select {|m| m.enabled? } # Only enabled
26
+ .sort_by(&:run_order) # Sort by run order
27
+ .each {|m| yield m} # Yield up
28
+ end
29
+
30
+ end
31
+ end
@@ -1,6 +1,6 @@
1
- module Vagrant
1
+ module VagrantCloner
2
2
  module Cloners
3
- class MysqlCloner < Cloner
3
+ class MysqlCloner < ::VagrantCloner::BaseCloner
4
4
 
5
5
  attr_accessor :remote_host, :remote_user, :remote_password,
6
6
  :remote_db_user, :remote_db_password,
@@ -13,13 +13,16 @@ module Vagrant
13
13
  "mysql"
14
14
  end
15
15
 
16
- def validate!(env, errors)
17
- errors.add "Must specify a remote user and host." unless remote_user && remote_host
18
- errors.add "Must specify a remote database user and password." unless remote_db_user && remote_db_password
16
+ def validate(machine, errors)
17
+ failures = []
18
+ failures.push "Must specify a remote user and host." unless remote_user && remote_host
19
+ failures.push "Must specify a remote database user and password." unless remote_db_user && remote_db_password
19
20
  unless warned_about_password or remote_password
20
- env.ui.warn "You haven't specified a remote password. Pulling down MySQL databases may fail unless you have proper publickey authentication enabled."
21
+ machine.env.ui.warn "You haven't specified a remote password. Pulling down MySQL databases may fail unless you have proper publickey authentication enabled."
21
22
  @warned_about_password = true
22
23
  end
24
+
25
+ errors.merge(name.to_sym => failures) if failures.any?
23
26
  end
24
27
 
25
28
  def remote_credentials
@@ -105,8 +108,10 @@ module Vagrant
105
108
  end
106
109
 
107
110
  def import_database
108
- vm.upload @local_backup_location, @vm_backup_location
109
- vm.execute "mysql -u#{@vm_db_user} -p#{@vm_db_password} < #{@vm_backup_location}"
111
+ vm.tap do |host|
112
+ host.upload @local_backup_location, @vm_backup_location
113
+ host.execute "mysql -u#{@vm_db_user} -p#{@vm_db_password} < #{@vm_backup_location}"
114
+ end
110
115
  info "Done loading database."
111
116
  end
112
117
 
@@ -122,4 +127,4 @@ module Vagrant
122
127
  end
123
128
  end
124
129
 
125
- Vagrant::Provisioners::Cloner::ClonerConfig.register_cloner Vagrant::Cloners::MysqlCloner.instance.name, Vagrant::Cloners::MysqlCloner.instance
130
+ VagrantCloner::ClonerContainer.instance.send("#{VagrantCloner::Cloners::MysqlCloner.instance.name}=".to_sym, VagrantCloner::Cloners::MysqlCloner.instance)
@@ -1,5 +1,5 @@
1
1
  module Etailer
2
- class MysqlCleanerCloner < ::Vagrant::Cloners::Cloner
2
+ class MysqlCleanerCloner < ::VagrantCloner::BaseCloner
3
3
  attr_accessor :vm_db_user, :vm_db_password
4
4
 
5
5
  def name
@@ -14,9 +14,12 @@ module Etailer
14
14
  @scripts = Array(scripts).flatten
15
15
  end
16
16
 
17
- def validate!(env, errors)
18
- errors.add("You have to specify at least one script to run!") if scripts.nil? || scripts.empty?
19
- errors.add("You must specify a VM database user and password!") unless vm_db_user && vm_db_password
17
+ def validate(machine, errors)
18
+ failures = []
19
+ failures.push "You have to specify at least one script to run!" if scripts.nil? || scripts.empty?
20
+ failures.push "You must specify a VM database user and password!" unless vm_db_user && vm_db_password
21
+
22
+ errors.merge(name.to_sym => failures) if failures.any?
20
23
  end
21
24
 
22
25
  def mysql_connection_string
@@ -34,4 +37,4 @@ module Etailer
34
37
  end
35
38
  end
36
39
 
37
- Vagrant::Provisioners::Cloner::ClonerConfig.register_cloner Etailer::MysqlCleanerCloner.instance.name, Etailer::MysqlCleanerCloner.instance
40
+ VagrantCloner::ClonerContainer.instance.send("#{Etailer::MysqlCleanerCloner.instance.name}=".to_sym, Etailer::MysqlCleanerCloner.instance)
@@ -1,14 +1,17 @@
1
- module Vagrant
1
+ module VagrantCloner
2
2
  module Cloners
3
- class TestCloner < Cloner
3
+ class TestCloner < ::VagrantCloner::BaseCloner
4
4
  attr_accessor :foo
5
5
 
6
6
  def name
7
7
  "testcloner"
8
8
  end
9
9
 
10
- def validate!(env, errors)
11
- errors.add("Must specify a foo") unless foo
10
+ def validate(machine, errors)
11
+ failures = []
12
+ failures.push "Must specify a foo" unless foo
13
+
14
+ failures.merge(name.to_sym => failures) if failures.any?
12
15
  end
13
16
 
14
17
  def call
@@ -18,7 +21,7 @@ module Vagrant
18
21
  end
19
22
  end
20
23
 
21
- Vagrant::Provisioners::Cloner::ClonerConfig.register_cloner Vagrant::Cloners::TestCloner.instance.name, Vagrant::Cloners::TestCloner.instance
24
+ VagrantCloner::ClonerContainer.instance.send("#{VagrantCloner::Cloners::TestCloner.instance.name}=".to_sym, VagrantCloner::Cloners::TestCloner.instance)
22
25
 
23
26
  # Inside your vagrant file, make sure you add the section for this cloner!
24
27
  # # ...
@@ -1,70 +1,19 @@
1
- # In here:
2
- # cloners = OpenStruct.new
3
- # cloners.mysql = MysqlCloner.config_class.new
4
- #
5
- # In readme:
6
- # config.cloners.mysql.config_option = yes
7
- #
8
- # In provisioner
9
- # config.cloners.any? {|k, v| v.enabled?}
10
-
11
- require 'ostruct'
12
-
13
- module Vagrant
14
- module Provisioners
15
- class ClonerContainer < OpenStruct
16
- include Enumerable
17
- def members
18
- methods(false).grep(/=/).map {|m| m[0...-1] }
19
- end
20
-
21
- def each
22
- members.each {|m| yield send(m) }
23
- self
24
- end
25
-
26
- def each_pair
27
- members.each {|m| yield m, send(m)}
28
- self
29
- end
30
-
31
- def enabled_by_order
32
- members.collect {|m| send(m)} # Get all plugin instances
33
- .select {|m| m.enabled? } # Only enabled
34
- .sort_by(&:run_order) # Sort by run order
35
- .each {|m| yield m} # Yield up
36
- end
37
-
1
+ module VagrantCloner
2
+ class Config < Vagrant.plugin("2", :config)
3
+ class << self
4
+ attr_accessor :registered_cloners
38
5
  end
39
6
 
40
- class Cloner
41
- class ClonerConfig < Vagrant::Config::Base
42
- class << self
43
- def registered_cloners
44
- @@registered_cloners ||= ClonerContainer.new
45
- end
46
-
47
- def register_cloner(name, instance)
48
- registered_cloners.send("#{name}=".to_sym, instance)
49
- end
50
- end
51
-
52
- def cloners
53
- @@registered_cloners
54
- end
55
-
56
- def validate(env, errors)
57
- # errors.add('Remote server must be specified.') unless remote_host
58
- cloners.select {|c| c.enabled? }.each do |cloner|
59
- cloner.validate!(env, errors)
60
- end
61
- end
62
- end
7
+ def cloner
8
+ self.class.registered_cloners ||= []
9
+ end
63
10
 
64
- def self.config_class
65
- Vagrant::Provisioners::Cloner::ClonerConfig
11
+ def validate(machine)
12
+ errors = {}
13
+ cloner.select {|c| c.enabled? }.each do |c|
14
+ c.validate(machine, errors)
66
15
  end
16
+ errors
67
17
  end
68
18
  end
69
19
  end
70
-
@@ -0,0 +1,22 @@
1
+ require 'vagrant-cloner/cloner_container'
2
+ require 'vagrant-cloner/base_cloner'
3
+ Dir[File.join(File.dirname(__FILE__), 'cloners', '*.rb')].each {|f| require f }
4
+
5
+ module VagrantCloner
6
+ class Plugin < ::Vagrant.plugin("2")
7
+ name "Cloner"
8
+
9
+ config(:cloner, :provisioner) do
10
+ require 'vagrant-cloner/config'
11
+ ::VagrantCloner::Config.tap do |c|
12
+ c.registered_cloners = ::VagrantCloner::ClonerContainer.instance
13
+ end
14
+ end
15
+
16
+ provisioner(:cloner) do
17
+ require 'vagrant-cloner/provisioner'
18
+ ::VagrantCloner::Provisioner
19
+ end
20
+
21
+ end
22
+ end
@@ -1,18 +1,12 @@
1
- module Vagrant
2
- module Provisioners
3
- class Cloner < Vagrant::Provisioners::Base
4
-
5
- def prepare
6
- end
7
-
8
- def provision!
9
- env[:ui].info "Vagrant-Cloner beginning back-up process."
10
- config.cloners.enabled_by_order do |cloner|
11
- cloner.tap {|c|
12
- c.options = config.cloners.send(cloner.name)
13
- c.env = env
14
- }.call
15
- end
1
+ module VagrantCloner
2
+ class Provisioner < Vagrant.plugin("2", :provisioner)
3
+ def provision
4
+ @machine.env.ui.info "Vagrant-Cloner beginning back-up process."
5
+ config.cloner.enabled_by_order do |cloner|
6
+ cloner.tap {|c|
7
+ c.options = config.cloner.send(cloner.name)
8
+ c.machine = @machine
9
+ }.call
16
10
  end
17
11
  end
18
12
  end
@@ -2,7 +2,7 @@
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
- version = '0.9.3'
5
+ version = '2.0.0'
6
6
 
7
7
  Gem::Specification.new do |gem|
8
8
  gem.name = "vagrant-cloner"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-cloner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 2.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -39,7 +39,7 @@ cert_chain:
39
39
  ME9XOXNmTwoxbjFNamRBaGZra1VWeHJiamZHT0VqcFRlZVEzckFjSGtVTkFX
40
40
  TkxlSWVIKzJ6OHNrYTZ6QUhsNDFhVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUt
41
41
  LS0tLQo=
42
- date: 2013-02-04 00:00:00.000000000 Z
42
+ date: 2013-03-23 00:00:00.000000000 Z
43
43
  dependencies: []
44
44
  description: Copy production resources down to your new VM.
45
45
  email:
@@ -54,12 +54,15 @@ files:
54
54
  - LICENSE.txt
55
55
  - README.md
56
56
  - Rakefile
57
+ - gem-public_cert.pem
57
58
  - lib/vagrant-cloner.rb
58
- - lib/vagrant-cloner/cloner.rb
59
+ - lib/vagrant-cloner/base_cloner.rb
60
+ - lib/vagrant-cloner/cloner_container.rb
59
61
  - lib/vagrant-cloner/cloners/mysql.rb
60
62
  - lib/vagrant-cloner/cloners/mysql_cleaner.rb
61
63
  - lib/vagrant-cloner/cloners/testcloner.rb
62
64
  - lib/vagrant-cloner/config.rb
65
+ - lib/vagrant-cloner/plugin.rb
63
66
  - lib/vagrant-cloner/provisioner.rb
64
67
  - lib/vagrant_init.rb
65
68
  - vagrant-cloner.gemspec
metadata.gz.sig CHANGED
Binary file
@@ -1,72 +0,0 @@
1
- require 'net/ssh'
2
- require 'net/scp'
3
- require 'date'
4
- require 'singleton'
5
-
6
- module Vagrant
7
- module Cloners
8
- # Cloner defines the base API that a cloner has to modify a VM or remote systems.
9
- # TODO: Create a method that downloads to local and then uploads to VM?
10
-
11
- class Cloner
12
- include Singleton
13
-
14
- attr_accessor :enabled, :env, :options, :run_order
15
-
16
- def name
17
- raise "Cloner must define #name and return a string."
18
- end
19
-
20
- def validate!(env, errors)
21
- true
22
- end
23
-
24
- def enabled?
25
- @enabled.nil? ? false : @enabled
26
- end
27
-
28
- def run_order
29
- @run_order ||= 1000
30
- end
31
-
32
- # Shorthand for addressing the SSH communicator to the VM. View available methods
33
- # here:
34
- # https://github.com/mitchellh/vagrant/blob/master/plugins/communicators/ssh/communicator.rb
35
- def vm
36
- env[:vm].channel
37
- end
38
-
39
- # Opens an SSH connection to an arbitrary server and passes it to a supplied block.
40
- #
41
- # See netssh documentation for further method options.
42
- # http://net-ssh.github.com/net-ssh/
43
- def ssh(*args, &block)
44
- Net::SSH.start(*args, &block)
45
- end
46
-
47
- # Opens an SCP connection to an arbitrary server, downloading or uploading to the
48
- # machine currently in scope (whether the host machine or the VM).
49
- # Recommended params:
50
- # remote_host, remote_user, {:password => remote_password}
51
- #
52
- # See netscp documentation for further method options.
53
- # https://github.com/net-ssh/net-scp
54
- def scp(*args, &block)
55
- Net::SCP.start(*args, &block)
56
- end
57
-
58
- def datestring
59
- Date.today.to_s
60
- end
61
- protected :datestring
62
-
63
- # Wrap debugging options.
64
- %w(info warn error success).each do |meth|
65
- define_method(meth) do |message|
66
- env[:ui].send(meth.to_sym, message)
67
- end
68
- protected meth.to_sym
69
- end
70
- end
71
- end
72
- end