vagrant-cloner 0.9.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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