boxgrinder-build 0.4.1 → 0.5.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/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
|