vagrant-cloner 2.0.0 → 2.1.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/Gemfile CHANGED
@@ -2,3 +2,8 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in vagrant-cloner.gemspec
4
4
  gemspec
5
+
6
+ group :development, :test do
7
+ gem 'rspec'
8
+ gem 'pry'
9
+ end
data/README.md CHANGED
@@ -43,6 +43,7 @@ The following keys are valid:
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.
45
45
  - **mysql**
46
+ - **use_ssh** - If false, will attempt to connect to the remote MySQL server at the `remote_host` using the `remote_user` and `remote_password` settings. Elsewise, will SSH into the remote host, export the database, download it locally, upload it to the VM, and install it that way.
46
47
  - **remote_host** - String containing the remote server's FQDN.
47
48
  - **remote_user** - Username to connect to remote server.
48
49
  - **remote_password** - Optional: Password to connect to remote server. (Can be ignored if using publickey auth.)
@@ -63,9 +63,14 @@ module VagrantCloner
63
63
  # Wrap debugging options.
64
64
  %w(info warn error success).each do |meth|
65
65
  define_method(meth) do |message|
66
- @machine.env.ui.send(meth.to_sym, message)
66
+ machine.env.ui.send(meth.to_sym, message)
67
67
  end
68
68
  protected meth.to_sym
69
69
  end
70
+
71
+ def debug(message)
72
+ machine.env.ui.info message
73
+ end
74
+ protected :debug
70
75
  end
71
76
  end
@@ -3,7 +3,7 @@ module VagrantCloner
3
3
  class MysqlCloner < ::VagrantCloner::BaseCloner
4
4
 
5
5
  attr_accessor :remote_host, :remote_user, :remote_password,
6
- :remote_db_user, :remote_db_password,
6
+ :remote_db_user, :remote_db_password, :use_ssh,
7
7
  :vm_db_user, :vm_db_password,
8
8
  :databases_to_clone,
9
9
  :remote_backup_path, :local_backup_path, :vm_backup_path, :backup_file,
@@ -16,12 +16,11 @@ module VagrantCloner
16
16
  def validate(machine, errors)
17
17
  failures = []
18
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
+ failures.push "Must specify a remote database user and password." unless (remote_db_user && remote_db_password) || use_ssh
20
20
  unless warned_about_password or remote_password
21
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."
22
22
  @warned_about_password = true
23
23
  end
24
-
25
24
  errors.merge(name.to_sym => failures) if failures.any?
26
25
  end
27
26
 
@@ -54,6 +53,11 @@ module VagrantCloner
54
53
  end
55
54
  alias_method :disable_cleanup?, :disable_cleanup
56
55
 
56
+ def use_ssh
57
+ @use_ssh.nil? ? true : @use_ssh
58
+ end
59
+ alias_method :use_ssh?, :use_ssh
60
+
57
61
 
58
62
  def extract_relevant_options
59
63
  @enabled = options.enabled
@@ -63,6 +67,8 @@ module VagrantCloner
63
67
  @remote_db_user = options.remote_db_user
64
68
  @remote_db_password = options.remote_db_password
65
69
 
70
+ @use_ssh = options.use_ssh
71
+
66
72
  @databases_to_clone = options.databases_to_clone
67
73
 
68
74
  @vm_db_user = options.vm_db_user
@@ -75,9 +81,9 @@ module VagrantCloner
75
81
  @vm_backup_path = options.vm_backup_path
76
82
  @backup_file = options.backup_file || "mysql-backup-#{datestring}.sql"
77
83
 
78
- @remote_backup_location = File.join(@remote_backup_path, @backup_file)
79
- @local_backup_location = File.join(@local_backup_path, @backup_file)
80
- @vm_backup_location = File.join(@vm_backup_path, @backup_file)
84
+ @remote_backup_location = File.join(remote_backup_path, @backup_file)
85
+ @local_backup_location = File.join(local_backup_path, @backup_file)
86
+ @vm_backup_location = File.join(vm_backup_path, @backup_file)
81
87
  end
82
88
 
83
89
  def mysql_database_flag
@@ -88,16 +94,39 @@ module VagrantCloner
88
94
  end
89
95
  end
90
96
 
97
+ # We don't want to output -p if password is nil, because that will prompt
98
+ # for a password.
99
+ def mysql_password_flag(password)
100
+ if password.nil? || password.empty?
101
+ ""
102
+ else
103
+ %Q{ -p"#{password}"}
104
+ end
105
+ end
106
+
91
107
  def call
92
108
  extract_relevant_options
93
- dump_remote_database
94
- download_remote_database
95
- import_database
96
- clean_up
109
+ if use_ssh?
110
+ dump_remote_database
111
+ download_remote_database
112
+ import_database
113
+ clean_up
114
+ else
115
+ remote_dump_and_pipe
116
+ end
117
+ end
118
+
119
+ def remote_dump_and_pipe
120
+ info "Doing remote mysqldump..."
121
+ command = %Q{mysqldump --verbose -h #{@remote_host} -u"#{@remote_user}"#{mysql_password_flag(@remote_password)} #{mysql_database_flag} | mysql -u"#{@vm_db_user}"#{mysql_password_flag(@vm_db_password)}}
122
+ vm.tap do |host|
123
+ vm.execute command
124
+ end
125
+ info "All done!"
97
126
  end
98
127
 
99
128
  def dump_remote_database
100
- command = "mysqldump -u#{@remote_db_user} -p#{@remote_db_password} #{mysql_database_flag} > #{@remote_backup_location}"
129
+ command = %Q{mysqldump -u"#{@remote_db_user}"#{mysql_password_flag(@remote_db_password)} #{mysql_database_flag} > #{@remote_backup_location}}
101
130
  ssh(*remote_credentials) {|s| s.exec! command }
102
131
  info "Finished dumping database!"
103
132
  end
@@ -110,7 +139,8 @@ module VagrantCloner
110
139
  def import_database
111
140
  vm.tap do |host|
112
141
  host.upload @local_backup_location, @vm_backup_location
113
- host.execute "mysql -u#{@vm_db_user} -p#{@vm_db_password} < #{@vm_backup_location}"
142
+ command = %Q{mysql -u"#{@vm_db_user}"#{mysql_password_flag(@vm_db_password)} < #{@vm_backup_location}}
143
+ host.execute command
114
144
  end
115
145
  info "Done loading database."
116
146
  end
@@ -120,11 +150,13 @@ module VagrantCloner
120
150
  ssh(*remote_credentials) {|s| s.exec! "rm #{@remote_backup_location}" } and info "Removed remote backup file."
121
151
  system "rm #{@local_backup_location}" and info "Removed local backup file."
122
152
  vm.execute "rm #{@vm_backup_location}" and info "Removed vm backup file."
123
- info "Done!"
153
+ success "Done!"
124
154
  end
125
155
  end
126
156
  end
127
157
  end
128
158
  end
129
159
 
130
- VagrantCloner::ClonerContainer.instance.send("#{VagrantCloner::Cloners::MysqlCloner.instance.name}=".to_sym, VagrantCloner::Cloners::MysqlCloner.instance)
160
+ if defined? VagrantCloner::ClonerContainer
161
+ VagrantCloner::ClonerContainer.instance.send("#{VagrantCloner::Cloners::MysqlCloner.instance.name}=".to_sym, VagrantCloner::Cloners::MysqlCloner.instance)
162
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+ require 'pry'
3
+ require 'ostruct'
4
+
5
+ # Mock this
6
+ module VagrantCloner
7
+ class BaseCloner
8
+ def datestring; "2013-01-01"; end
9
+ end
10
+ end
11
+
12
+ require 'vagrant-cloner/cloners/mysql'
13
+
14
+ module VagrantCloner
15
+ module Cloners
16
+ describe MysqlCloner do
17
+ describe "#extract_relevant_options" do
18
+ describe "when missing keys" do
19
+ before do
20
+ subject.stub!(:options).and_return(OpenStruct.new({:remote_db_password => ''}))
21
+ subject.extract_relevant_options
22
+ end
23
+
24
+ its(:remote_db_password) { should be_empty }
25
+ end
26
+ end
27
+
28
+ describe "#mysql_password_flag" do
29
+ it "produces nothing if password is nil or empty" do
30
+ result = subject.mysql_password_flag("")
31
+ result.should be_empty
32
+ end
33
+
34
+ it "outputs the flag if password is present" do
35
+ result = subject.mysql_password_flag("test")
36
+ result.should == %Q{ -p"test"}
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
File without changes
@@ -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 = '2.0.0'
5
+ version = '2.1.0'
6
6
 
7
7
  Gem::Specification.new do |gem|
8
8
  gem.name = "vagrant-cloner"
@@ -14,8 +14,8 @@ Gem::Specification.new do |gem|
14
14
  gem.homepage = "https://github.com/rjocoleman/vagrant-cloner/"
15
15
 
16
16
  gem.files = `git ls-files`.split($/)
17
+ gem.test_files = gem.files.grep(%r{^(spec)/})
17
18
  # gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
- # gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ["lib"]
20
20
 
21
21
  gem.signing_key = '/Users/rjocoleman/.gemcert/gem-private_key.pem'
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: 2.0.0
4
+ version: 2.1.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-03-23 00:00:00.000000000 Z
42
+ date: 2013-03-26 00:00:00.000000000 Z
43
43
  dependencies: []
44
44
  description: Copy production resources down to your new VM.
45
45
  email:
@@ -65,6 +65,8 @@ files:
65
65
  - lib/vagrant-cloner/plugin.rb
66
66
  - lib/vagrant-cloner/provisioner.rb
67
67
  - lib/vagrant_init.rb
68
+ - spec/cloners/mysql_spec.rb
69
+ - spec/spec_helper.rb
68
70
  - vagrant-cloner.gemspec
69
71
  homepage: https://github.com/rjocoleman/vagrant-cloner/
70
72
  licenses: []
@@ -90,4 +92,6 @@ rubygems_version: 1.8.24
90
92
  signing_key:
91
93
  specification_version: 3
92
94
  summary: Copy production resources down to your new VM.
93
- test_files: []
95
+ test_files:
96
+ - spec/cloners/mysql_spec.rb
97
+ - spec/spec_helper.rb
metadata.gz.sig CHANGED
Binary file