daptiv-chef-ci 0.0.6 → 0.0.7
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/Gemfile +0 -4
- data/Rakefile +6 -0
- data/daptiv-chef-ci.gemspec +1 -3
- data/lib/daptiv-chef-ci/basebox_builder_factory.rb +19 -0
- data/lib/daptiv-chef-ci/vagrant_driver.rb +17 -2
- data/lib/daptiv-chef-ci/vagrant_task.rb +55 -5
- data/lib/daptiv-chef-ci/virtualbox_basebox_builder.rb +33 -0
- data/lib/daptiv-chef-ci/vmware_basebox_builder.rb +103 -0
- data/spec/daptiv-chef-ci/basebox_builder_factory_spec.rb +25 -0
- data/spec/daptiv-chef-ci/logger_spec.rb +0 -1
- data/spec/daptiv-chef-ci/shell_spec.rb +0 -1
- data/spec/daptiv-chef-ci/vagrant_driver_spec.rb +57 -25
- data/spec/daptiv-chef-ci/virtualbox_basebox_builder_spec.rb +20 -0
- data/spec/daptiv-chef-ci/virtualbox_driver_spec.rb +7 -8
- data/spec/daptiv-chef-ci/vmware_basebox_builder_spec.rb +20 -0
- metadata +14 -36
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -15,6 +15,12 @@ RSpec::Core::RakeTask.new do |task|
|
|
15
15
|
task.rspec_opts << '-tunit'
|
16
16
|
end
|
17
17
|
|
18
|
+
# Run the integration test suite
|
19
|
+
RSpec::Core::RakeTask.new(:integration) do |task|
|
20
|
+
task.pattern = "spec/**/*_spec.rb"
|
21
|
+
task.rspec_opts = [ '--color', '-f documentation' ]
|
22
|
+
end
|
23
|
+
|
18
24
|
# Default task is to run tests
|
19
25
|
task :default => "spec"
|
20
26
|
|
data/daptiv-chef-ci.gemspec
CHANGED
@@ -43,7 +43,7 @@ Gem::Specification.new do |gem|
|
|
43
43
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
44
44
|
gem.name = "daptiv-chef-ci"
|
45
45
|
gem.require_paths = ["lib"]
|
46
|
-
gem.version = '0.0.
|
46
|
+
gem.version = '0.0.7'
|
47
47
|
|
48
48
|
gem.add_runtime_dependency "log4r", "~> 1.1.10"
|
49
49
|
gem.add_runtime_dependency "mixlib-shellout", "~> 1.2.0"
|
@@ -52,6 +52,4 @@ Gem::Specification.new do |gem|
|
|
52
52
|
gem.add_development_dependency "rspec-core", "~> 2.12.2"
|
53
53
|
gem.add_development_dependency "rspec-expectations", "~> 2.12.1"
|
54
54
|
gem.add_development_dependency "rspec-mocks", "~> 2.12.1"
|
55
|
-
gem.add_development_dependency "simplecov"
|
56
|
-
gem.add_development_dependency "mocha", "~> 0.14.0"
|
57
55
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
require_relative 'shell'
|
3
|
+
require_relative 'vmware_basebox_builder'
|
4
|
+
require_relative 'virtualbox_basebox_builder'
|
5
|
+
|
6
|
+
module DaptivChefCI
|
7
|
+
|
8
|
+
# Abstract factory to produce base box builder instances based off the specified provider
|
9
|
+
class BaseBoxBuilderFactory
|
10
|
+
|
11
|
+
# Creates a new base box builder instance
|
12
|
+
def create(shell, provider, base_dir)
|
13
|
+
provider == :vmware_fusion ?
|
14
|
+
DaptivChefCI::VMwareBaseBoxBuilder.new(base_dir) :
|
15
|
+
DaptivChefCI::VirtualBoxBaseBoxBuilder.new(base_dir, shell)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -8,9 +8,13 @@ module DaptivChefCI
|
|
8
8
|
# Constructs a new Vagrant management instance
|
9
9
|
#
|
10
10
|
# @param [Shell] The CLI
|
11
|
-
|
11
|
+
# @param [BaseBoxBuilderFactory] The base box builder factory instance
|
12
|
+
# @param [String] The name of the Vagrant virtualization provider: virtualbox, vmware_fusion
|
13
|
+
def initialize(shell, basebox_builder_factory, provider = :virtualbox)
|
12
14
|
@logger = Log4r::Logger.new("daptiv_chef_ci::vagrant")
|
13
15
|
@shell = shell
|
16
|
+
@basebox_builder_factory = basebox_builder_factory
|
17
|
+
@provider = provider
|
14
18
|
end
|
15
19
|
|
16
20
|
def destroy(opts={})
|
@@ -36,7 +40,9 @@ module DaptivChefCI
|
|
36
40
|
:cmd_timeout_in_seconds => 7200,
|
37
41
|
:retry_attempts => 0
|
38
42
|
}.merge(opts)
|
39
|
-
|
43
|
+
cmd = 'vagrant up'
|
44
|
+
cmd += ' --provider=' + @provider.to_s if @provider != :virtualbox
|
45
|
+
exec_cmd_with_retry(cmd, opts)
|
40
46
|
end
|
41
47
|
|
42
48
|
def provision(opts={})
|
@@ -55,6 +61,15 @@ module DaptivChefCI
|
|
55
61
|
exec_cmd_with_retry('vagrant reload', opts)
|
56
62
|
end
|
57
63
|
|
64
|
+
def package(opts={})
|
65
|
+
base_dir = opts[:base_dir] || Dir.pwd
|
66
|
+
box_name = opts[:box_name] || File.basename(base_dir)
|
67
|
+
box_name += '.box' unless box_name.end_with?('.box')
|
68
|
+
|
69
|
+
builder = @basebox_builder_factory.create(@shell, @provider, base_dir)
|
70
|
+
builder.build(box_name)
|
71
|
+
end
|
72
|
+
|
58
73
|
|
59
74
|
private
|
60
75
|
|
@@ -2,6 +2,7 @@ require 'rake'
|
|
2
2
|
require 'rake/tasklib'
|
3
3
|
require_relative 'vagrant_driver'
|
4
4
|
require_relative 'virtualbox_driver'
|
5
|
+
require_relative 'basebox_builder_factory'
|
5
6
|
require_relative 'shell'
|
6
7
|
require_relative 'logger'
|
7
8
|
|
@@ -15,14 +16,43 @@ DaptivChefCI::Logger.init()
|
|
15
16
|
|
16
17
|
class Vagrant
|
17
18
|
|
19
|
+
# Example usage, creates a vmware base box:
|
20
|
+
#
|
21
|
+
# Vagrant::RakeTask.new 'vagrant_fusion' do |t|
|
22
|
+
# t.provider = :vmware_fusion
|
23
|
+
# t.create_box = true
|
24
|
+
# t.box_name = 'windows-server-vmwarefusion.box'
|
25
|
+
# t.up_timeout_in_seconds = 3600
|
26
|
+
# end
|
27
|
+
#
|
18
28
|
# This class lets you define Rake tasks to drive Vagrant.
|
19
29
|
class RakeTask < ::Rake::TaskLib
|
20
30
|
include ::Rake::DSL if defined? ::Rake::DSL
|
21
31
|
|
32
|
+
attr_accessor :provider
|
33
|
+
attr_accessor :create_box
|
34
|
+
attr_accessor :vagrantfile_dir
|
35
|
+
attr_accessor :box_name
|
36
|
+
attr_accessor :up_timeout_in_seconds
|
37
|
+
attr_accessor :halt_timeout_in_seconds
|
38
|
+
attr_accessor :destroy_timeout_in_seconds
|
39
|
+
attr_accessor :destroy_retry_attempts
|
40
|
+
attr_accessor :halt_retry_attempts
|
41
|
+
|
22
42
|
# @param [String] name The task name.
|
23
43
|
# @param [String] desc Description of the task.
|
44
|
+
# @param [String] provider vagrant provider to use if other than the default virtualbox provider
|
24
45
|
def initialize(name = 'vagrant', desc = 'Daptiv Vagrant Tasks')
|
25
46
|
@name, @desc = name, desc
|
47
|
+
@provider = :virtualbox
|
48
|
+
@create_box = false
|
49
|
+
@vagrantfile_dir = Dir.pwd
|
50
|
+
@box_name = nil
|
51
|
+
@up_timeout_in_seconds = 7200
|
52
|
+
@halt_timeout_in_seconds = 180
|
53
|
+
@destroy_timeout_in_seconds = 180
|
54
|
+
@destroy_retry_attempts = 2
|
55
|
+
@halt_retry_attempts = 2
|
26
56
|
yield self if block_given?
|
27
57
|
define_task
|
28
58
|
end
|
@@ -32,7 +62,9 @@ class Vagrant
|
|
32
62
|
def define_task
|
33
63
|
desc @desc
|
34
64
|
task @name do
|
35
|
-
|
65
|
+
shell = DaptivChefCI::Shell.new()
|
66
|
+
basebox_builder_factory = DaptivChefCI::BaseBoxBuilderFactory.new()
|
67
|
+
vagrant = DaptivChefCI::VagrantDriver.new(shell, basebox_builder_factory, @provider)
|
36
68
|
execute_vagrant_run(vagrant)
|
37
69
|
end
|
38
70
|
end
|
@@ -44,7 +76,7 @@ class Vagrant
|
|
44
76
|
|
45
77
|
def try_destroy_before_vagrant_up(vagrant)
|
46
78
|
begin
|
47
|
-
|
79
|
+
destroy(vagrant)
|
48
80
|
rescue SystemExit => ex
|
49
81
|
exit(ex.status)
|
50
82
|
rescue Exception => ex
|
@@ -54,18 +86,36 @@ class Vagrant
|
|
54
86
|
|
55
87
|
def try_vagrant_up(vagrant)
|
56
88
|
begin
|
57
|
-
|
89
|
+
up(vagrant)
|
90
|
+
halt(vagrant)
|
91
|
+
package(vagrant) if @create_box
|
58
92
|
rescue SystemExit => ex
|
59
93
|
exit(ex.status)
|
60
94
|
rescue Exception => ex
|
61
95
|
print_err(ex)
|
62
96
|
exit(1)
|
63
97
|
ensure
|
64
|
-
|
65
|
-
|
98
|
+
halt(vagrant)
|
99
|
+
destroy(vagrant)
|
66
100
|
end
|
67
101
|
end
|
68
102
|
|
103
|
+
def up(vagrant)
|
104
|
+
vagrant.up({ :cmd_timeout_in_seconds => @up_timeout_in_seconds })
|
105
|
+
end
|
106
|
+
|
107
|
+
def package(vagrant)
|
108
|
+
vagrant.package({ :base_dir => @vagrantfile_dir, :box_name => @box_name })
|
109
|
+
end
|
110
|
+
|
111
|
+
def destroy(vagrant)
|
112
|
+
vagrant.destroy({ :cmd_timeout_in_seconds => @destroy_timeout_in_seconds, :retry_attempts => @destroy_retry_attempts })
|
113
|
+
end
|
114
|
+
|
115
|
+
def halt(vagrant)
|
116
|
+
vagrant.halt({ :cmd_timeout_in_seconds => @halt_timeout_in_seconds, :retry_attempts => @halt_retry_attempts })
|
117
|
+
end
|
118
|
+
|
69
119
|
def print_err(ex)
|
70
120
|
STDERR.puts("#{ex.message} (#{ex.class})")
|
71
121
|
STDERR.puts(ex.backtrace.join("\n"))
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
require 'fileutils'
|
3
|
+
require_relative 'shell'
|
4
|
+
|
5
|
+
module DaptivChefCI
|
6
|
+
|
7
|
+
# This class builds VBox Vagrant boxes
|
8
|
+
class VirtualBoxBaseBoxBuilder
|
9
|
+
|
10
|
+
# Creates a new box builder instance
|
11
|
+
#
|
12
|
+
# @param [String] The full path to the directory where the Vagrantfile exists
|
13
|
+
# of the box we want to package, i.e. /Users/admin/src/dotnetframework
|
14
|
+
# @param [Shell] A shell instance
|
15
|
+
def initialize(base_dir, shell)
|
16
|
+
@shell = shell
|
17
|
+
@base_dir = base_dir
|
18
|
+
@logger = Log4r::Logger.new("daptiv_chef_ci::vmware_base_box_builder")
|
19
|
+
end
|
20
|
+
|
21
|
+
# Packages a VBox Vagrant box. This can take 15 minutes or so.
|
22
|
+
#
|
23
|
+
# @param [String] base box file name, i.e. 'windows-server-2008.box'
|
24
|
+
def build(box_file)
|
25
|
+
Dir.chdir(@base_dir) {
|
26
|
+
@logger.info("Packaging box #{box_file}")
|
27
|
+
FileUtils.rm(box_file) if File.exists?(box_file)
|
28
|
+
@shell.exec_cmd("vagrant package --output #{box_file}", 1800)
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
require 'fileutils'
|
3
|
+
require_relative 'shell'
|
4
|
+
|
5
|
+
module DaptivChefCI
|
6
|
+
|
7
|
+
# This class builds VMware Fusion 6 Vagrant boxes on OS X
|
8
|
+
#
|
9
|
+
# NOTE - This class makes a lot of assumptions that hopefully won't break until
|
10
|
+
# after Vagrant natively supports packaging VMware Fusion boxes.
|
11
|
+
class VMwareBaseBoxBuilder
|
12
|
+
|
13
|
+
# Creates a new box builder instance
|
14
|
+
#
|
15
|
+
# @param [String] The full path to the directory where the Vagrantfile exists
|
16
|
+
# of the box we want to package, i.e. /Users/admin/src/dotnetframework
|
17
|
+
def initialize(base_dir)
|
18
|
+
@base_dir = base_dir
|
19
|
+
@logger = Log4r::Logger.new("daptiv_chef_ci::vmware_base_box_builder")
|
20
|
+
end
|
21
|
+
|
22
|
+
# Packages a VMware Fusion Vagrant box. This can take 15 minutes or so.
|
23
|
+
#
|
24
|
+
# @param [String] base box file name, i.e. 'windows-server-2008.box'
|
25
|
+
def build(box_file)
|
26
|
+
# /Users/admin/src/mybox/.vagrant/machines/default/vmware_fusion/0f721388-a327-4ba3-b203-c09f69016b43/
|
27
|
+
box_root_path = "#{@base_dir}/.vagrant/machines/default/vmware_fusion"
|
28
|
+
|
29
|
+
sub_dir = Dir["#{box_root_path}/*/"]
|
30
|
+
.map { |d| File.basename(d) }
|
31
|
+
.find { |d| d =~ /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/ }
|
32
|
+
|
33
|
+
box_path = "#{box_root_path}/#{sub_dir}"
|
34
|
+
@logger.debug("box_path: #{box_path}")
|
35
|
+
|
36
|
+
build_box(box_path, box_file)
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
protected
|
41
|
+
|
42
|
+
def build_box(box_path, box_file)
|
43
|
+
tar_list_path = "#{box_path}/boxfilelist.txt"
|
44
|
+
completed_box_path = "#{@base_dir}/#{box_file}"
|
45
|
+
|
46
|
+
@logger.debug("tar_list_path: #{tar_list_path}")
|
47
|
+
@logger.debug("completed_box_path: #{completed_box_path}")
|
48
|
+
|
49
|
+
Dir.chdir(box_path) {
|
50
|
+
vmdk_file = File.expand_path(Dir.glob("*.vmdk").first())
|
51
|
+
|
52
|
+
args = [vdiskmanager_path]
|
53
|
+
args << '-d'
|
54
|
+
args << vmdk_file
|
55
|
+
@logger.info("Defragging #{vmdk_file}")
|
56
|
+
system(*args)
|
57
|
+
|
58
|
+
args = [vdiskmanager_path]
|
59
|
+
args << '-k'
|
60
|
+
args << vmdk_file
|
61
|
+
@logger.info("Shrinking #{vmdk_file}")
|
62
|
+
system(*args)
|
63
|
+
|
64
|
+
create_json_manifest(box_path)
|
65
|
+
create_tar_manifest(tar_list_path)
|
66
|
+
|
67
|
+
@logger.info("Packaging box #{box_file}")
|
68
|
+
tar_cmd = "tar -czvf #{box_file} -T #{tar_list_path}"
|
69
|
+
%x[#{tar_cmd}]
|
70
|
+
FileUtils.rm(completed_box_path) if File.exists?(completed_box_path)
|
71
|
+
FileUtils.mv(box_file, completed_box_path)
|
72
|
+
}
|
73
|
+
|
74
|
+
@logger.info("Done creating box #{completed_box_path}")
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_tar_manifest(tar_list_path)
|
78
|
+
@logger.debug("Creating manifest #{tar_list_path}")
|
79
|
+
|
80
|
+
files = Dir.glob("*.{vmdk,nvram,plist,vmsd,vmx,vmxf,json}").join("\n")
|
81
|
+
@logger.debug("Found the following files to pack: #{files}")
|
82
|
+
|
83
|
+
FileUtils.rm(tar_list_path) if File.exists?(tar_list_path)
|
84
|
+
IO.write(tar_list_path, files)
|
85
|
+
end
|
86
|
+
|
87
|
+
def create_json_manifest(box_path)
|
88
|
+
json_manifest_path = File.join(box_path, "metadata.json")
|
89
|
+
FileUtils.rm(json_manifest_path) if File.exists?(json_manifest_path)
|
90
|
+
manifest = <<-EOH
|
91
|
+
{
|
92
|
+
"provider":"vmware_fusion"
|
93
|
+
}
|
94
|
+
EOH
|
95
|
+
IO.write(json_manifest_path, manifest)
|
96
|
+
end
|
97
|
+
|
98
|
+
def vdiskmanager_path
|
99
|
+
'/Applications/VMware Fusion.app/Contents/Library/vmware-vdiskmanager'
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'daptiv-chef-ci/basebox_builder_factory'
|
2
|
+
require 'daptiv-chef-ci/virtualbox_basebox_builder'
|
3
|
+
require 'daptiv-chef-ci/vmware_basebox_builder'
|
4
|
+
|
5
|
+
describe DaptivChefCI::BaseBoxBuilderFactory, :unit => true do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@shell = stub()
|
9
|
+
@factory = DaptivChefCI::BaseBoxBuilderFactory.new()
|
10
|
+
end
|
11
|
+
|
12
|
+
describe 'create' do
|
13
|
+
|
14
|
+
it 'should create VMware builder when provider is vmware_fusion' do
|
15
|
+
builder = @factory.create(@shell, :vmware_fusion, Dir.pwd)
|
16
|
+
expect(builder).to be_an_instance_of(DaptivChefCI::VMwareBaseBoxBuilder)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should create VMware builder when provider is virtualbox' do
|
20
|
+
builder = @factory.create(@shell, :virtualbox, Dir.pwd)
|
21
|
+
expect(builder).to be_an_instance_of(DaptivChefCI::VirtualBoxBaseBoxBuilder)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'mocha/api'
|
2
1
|
require 'mixlib/shellout/exceptions'
|
3
2
|
require 'daptiv-chef-ci/vagrant_driver'
|
4
3
|
require 'daptiv-chef-ci/logger'
|
@@ -7,64 +6,97 @@ describe DaptivChefCI::VagrantDriver, :unit => true do
|
|
7
6
|
|
8
7
|
before(:each) do
|
9
8
|
@shell = mock()
|
10
|
-
@
|
9
|
+
@basebox_builder_factory = stub()
|
10
|
+
@vagrant = DaptivChefCI::VagrantDriver.new(@shell, @basebox_builder_factory)
|
11
11
|
end
|
12
12
|
|
13
13
|
describe 'destroy' do
|
14
|
-
it 'should force shutdown vagrant' do
|
15
|
-
@shell.
|
16
|
-
expect(cmd).to eq('vagrant destroy -f')
|
17
|
-
end
|
14
|
+
it 'should force shutdown vagrant with a timeout of 180 seconds' do
|
15
|
+
@shell.should_receive(:exec_cmd).with('vagrant destroy -f', 180)
|
18
16
|
@vagrant.destroy()
|
19
17
|
end
|
20
18
|
end
|
21
19
|
|
22
20
|
describe 'halt' do
|
23
|
-
it 'should halt vagrant' do
|
24
|
-
@shell.
|
25
|
-
expect(cmd).to eq('vagrant halt')
|
26
|
-
end
|
21
|
+
it 'should halt vagrant with a timeout of 180 seconds' do
|
22
|
+
@shell.should_receive(:exec_cmd).with('vagrant halt', 180)
|
27
23
|
@vagrant.halt()
|
28
24
|
end
|
29
25
|
|
30
26
|
it 'should retry when exec fails' do
|
27
|
+
@shell.should_receive(:exec_cmd).and_raise(Mixlib::ShellOut::ShellCommandFailed)
|
28
|
+
@shell.should_receive(:exec_cmd).and_return('success')
|
31
29
|
# shell cmd fails then succeeds, the vagrant.halt should succeed overall
|
32
|
-
@shell.stubs(:exec_cmd).raises(Mixlib::ShellOut::ShellCommandFailed, 'There was an error').then.returns('success')
|
33
30
|
@vagrant.halt({ :retry_wait_in_seconds => 0 })
|
34
31
|
end
|
35
32
|
|
36
33
|
it 'should fail after retrying twice' do
|
37
34
|
# shell always fails, vagrant.halt should fail after a couple retries
|
38
|
-
@shell.
|
35
|
+
@shell.should_receive(:exec_cmd).exactly(3).times.and_raise(Mixlib::ShellOut::ShellCommandFailed)
|
39
36
|
expect { @vagrant.halt({ :retry_wait_in_seconds => 0 }) }.to raise_error(Mixlib::ShellOut::ShellCommandFailed)
|
40
37
|
end
|
41
38
|
end
|
42
39
|
|
43
40
|
describe 'up' do
|
44
|
-
it 'should up vagrant' do
|
45
|
-
@shell.
|
46
|
-
|
47
|
-
|
41
|
+
it 'should up vagrant with a timeout of 7200 seconds' do
|
42
|
+
@shell.should_receive(:exec_cmd).with('vagrant up', 7200)
|
43
|
+
@vagrant.up()
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should up vagrant and specify the provider if not virtualbox' do
|
47
|
+
@vagrant = DaptivChefCI::VagrantDriver.new(@shell, @basebox_builder_factory, :my_custom_provider)
|
48
|
+
@shell.should_receive(:exec_cmd).with('vagrant up --provider=my_custom_provider', 7200)
|
48
49
|
@vagrant.up()
|
49
50
|
end
|
50
51
|
end
|
51
|
-
|
52
|
+
|
52
53
|
describe 'provision' do
|
53
|
-
it 'should provision vagrant' do
|
54
|
-
@shell.
|
55
|
-
expect(cmd).to eq('vagrant provision')
|
56
|
-
end
|
54
|
+
it 'should provision vagrant with a timeout of 7200 seconds' do
|
55
|
+
@shell.should_receive(:exec_cmd).with('vagrant provision', 7200)
|
57
56
|
@vagrant.provision()
|
58
57
|
end
|
59
58
|
end
|
60
59
|
|
61
60
|
describe 'reload' do
|
62
|
-
it 'should reload vagrant' do
|
63
|
-
@shell.
|
64
|
-
expect(cmd).to eq('vagrant reload')
|
65
|
-
end
|
61
|
+
it 'should reload vagrant with a timeout of 180 seconds' do
|
62
|
+
@shell.should_receive(:exec_cmd).with('vagrant reload', 180)
|
66
63
|
@vagrant.reload()
|
67
64
|
end
|
68
65
|
end
|
69
66
|
|
67
|
+
describe 'package' do
|
68
|
+
it 'should default to virtualbox and base_dir to current working dir' do
|
69
|
+
builder = double('builder').as_null_object
|
70
|
+
@basebox_builder_factory.should_receive(:create).with(@shell, :virtualbox, Dir.pwd).and_return(builder)
|
71
|
+
@vagrant.package()
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should use the specified provider' do
|
75
|
+
builder = double('builder').as_null_object
|
76
|
+
@vagrant = DaptivChefCI::VagrantDriver.new(@shell, @basebox_builder_factory, :vmware_fusion)
|
77
|
+
@basebox_builder_factory.should_receive(:create).with(@shell, :vmware_fusion, Dir.pwd).and_return(builder)
|
78
|
+
@vagrant.package()
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should use the specified base_dir' do
|
82
|
+
builder = double('builder').as_null_object
|
83
|
+
@basebox_builder_factory.should_receive(:create).with(@shell, :virtualbox, '/Users/admin/mybox').and_return(builder)
|
84
|
+
@vagrant.package({ :base_dir => '/Users/admin/mybox' })
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should default box_name to directory name' do
|
88
|
+
builder = mock('builder')
|
89
|
+
builder.should_receive(:build).with('mybox.box')
|
90
|
+
@basebox_builder_factory.stub(:create).and_return(builder)
|
91
|
+
@vagrant.package({ :base_dir => '/Users/admin/mybox' })
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should ensure box name ends with .box' do
|
95
|
+
builder = mock('builder')
|
96
|
+
builder.should_receive(:build).with('mybox.box')
|
97
|
+
@basebox_builder_factory.stub(:create).and_return(builder)
|
98
|
+
@vagrant.package({ :box_name => 'mybox' })
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
70
102
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'daptiv-chef-ci/virtualbox_basebox_builder'
|
2
|
+
require 'daptiv-chef-ci/logger'
|
3
|
+
|
4
|
+
describe DaptivChefCI::VirtualBoxBaseBoxBuilder, :integration => true do
|
5
|
+
|
6
|
+
#Note- This test requires you have
|
7
|
+
# 1. the dotnetframework cookbook cloned to ~/src/dotnetframework
|
8
|
+
# 2. From ~/src/dotnetframework previously ran: vagrant up
|
9
|
+
# 3. vagrant halt
|
10
|
+
|
11
|
+
describe 'build' do
|
12
|
+
it 'should build a VBox Vagrant base box' do
|
13
|
+
base_dir = "#{ENV['HOME']}/src/dotnetframework"
|
14
|
+
builder = DaptivChefCI::VirtualBoxBaseBoxBuilder.new(base_dir, DaptivChefCI::Shell.new())
|
15
|
+
builder.build('dotnettest-vbox.box')
|
16
|
+
expect(File.exists?("#{base_dir}/dotnettest-vbox.box"))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'mocha/api'
|
2
1
|
require 'daptiv-chef-ci/virtualbox_driver'
|
3
2
|
require 'daptiv-chef-ci/logger'
|
4
3
|
|
@@ -14,16 +13,16 @@ describe DaptivChefCI::VirtualBoxDriver, :unit => true do
|
|
14
13
|
@shell = mock()
|
15
14
|
@vbox = DaptivChefCI::VirtualBoxDriver.new(@shell)
|
16
15
|
|
17
|
-
@shell.
|
16
|
+
@shell.should_receive(:exec_cmd).with('vboxmanage list runningvms').and_return(boxes)
|
18
17
|
|
19
|
-
@shell.
|
20
|
-
@shell.
|
18
|
+
@shell.should_receive(:exec_cmd).with('vboxmanage controlvm "aspnet_1372120179" poweroff').once()
|
19
|
+
@shell.should_receive(:exec_cmd).with('vboxmanage unregistervm "aspnet_1372120179"').once()
|
21
20
|
|
22
|
-
@shell.
|
23
|
-
@shell.
|
21
|
+
@shell.should_receive(:exec_cmd).with('vboxmanage controlvm "aspnet_1379346156" poweroff').once()
|
22
|
+
@shell.should_receive(:exec_cmd).with('vboxmanage unregistervm "aspnet_1379346156"').once()
|
24
23
|
|
25
|
-
@shell.
|
26
|
-
@shell.
|
24
|
+
@shell.should_receive(:exec_cmd).with('vboxmanage controlvm "python_1372120178" poweroff').never()
|
25
|
+
@shell.should_receive(:exec_cmd).with('vboxmanage unregistervm "python_1372120178"').never()
|
27
26
|
|
28
27
|
@vbox.cleanup_vms('aspnet')
|
29
28
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'daptiv-chef-ci/vmware_basebox_builder'
|
2
|
+
require 'daptiv-chef-ci/logger'
|
3
|
+
|
4
|
+
describe DaptivChefCI::VMwareBaseBoxBuilder, :integration => true do
|
5
|
+
|
6
|
+
#Note- This test requires you have
|
7
|
+
# 1. the dotnetframework cookbook cloned to ~/src/dotnetframework
|
8
|
+
# 2. From ~/src/dotnetframework previously ran: vagrant up --provider vmware_fusion
|
9
|
+
# 3. vagrant halt
|
10
|
+
|
11
|
+
describe 'build' do
|
12
|
+
it 'should build a VMware Vagrant base box' do
|
13
|
+
base_dir = "#{ENV['HOME']}/src/dotnetframework"
|
14
|
+
builder = DaptivChefCI::VMwareBaseBoxBuilder.new(base_dir)
|
15
|
+
builder.build('dotnettest-vmware.box')
|
16
|
+
expect(File.exists?("#{base_dir}/dotnettest-vmware.box"))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: daptiv-chef-ci
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: log4r
|
@@ -107,38 +107,6 @@ dependencies:
|
|
107
107
|
- - ~>
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: 2.12.1
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
name: simplecov
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
|
-
requirements:
|
115
|
-
- - ! '>='
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - ! '>='
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: '0'
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: mocha
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
|
-
requirements:
|
131
|
-
- - ~>
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: 0.14.0
|
134
|
-
type: :development
|
135
|
-
prerelease: false
|
136
|
-
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
|
-
requirements:
|
139
|
-
- - ~>
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version: 0.14.0
|
142
110
|
description: Vagrant automation for CI
|
143
111
|
email:
|
144
112
|
- sneal@daptiv.com
|
@@ -148,22 +116,29 @@ extra_rdoc_files: []
|
|
148
116
|
files:
|
149
117
|
- daptiv-chef-ci.gemspec
|
150
118
|
- Gemfile
|
119
|
+
- lib/daptiv-chef-ci/basebox_builder_factory.rb
|
151
120
|
- lib/daptiv-chef-ci/logger.rb
|
152
121
|
- lib/daptiv-chef-ci/shell.rb
|
153
122
|
- lib/daptiv-chef-ci/vagrant_driver.rb
|
154
123
|
- lib/daptiv-chef-ci/vagrant_task.rb
|
124
|
+
- lib/daptiv-chef-ci/virtualbox_basebox_builder.rb
|
155
125
|
- lib/daptiv-chef-ci/virtualbox_driver.rb
|
126
|
+
- lib/daptiv-chef-ci/vmware_basebox_builder.rb
|
156
127
|
- pkg/daptiv-chef-ci-0.0.1.gem
|
157
128
|
- pkg/daptiv-chef-ci-0.0.2.gem
|
158
129
|
- pkg/daptiv-chef-ci-0.0.3.gem
|
159
130
|
- pkg/daptiv-chef-ci-0.0.4.gem
|
160
131
|
- pkg/daptiv-chef-ci-0.0.5.gem
|
132
|
+
- pkg/daptiv-chef-ci-0.0.6.gem
|
161
133
|
- Rakefile
|
162
134
|
- README.md
|
135
|
+
- spec/daptiv-chef-ci/basebox_builder_factory_spec.rb
|
163
136
|
- spec/daptiv-chef-ci/logger_spec.rb
|
164
137
|
- spec/daptiv-chef-ci/shell_spec.rb
|
165
138
|
- spec/daptiv-chef-ci/vagrant_driver_spec.rb
|
139
|
+
- spec/daptiv-chef-ci/virtualbox_basebox_builder_spec.rb
|
166
140
|
- spec/daptiv-chef-ci/virtualbox_driver_spec.rb
|
141
|
+
- spec/daptiv-chef-ci/vmware_basebox_builder_spec.rb
|
167
142
|
- .gitignore
|
168
143
|
homepage: ''
|
169
144
|
licenses: []
|
@@ -179,7 +154,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
179
154
|
version: '0'
|
180
155
|
segments:
|
181
156
|
- 0
|
182
|
-
hash: -
|
157
|
+
hash: -97595725804922558
|
183
158
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
184
159
|
none: false
|
185
160
|
requirements:
|
@@ -188,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
188
163
|
version: '0'
|
189
164
|
segments:
|
190
165
|
- 0
|
191
|
-
hash: -
|
166
|
+
hash: -97595725804922558
|
192
167
|
requirements: []
|
193
168
|
rubyforge_project:
|
194
169
|
rubygems_version: 1.8.23
|
@@ -196,7 +171,10 @@ signing_key:
|
|
196
171
|
specification_version: 3
|
197
172
|
summary: A small gem to reduce Rake duplication
|
198
173
|
test_files:
|
174
|
+
- spec/daptiv-chef-ci/basebox_builder_factory_spec.rb
|
199
175
|
- spec/daptiv-chef-ci/logger_spec.rb
|
200
176
|
- spec/daptiv-chef-ci/shell_spec.rb
|
201
177
|
- spec/daptiv-chef-ci/vagrant_driver_spec.rb
|
178
|
+
- spec/daptiv-chef-ci/virtualbox_basebox_builder_spec.rb
|
202
179
|
- spec/daptiv-chef-ci/virtualbox_driver_spec.rb
|
180
|
+
- spec/daptiv-chef-ci/vmware_basebox_builder_spec.rb
|