boxgrinder-build 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +7 -0
- data/Manifest +0 -0
- data/Rakefile +11 -0
- data/bin/boxgrinder-build +33 -27
- data/boxgrinder-build.gemspec +38 -0
- data/lib/boxgrinder-build/appliance.rb +32 -41
- data/lib/boxgrinder-build/helpers/appliance-customize-helper.rb +3 -48
- data/lib/boxgrinder-build/helpers/guestfs-helper.rb +98 -12
- data/lib/boxgrinder-build/helpers/linux-helper.rb +69 -0
- data/lib/boxgrinder-build/helpers/package-helper.rb +20 -11
- data/lib/boxgrinder-build/helpers/plugin-helper.rb +32 -32
- data/lib/boxgrinder-build/managers/plugin-manager.rb +98 -0
- data/lib/boxgrinder-build/plugins/base-plugin.rb +70 -17
- data/spec/Rakefile +13 -0
- data/spec/appliance-spec.rb +195 -0
- data/spec/helpers/appliance-customize-helper-spec.rb +30 -0
- data/spec/helpers/guestfs-helper-spec.rb +129 -0
- data/spec/helpers/linux-helper-spec.rb +50 -0
- data/spec/helpers/package-helper-spec.rb +6 -0
- data/spec/helpers/plugin-helper-spec.rb +63 -0
- data/spec/managers/plugin-manager-spec.rb +27 -0
- data/spec/plugins/base-plugin-spec.rb +89 -0
- data/spec/rspec/src/appliances/jeos-f13.appl +27 -0
- metadata +60 -157
- data/docs/examples/appliances/appliances.appl +0 -5
- data/docs/examples/appliances/minimal.appl +0 -9
- data/docs/examples/appliances/mix.appl +0 -8
- data/docs/examples/appliances/packages.appl +0 -13
- data/docs/node-info/pom.xml +0 -31
- data/docs/node-info/src/main/webapp/META-INF/MANIFEST.MF +0 -3
- data/docs/node-info/src/main/webapp/WEB-INF/web.xml +0 -7
- data/docs/node-info/src/main/webapp/index.jsp +0 -70
- data/lib/boxgrinder-build/helpers/rake-helper.rb +0 -71
- data/lib/boxgrinder-build/managers/base-plugin-manager.rb +0 -62
- data/lib/boxgrinder-build/managers/delivery-plugin-manager.rb +0 -39
- data/lib/boxgrinder-build/managers/operating-system-plugin-manager.rb +0 -6
- data/lib/boxgrinder-build/managers/platform-plugin-manager.rb +0 -26
- data/lib/boxgrinder-build/plugins/delivery/base/base-delivery-plugin.rb +0 -43
- data/lib/boxgrinder-build/plugins/delivery/local/local-plugin.rb +0 -57
- data/lib/boxgrinder-build/plugins/delivery/s3/aws-helper.rb +0 -64
- data/lib/boxgrinder-build/plugins/delivery/s3/s3-plugin.rb +0 -190
- data/lib/boxgrinder-build/plugins/delivery/sftp/sftp-plugin.rb +0 -159
- data/lib/boxgrinder-build/plugins/os/base/kickstart.rb +0 -148
- data/lib/boxgrinder-build/plugins/os/base/rhel-based-os-plugin.rb +0 -51
- data/lib/boxgrinder-build/plugins/os/base/rpm-based-os-plugin.rb +0 -134
- data/lib/boxgrinder-build/plugins/os/base/src/appliance.ks.erb +0 -41
- data/lib/boxgrinder-build/plugins/os/base/src/base.repo +0 -4
- data/lib/boxgrinder-build/plugins/os/base/src/motd.init +0 -21
- data/lib/boxgrinder-build/plugins/os/base/validators/rpm-dependency-validator.rb +0 -162
- data/lib/boxgrinder-build/plugins/os/base-operating-system-plugin.rb +0 -37
- data/lib/boxgrinder-build/plugins/os/centos/centos-plugin.rb +0 -52
- data/lib/boxgrinder-build/plugins/os/fedora/fedora-plugin.rb +0 -74
- data/lib/boxgrinder-build/plugins/os/rhel/rhel-plugin.rb +0 -40
- data/lib/boxgrinder-build/plugins/platform/base-platform-plugin.rb +0 -37
- data/lib/boxgrinder-build/plugins/platform/ec2/ec2-plugin.rb +0 -332
- data/lib/boxgrinder-build/plugins/platform/ec2/src/f12/yum.conf +0 -24
- data/lib/boxgrinder-build/plugins/platform/ec2/src/f12-i386-boxgrinder.repo +0 -11
- data/lib/boxgrinder-build/plugins/platform/ec2/src/f12-x86_64-boxgrinder.repo +0 -11
- data/lib/boxgrinder-build/plugins/platform/ec2/src/fstab_32bit +0 -8
- data/lib/boxgrinder-build/plugins/platform/ec2/src/fstab_64bit +0 -8
- data/lib/boxgrinder-build/plugins/platform/ec2/src/ifcfg-eth0 +0 -7
- data/lib/boxgrinder-build/plugins/platform/ec2/src/rc_local +0 -29
- data/lib/boxgrinder-build/plugins/platform/vmware/src/README +0 -42
- data/lib/boxgrinder-build/plugins/platform/vmware/src/base.vmdk +0 -19
- data/lib/boxgrinder-build/plugins/platform/vmware/src/base.vmx +0 -45
- data/lib/boxgrinder-build/plugins/platform/vmware/vmware-plugin.rb +0 -181
- data/lib/boxgrinder-build/validators/appliance-config-parameter-validator.rb +0 -37
- data/lib/boxgrinder-build/validators/appliance-validator.rb +0 -84
- data/lib/boxgrinder-build/validators/config-validator.rb +0 -48
- data/lib/boxgrinder-build/validators/ssh-validator.rb +0 -35
- data/lib/boxgrinder-build/validators/validator.rb +0 -91
@@ -18,22 +18,22 @@
|
|
18
18
|
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
19
19
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
20
20
|
|
21
|
-
require 'boxgrinder-build/managers/
|
22
|
-
require '
|
23
|
-
require 'boxgrinder-build/managers/delivery-plugin-manager'
|
21
|
+
require 'boxgrinder-build/managers/plugin-manager'
|
22
|
+
require 'rubygems'
|
24
23
|
|
25
24
|
module BoxGrinder
|
26
25
|
class PluginHelper
|
27
26
|
def initialize( options = {} )
|
28
|
-
@log
|
27
|
+
@log = options[:log] || Logger.new(STDOUT)
|
28
|
+
@options = options[:options]
|
29
29
|
end
|
30
30
|
|
31
31
|
def load_plugins
|
32
|
-
|
32
|
+
read_and_require
|
33
33
|
|
34
|
-
@os_plugins =
|
35
|
-
@platform_plugins =
|
36
|
-
@delivery_plugins =
|
34
|
+
@os_plugins = PluginManager.instance.plugins[:os]
|
35
|
+
@platform_plugins = PluginManager.instance.plugins[:platform]
|
36
|
+
@delivery_plugins = PluginManager.instance.plugins[:delivery]
|
37
37
|
|
38
38
|
print_plugins( 'os' ) { @os_plugins }
|
39
39
|
print_plugins( 'platform' ) { @platform_plugins }
|
@@ -42,44 +42,44 @@ module BoxGrinder
|
|
42
42
|
self
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
46
|
-
|
47
|
-
|
48
|
-
plugins = yield
|
45
|
+
def parse_plugin_list
|
46
|
+
plugins = []
|
49
47
|
|
50
|
-
@
|
51
|
-
|
52
|
-
|
53
|
-
@log.debug "- plugin for #{plugin.info[:full_name]}."
|
48
|
+
unless @options.plugins.nil?
|
49
|
+
plugins = @options.plugins.gsub('\'', '').gsub('"', '').split(',')
|
50
|
+
plugins.each { |plugin| plugin.chomp!; plugin.strip! }
|
54
51
|
end
|
55
52
|
|
56
|
-
|
53
|
+
plugins
|
57
54
|
end
|
58
55
|
|
59
|
-
def
|
60
|
-
|
56
|
+
def read_and_require
|
57
|
+
plugins = %w(boxgrinder-build-fedora-os-plugin boxgrinder-build-rhel-os-plugin boxgrinder-build-centos-os-plugin boxgrinder-build-ec2-platform-plugin boxgrinder-build-vmware-platform-plugin boxgrinder-build-s3-delivery-plugin boxgrinder-build-sftp-delivery-plugin boxgrinder-build-local-delivery-plugin) + parse_plugin_list
|
58
|
+
|
59
|
+
plugins.flatten.each do |plugin|
|
60
|
+
@log.trace "Requiring plugin '#{plugin}'..."
|
61
61
|
|
62
|
-
|
63
|
-
|
64
|
-
|
62
|
+
begin
|
63
|
+
gem plugin
|
64
|
+
require plugin
|
65
|
+
rescue Gem::LoadError
|
66
|
+
@log.warn "Specified gem: '#{plugin}' wasn't found. Make sure its name is correct, skipping..." unless plugin.match(/^boxgrinder-build-(.*)-plugin/)
|
65
67
|
end
|
66
68
|
end
|
67
|
-
|
68
|
-
true
|
69
69
|
end
|
70
70
|
|
71
|
-
def
|
72
|
-
|
71
|
+
def print_plugins( type )
|
72
|
+
@log.debug "Loading #{type} plugins..."
|
73
|
+
|
74
|
+
plugins = yield
|
73
75
|
|
74
|
-
|
76
|
+
@log.debug "We have #{plugins.size} #{type} plugin(s) registered"
|
75
77
|
|
76
|
-
|
77
|
-
|
78
|
-
file << file
|
79
|
-
end
|
78
|
+
plugins.each do |plugin_name_or_type, plugin_info|
|
79
|
+
@log.debug "- #{plugin_name_or_type} plugin for #{plugin_info[:full_name]}."
|
80
80
|
end
|
81
81
|
|
82
|
-
|
82
|
+
@log.debug "Plugins loaded."
|
83
83
|
end
|
84
84
|
|
85
85
|
attr_reader :os_plugins
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# JBoss, Home of Professional Open Source
|
2
|
+
# Copyright 2009, Red Hat Middleware LLC, and individual contributors
|
3
|
+
# by the @authors tag. See the copyright.txt in the distribution for a
|
4
|
+
# full listing of individual contributors.
|
5
|
+
#
|
6
|
+
# This is free software; you can redistribute it and/or modify it
|
7
|
+
# under the terms of the GNU Lesser General Public License as
|
8
|
+
# published by the Free Software Foundation; either version 2.1 of
|
9
|
+
# the License, or (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This software is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
17
|
+
# License along with this software; if not, write to the Free
|
18
|
+
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
19
|
+
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
20
|
+
|
21
|
+
require 'singleton'
|
22
|
+
|
23
|
+
module BoxGrinder
|
24
|
+
module Plugins
|
25
|
+
def plugin( args )
|
26
|
+
PluginManager.instance.register_plugin( args )
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
include BoxGrinder::Plugins
|
32
|
+
|
33
|
+
# TODO consider removing singleton pattern
|
34
|
+
module BoxGrinder
|
35
|
+
class PluginManager
|
36
|
+
include Singleton
|
37
|
+
|
38
|
+
def initialize
|
39
|
+
@plugins = { :delivery => {}, :os => {}, :platform => {}}
|
40
|
+
end
|
41
|
+
|
42
|
+
def register_plugin( info )
|
43
|
+
validate_plugin_info( info )
|
44
|
+
|
45
|
+
raise "We already have registered plugin for #{info[:name]}." unless @plugins[info[:name]].nil?
|
46
|
+
|
47
|
+
unless info[:types].nil?
|
48
|
+
info[:types].each do |type|
|
49
|
+
@plugins[info[:type]][type] = info
|
50
|
+
end
|
51
|
+
else
|
52
|
+
@plugins[info[:type]][info[:name]] = info
|
53
|
+
end
|
54
|
+
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def validate_plugin_info( info )
|
59
|
+
raise "No name specified for your plugin" if info[:name].nil?
|
60
|
+
raise "No class specified for your plugin" if info[:class].nil?
|
61
|
+
raise "No type specified for your plugin" if info[:type].nil?
|
62
|
+
end
|
63
|
+
|
64
|
+
def initialize_plugin( type, name )
|
65
|
+
plugins = @plugins[type]
|
66
|
+
# this should never happen
|
67
|
+
raise "There are no #{type} plugins." if plugins.nil?
|
68
|
+
plugin_info = plugins[name]
|
69
|
+
raise "There is no #{type} plugin registered for '#{name}' type/name." if plugin_info.nil?
|
70
|
+
|
71
|
+
begin
|
72
|
+
plugin = plugin_info[:class].new
|
73
|
+
rescue => e
|
74
|
+
raise "Error while initializing #{plugin_info[:class]} plugin.", e
|
75
|
+
end
|
76
|
+
|
77
|
+
[ plugin, plugin_info ]
|
78
|
+
end
|
79
|
+
|
80
|
+
def plugin_types( type )
|
81
|
+
types = []
|
82
|
+
|
83
|
+
available_plugins_for_selected_type = @plugins[type]
|
84
|
+
|
85
|
+
unless available_plugins_for_selected_type.nil?
|
86
|
+
available_plugins_for_selected_type.each_value do |info|
|
87
|
+
types << info[:types] unless info[:types].nil?
|
88
|
+
types << info[:name]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
types.flatten
|
93
|
+
end
|
94
|
+
|
95
|
+
attr_reader :plugins
|
96
|
+
attr_accessor :log
|
97
|
+
end
|
98
|
+
end
|
@@ -19,7 +19,10 @@
|
|
19
19
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
20
20
|
|
21
21
|
require 'boxgrinder-core/helpers/exec-helper'
|
22
|
-
require 'boxgrinder-build/helpers/
|
22
|
+
require 'boxgrinder-build/helpers/guestfs-helper'
|
23
|
+
require 'ostruct'
|
24
|
+
require 'openhash/openhash'
|
25
|
+
require 'fileutils'
|
23
26
|
require 'logger'
|
24
27
|
|
25
28
|
module BoxGrinder
|
@@ -31,28 +34,40 @@ module BoxGrinder
|
|
31
34
|
|
32
35
|
@log = options[:log] || Logger.new(STDOUT)
|
33
36
|
@exec_helper = options[:exec_helper] || ExecHelper.new( :log => @log )
|
34
|
-
@plugin_helper = options[:plugin_helper] || PluginHelper.new( :log => @log )
|
35
37
|
|
36
|
-
@
|
37
|
-
@
|
38
|
+
@plugin_info = options[:plugin_info]
|
39
|
+
@previous_plugin_info = options[:previous_plugin_info]
|
38
40
|
|
39
|
-
|
40
|
-
|
41
|
+
@previous_deliverables = options[:previous_deliverables] || {}
|
42
|
+
@plugin_config = {}
|
41
43
|
|
42
|
-
|
44
|
+
@deliverables = OpenHash.new
|
45
|
+
@target_deliverables = OpenHash.new
|
46
|
+
@dir = OpenHash.new
|
43
47
|
|
44
|
-
|
45
|
-
|
46
|
-
end
|
48
|
+
@dir.base = "#{@appliance_config.path.build}/#{@plugin_info[:name]}-plugin"
|
49
|
+
@dir.tmp = "#{@dir.base}/tmp"
|
47
50
|
|
48
|
-
|
51
|
+
@config_file = "#{ENV['HOME']}/.boxgrinder/plugins/#{@plugin_info[:name]}"
|
52
|
+
|
53
|
+
read_plugin_config
|
49
54
|
|
50
55
|
@initialized = true
|
51
56
|
|
57
|
+
after_init
|
58
|
+
|
52
59
|
self
|
53
60
|
end
|
54
61
|
|
55
|
-
|
62
|
+
def register_deliverable( deliverable )
|
63
|
+
raise "You can only register deliverables after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
|
64
|
+
raise "Please specify deliverables as Hash, not #{deliverable.class}." unless deliverable.is_a?(Hash)
|
65
|
+
|
66
|
+
deliverable.each do |name, path|
|
67
|
+
@deliverables[name] = "#{@dir.tmp}/#{path}"
|
68
|
+
@target_deliverables[name] = "#{@dir.base}/#{path}"
|
69
|
+
end
|
70
|
+
end
|
56
71
|
|
57
72
|
def validate_plugin_config(fields = [], doc = nil)
|
58
73
|
more_info = doc.nil? ? '' : "See #{doc} for more info"
|
@@ -60,17 +75,54 @@ module BoxGrinder
|
|
60
75
|
raise "Not valid configuration file for #{info[:name]} plugin. Please create valid '#{@config_file}' file. #{more_info}" if @plugin_config.nil?
|
61
76
|
|
62
77
|
fields.each do |field|
|
63
|
-
raise "Please specify a valid #{field} in plugin configuration file: '#{@config_file}'. #{more_info}" if @plugin_config[field].nil?
|
78
|
+
raise "Please specify a valid '#{field}' key in plugin configuration file: '#{@config_file}'. #{more_info}" if @plugin_config[field].nil?
|
64
79
|
end
|
65
80
|
end
|
66
81
|
|
67
82
|
def execute(args = nil)
|
68
|
-
raise "
|
83
|
+
raise "You can only execute the plugin after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
|
84
|
+
end
|
85
|
+
|
86
|
+
def run( *args )
|
87
|
+
FileUtils.rm_rf @dir.tmp
|
88
|
+
FileUtils.mkdir_p @dir.tmp
|
89
|
+
|
90
|
+
execute( *args )
|
91
|
+
|
92
|
+
after_execute
|
69
93
|
end
|
70
94
|
|
71
95
|
def after_init
|
72
96
|
end
|
73
97
|
|
98
|
+
def after_execute
|
99
|
+
@deliverables.each do |name, path|
|
100
|
+
@log.trace "Moving '#{path}' deliverable to target destination '#{@target_deliverables[name]}'..."
|
101
|
+
FileUtils.mv( path, @target_deliverables[name] )
|
102
|
+
end
|
103
|
+
|
104
|
+
FileUtils.rm_rf @dir.tmp
|
105
|
+
end
|
106
|
+
|
107
|
+
def deliverables_exists?
|
108
|
+
raise "You can only check deliverables after the plugin is initialized, please initialize the plugin using init method." if @initialized.nil?
|
109
|
+
|
110
|
+
exists = true
|
111
|
+
|
112
|
+
@target_deliverables.each_value do |file|
|
113
|
+
unless File.exists?(file)
|
114
|
+
exists = false
|
115
|
+
break
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
exists
|
120
|
+
end
|
121
|
+
|
122
|
+
def deliverables
|
123
|
+
@target_deliverables
|
124
|
+
end
|
125
|
+
|
74
126
|
def set_default_config_value(key, value)
|
75
127
|
@plugin_config[key] = @plugin_config[key].nil? ? value : @plugin_config[key]
|
76
128
|
end
|
@@ -83,14 +135,15 @@ module BoxGrinder
|
|
83
135
|
begin
|
84
136
|
@plugin_config = YAML.load_file(@config_file)
|
85
137
|
rescue
|
86
|
-
raise "An error occurred while reading configuration file #{@config_file} for #{self.class.name}.
|
138
|
+
raise "An error occurred while reading configuration file #{@config_file} for #{self.class.name}. Is it a valid YAML file?"
|
87
139
|
end
|
88
140
|
end
|
89
141
|
|
90
|
-
|
142
|
+
# TODO consider removing this from BasePlugin and moving to another base class
|
143
|
+
def customize( disk_path )
|
91
144
|
raise "Customizing cannot be started until the plugin isn't initialized" if @initialized.nil?
|
92
145
|
|
93
|
-
|
146
|
+
GuestFSHelper.new( disk_path, :log => @log ).customize do |guestfs, guestfs_helper|
|
94
147
|
yield guestfs, guestfs_helper
|
95
148
|
end
|
96
149
|
end
|
data/spec/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
|
4
|
+
desc "Run all examples"
|
5
|
+
Spec::Rake::SpecTask.new(:default) do |t|
|
6
|
+
t.libs.unshift "../../boxgrinder-core/lib"
|
7
|
+
t.libs.unshift "../../boxgrinder-core/spec"
|
8
|
+
|
9
|
+
t.spec_files = FileList['**/*-spec.rb']
|
10
|
+
t.rcov = true
|
11
|
+
t.rcov_opts = ['--exclude', 'spec' ]
|
12
|
+
t.spec_opts = [ '--format', 's']
|
13
|
+
end
|
@@ -0,0 +1,195 @@
|
|
1
|
+
require 'boxgrinder-build/appliance'
|
2
|
+
require 'rspec/rspec-config-helper'
|
3
|
+
require 'rbconfig'
|
4
|
+
require 'ostruct'
|
5
|
+
|
6
|
+
module BoxGrinder
|
7
|
+
describe Appliance do
|
8
|
+
include RSpecConfigHelper
|
9
|
+
|
10
|
+
before(:all) do
|
11
|
+
@arch = RbConfig::CONFIG['host_cpu']
|
12
|
+
end
|
13
|
+
|
14
|
+
def prepare_appliance( options = OpenStruct.new )
|
15
|
+
options.name = 'boxgrinder'
|
16
|
+
options.version = '1.0'
|
17
|
+
|
18
|
+
@appliance = Appliance.new( "#{File.dirname( __FILE__ )}/rspec/src/appliances/jeos-f13.appl", :log => Logger.new('/dev/null'), :options => options )
|
19
|
+
end
|
20
|
+
|
21
|
+
before(:each) do
|
22
|
+
prepare_appliance
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should create only base image" do
|
26
|
+
validator = mock(ApplianceConfigValidator)
|
27
|
+
validator.should_receive(:validate)
|
28
|
+
|
29
|
+
ApplianceConfigValidator.should_receive(:new).with(any_args).and_return(validator)
|
30
|
+
|
31
|
+
plugin_manager_first_call = mock('PluginManagerOne')
|
32
|
+
plugin_manager_first_call.should_receive(:plugins).and_return({})
|
33
|
+
|
34
|
+
PluginManager.should_receive(:instance).and_return(plugin_manager_first_call)
|
35
|
+
|
36
|
+
os_plugin = mock('OS Plugin')
|
37
|
+
os_plugin.should_receive(:init)
|
38
|
+
os_plugin.should_receive(:deliverables_exists?).and_return(false)
|
39
|
+
os_plugin.should_receive(:run)
|
40
|
+
os_plugin.should_receive(:deliverables).and_return({ :disk => 'abc'})
|
41
|
+
|
42
|
+
plugin_manager_second_call = mock('PluginManagerTwo')
|
43
|
+
plugin_manager_second_call.should_receive(:initialize_plugin).with(:os, :fedora).and_return([ os_plugin, {:class => Appliance, :type => :os, :name => :fedora, :full_name => "Fedora", :versions => ["11", "12", "13", "rawhide"] } ] )
|
44
|
+
|
45
|
+
PluginManager.should_receive(:instance).and_return(plugin_manager_second_call)
|
46
|
+
|
47
|
+
@appliance.create
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should build appliance and convert it to VMware format" do
|
51
|
+
prepare_appliance( OpenStruct.new({ :platform => :vmware }) )
|
52
|
+
|
53
|
+
validator = mock(ApplianceConfigValidator)
|
54
|
+
validator.should_receive(:validate)
|
55
|
+
|
56
|
+
ApplianceConfigValidator.should_receive(:new).with(any_args).and_return(validator)
|
57
|
+
|
58
|
+
os_plugin_output = {}
|
59
|
+
|
60
|
+
@appliance.should_receive(:execute_os_plugin).and_return(os_plugin_output)
|
61
|
+
|
62
|
+
plugin_manager_first_call = mock('PluginManagerOne')
|
63
|
+
plugin_manager_first_call.should_receive(:plugins).and_return({})
|
64
|
+
|
65
|
+
PluginManager.should_receive(:instance).and_return(plugin_manager_first_call)
|
66
|
+
|
67
|
+
platform_plugin = mock('VMware Plugin')
|
68
|
+
platform_plugin.should_receive(:init)
|
69
|
+
platform_plugin.should_receive(:deliverables_exists?).and_return(false)
|
70
|
+
platform_plugin.should_receive(:run)
|
71
|
+
platform_plugin.should_receive(:deliverables).and_return({ :disk => 'abc'})
|
72
|
+
|
73
|
+
plugin_manager_second_call = mock('PluginManagerTwo')
|
74
|
+
plugin_manager_second_call.should_receive(:initialize_plugin).with(:platform, :vmware).and_return([ platform_plugin, {:class => Appliance, :type => :platform, :name => :vmware, :full_name => "VMware"} ] )
|
75
|
+
|
76
|
+
PluginManager.should_receive(:instance).and_return(plugin_manager_second_call)
|
77
|
+
|
78
|
+
@appliance.create
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should build appliance, convert it to EC2 format and deliver it using S3 ami type" do
|
82
|
+
prepare_appliance( OpenStruct.new({ :platform => :ec2, :delivery => :ami }) )
|
83
|
+
|
84
|
+
validator = mock(ApplianceConfigValidator)
|
85
|
+
validator.should_receive(:validate)
|
86
|
+
|
87
|
+
ApplianceConfigValidator.should_receive(:new).with(any_args).and_return(validator)
|
88
|
+
|
89
|
+
os_plugin_output = { :abc => 'def'}
|
90
|
+
platform_plugin_output = { :abc => 'def'}
|
91
|
+
|
92
|
+
@appliance.should_receive(:execute_os_plugin).and_return(os_plugin_output)
|
93
|
+
@appliance.should_receive(:execute_platform_plugin).and_return(platform_plugin_output)
|
94
|
+
|
95
|
+
plugin_manager_first_call = mock('PluginManagerOne')
|
96
|
+
plugin_manager_first_call.should_receive(:plugins).and_return({})
|
97
|
+
|
98
|
+
PluginManager.should_receive(:instance).and_return(plugin_manager_first_call)
|
99
|
+
|
100
|
+
delivery_plugin = mock('S3 Plugin')
|
101
|
+
delivery_plugin.should_receive(:init)
|
102
|
+
delivery_plugin.should_receive(:run).with(:ami)
|
103
|
+
|
104
|
+
plugin_manager_second_call = mock('PluginManagerTwo')
|
105
|
+
plugin_manager_second_call.should_receive(:initialize_plugin).with(:delivery, :ami).and_return([ delivery_plugin, {:class => Appliance, :type => :delivery, :name => :s3, :full_name => "Amazon Simple Storage Service (Amazon S3)", :types => [:s3, :cloudfront, :ami]} ] )
|
106
|
+
|
107
|
+
PluginManager.should_receive(:instance).and_return(plugin_manager_second_call)
|
108
|
+
|
109
|
+
@appliance.create
|
110
|
+
end
|
111
|
+
it "should build appliance, convert it to vmware format and deliver it using sftp ami type" do
|
112
|
+
prepare_appliance( OpenStruct.new({ :platform => :vmware, :delivery => :sftp }) )
|
113
|
+
|
114
|
+
validator = mock(ApplianceConfigValidator)
|
115
|
+
validator.should_receive(:validate)
|
116
|
+
|
117
|
+
ApplianceConfigValidator.should_receive(:new).with(any_args).and_return(validator)
|
118
|
+
|
119
|
+
os_plugin_output = { :abc => 'def'}
|
120
|
+
platform_plugin_output = { :abc => 'def'}
|
121
|
+
|
122
|
+
@appliance.should_receive(:execute_os_plugin).and_return(os_plugin_output)
|
123
|
+
@appliance.should_receive(:execute_platform_plugin).and_return(platform_plugin_output)
|
124
|
+
|
125
|
+
plugin_manager_first_call = mock('PluginManagerOne')
|
126
|
+
plugin_manager_first_call.should_receive(:plugins).and_return({})
|
127
|
+
|
128
|
+
PluginManager.should_receive(:instance).and_return(plugin_manager_first_call)
|
129
|
+
|
130
|
+
delivery_plugin = mock('S3 Plugin')
|
131
|
+
delivery_plugin.should_receive(:init)
|
132
|
+
delivery_plugin.should_receive(:run).with(no_args)
|
133
|
+
|
134
|
+
plugin_manager_second_call = mock('PluginManagerTwo')
|
135
|
+
plugin_manager_second_call.should_receive(:initialize_plugin).with(:delivery, :sftp).and_return([ delivery_plugin, {:class => Appliance, :type => :delivery, :name => :sftp, :full_name => "SSH File Transfer Protocol"} ] )
|
136
|
+
|
137
|
+
PluginManager.should_receive(:instance).and_return(plugin_manager_second_call)
|
138
|
+
|
139
|
+
@appliance.create
|
140
|
+
end
|
141
|
+
|
142
|
+
it "should remove previous build when force is specified" do
|
143
|
+
prepare_appliance( OpenStruct.new( :force => true ) )
|
144
|
+
|
145
|
+
validator = mock(ApplianceConfigValidator)
|
146
|
+
validator.should_receive(:validate)
|
147
|
+
|
148
|
+
ApplianceConfigValidator.should_receive(:new).with(any_args).and_return(validator)
|
149
|
+
|
150
|
+
@appliance.should_receive(:execute_os_plugin).and_return(nil)
|
151
|
+
@appliance.should_receive(:execute_platform_plugin).and_return(nil)
|
152
|
+
@appliance.should_receive(:execute_delivery_plugin).and_return(nil)
|
153
|
+
|
154
|
+
FileUtils.should_receive(:rm_rf).with("build/appliances/#{@arch}/fedora/13/jeos-f13")
|
155
|
+
|
156
|
+
@appliance.create
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should not execute plugins when deliverables exists" do
|
160
|
+
prepare_appliance( OpenStruct.new({ :platform => :vmware }) )
|
161
|
+
|
162
|
+
validator = mock(ApplianceConfigValidator)
|
163
|
+
validator.should_receive(:validate)
|
164
|
+
|
165
|
+
ApplianceConfigValidator.should_receive(:new).with(any_args).and_return(validator)
|
166
|
+
|
167
|
+
os_plugin = mock('OS Plugin')
|
168
|
+
os_plugin.should_receive(:init)
|
169
|
+
os_plugin.should_receive(:deliverables_exists?).and_return(true)
|
170
|
+
os_plugin.should_receive(:deliverables).and_return({ :disk => 'abc'})
|
171
|
+
|
172
|
+
plugin_manager_first_call = mock('PluginManagerOne')
|
173
|
+
plugin_manager_first_call.should_receive(:plugins).and_return({})
|
174
|
+
|
175
|
+
PluginManager.should_receive(:instance).and_return(plugin_manager_first_call)
|
176
|
+
|
177
|
+
plugin_manager_second_call = mock('PluginManagerTwo')
|
178
|
+
plugin_manager_second_call.should_receive(:initialize_plugin).with(:os, :fedora).and_return([ os_plugin, {:class => Appliance, :type => :os, :name => :fedora, :full_name => "Fedora", :versions => ["11", "12", "13", "rawhide"] } ] )
|
179
|
+
|
180
|
+
PluginManager.should_receive(:instance).and_return(plugin_manager_second_call)
|
181
|
+
|
182
|
+
platform_plugin = mock('Platform Plugin')
|
183
|
+
platform_plugin.should_receive(:init)
|
184
|
+
platform_plugin.should_receive(:deliverables_exists?).and_return(true)
|
185
|
+
platform_plugin.should_receive(:deliverables).and_return({ :disk => 'def'})
|
186
|
+
|
187
|
+
platform_plugin_manager_second_call = mock('PlatformPluginManagerOne')
|
188
|
+
platform_plugin_manager_second_call.should_receive(:initialize_plugin).with(:platform, :vmware).and_return([ platform_plugin, {:class => Appliance, :type => :platform, :name => :vmware, :full_name => "VMware"} ] )
|
189
|
+
|
190
|
+
PluginManager.should_receive(:instance).and_return(platform_plugin_manager_second_call)
|
191
|
+
|
192
|
+
@appliance.create
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'boxgrinder-build/helpers/appliance-customize-helper'
|
2
|
+
require 'rspec/rspec-config-helper'
|
3
|
+
|
4
|
+
module BoxGrinder
|
5
|
+
describe ApplianceCustomizeHelper do
|
6
|
+
include RSpecConfigHelper
|
7
|
+
|
8
|
+
before(:each) do
|
9
|
+
@helper = ApplianceCustomizeHelper.new(generate_config, generate_appliance_config, 'a/disk', :log => Logger.new('/dev/null'))
|
10
|
+
|
11
|
+
@log = @helper.instance_variable_get(:@log)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should properly prepare guestfs for customization" do
|
15
|
+
|
16
|
+
guestfs_helper = mock('guestfs_helper')
|
17
|
+
guestfs = mock('guestfs')
|
18
|
+
guestfs_helper.should_receive(:run).and_return(guestfs_helper)
|
19
|
+
guestfs_helper.should_receive(:guestfs).and_return(guestfs)
|
20
|
+
guestfs_helper.should_receive(:clean_close)
|
21
|
+
|
22
|
+
GuestFSHelper.should_receive(:new).with('a/disk', :log => @log ).and_return(guestfs_helper)
|
23
|
+
|
24
|
+
@helper.customize do |gf, gf_helper|
|
25
|
+
gf_helper.should == guestfs_helper
|
26
|
+
gf.should == guestfs
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|