boxgrinder-build 0.6.5 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +9 -0
- data/Rakefile +1 -1
- data/boxgrinder-build.gemspec +6 -6
- data/lib/boxgrinder-build/appliance.rb +27 -17
- data/lib/boxgrinder-build/helpers/augeas-helper.rb +1 -0
- data/lib/boxgrinder-build/helpers/guestfs-helper.rb +26 -4
- data/lib/boxgrinder-build/helpers/image-helper.rb +1 -1
- data/lib/boxgrinder-build/helpers/package-helper.rb +11 -10
- data/lib/boxgrinder-build/helpers/plugin-helper.rb +1 -2
- data/lib/boxgrinder-build/plugins/base-plugin.rb +25 -24
- data/rubygem-boxgrinder-build.spec +11 -3
- data/spec/appliance-spec.rb +86 -44
- data/spec/helpers/augeas-helper-spec.rb +4 -0
- data/spec/helpers/guestfs-helper-spec.rb +35 -1
- data/spec/helpers/image-helper-spec.rb +1 -1
- data/spec/helpers/plugin-helper-spec.rb +5 -9
- data/spec/rspec/src/appliances/jeos-f13.ks +23 -0
- metadata +9 -8
data/CHANGELOG
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
|
2
|
+
v0.7.0
|
3
|
+
|
4
|
+
* [BGBUILD-119] Fix SElinux issues on EC2 appliances
|
5
|
+
* [BGBUILD-118] Enable SElinux in guestfs
|
6
|
+
* [BGBUILD-80] VMware .tgz Bundle Should Expand Into Subdirectory, Not Current Directory
|
7
|
+
* [BGBUILD-113] Allow to specify supported file formats for operating system plugin
|
8
|
+
* [BGBUILD-73] Add support for kickstart files
|
9
|
+
|
1
10
|
v0.6.5
|
2
11
|
|
3
12
|
* Release bump required for plugins
|
data/Rakefile
CHANGED
@@ -26,7 +26,7 @@ Echoe.new("boxgrinder-build") do |p|
|
|
26
26
|
p.summary = "A tool for creating appliances from simple plain text files for various virtual environments."
|
27
27
|
p.url = "http://www.jboss.org/boxgrinder"
|
28
28
|
p.email = "info@boxgrinder.org"
|
29
|
-
p.runtime_dependencies = ["commander ~>4.0.3", "boxgrinder-core ~>0.1.
|
29
|
+
p.runtime_dependencies = ["commander ~>4.0.3", "boxgrinder-core ~>0.1.5"]
|
30
30
|
end
|
31
31
|
|
32
32
|
desc "Run all tests"
|
data/boxgrinder-build.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{boxgrinder-build}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.7.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Marek Goldmann"]
|
9
|
-
s.date = %q{2010-12-
|
9
|
+
s.date = %q{2010-12-17}
|
10
10
|
s.default_executable = %q{boxgrinder-build}
|
11
11
|
s.description = %q{A tool for creating appliances from simple plain text files for various virtual environments.}
|
12
12
|
s.email = %q{info@boxgrinder.org}
|
13
13
|
s.executables = ["boxgrinder-build"]
|
14
14
|
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "bin/boxgrinder-build", "lib/boxgrinder-build/appliance.rb", "lib/boxgrinder-build/helpers/appliance-customize-helper.rb", "lib/boxgrinder-build/helpers/augeas-helper.rb", "lib/boxgrinder-build/helpers/guestfs-helper.rb", "lib/boxgrinder-build/helpers/image-helper.rb", "lib/boxgrinder-build/helpers/linux-helper.rb", "lib/boxgrinder-build/helpers/package-helper.rb", "lib/boxgrinder-build/helpers/plugin-helper.rb", "lib/boxgrinder-build/managers/plugin-manager.rb", "lib/boxgrinder-build/plugins/base-plugin.rb"]
|
15
|
-
s.files = ["CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "bin/boxgrinder-build", "boxgrinder-build.gemspec", "lib/boxgrinder-build/appliance.rb", "lib/boxgrinder-build/helpers/appliance-customize-helper.rb", "lib/boxgrinder-build/helpers/augeas-helper.rb", "lib/boxgrinder-build/helpers/guestfs-helper.rb", "lib/boxgrinder-build/helpers/image-helper.rb", "lib/boxgrinder-build/helpers/linux-helper.rb", "lib/boxgrinder-build/helpers/package-helper.rb", "lib/boxgrinder-build/helpers/plugin-helper.rb", "lib/boxgrinder-build/managers/plugin-manager.rb", "lib/boxgrinder-build/plugins/base-plugin.rb", "rubygem-boxgrinder-build.spec", "spec/Rakefile", "spec/appliance-spec.rb", "spec/helpers/appliance-customize-helper-spec.rb", "spec/helpers/augeas-helper-spec.rb", "spec/helpers/guestfs-helper-spec.rb", "spec/helpers/image-helper-spec.rb", "spec/helpers/linux-helper-spec.rb", "spec/helpers/package-helper-spec.rb", "spec/helpers/plugin-helper-spec.rb", "spec/managers/plugin-manager-spec.rb", "spec/plugins/base-plugin-spec.rb", "spec/rspec/src/appliances/jeos-f13.appl"]
|
15
|
+
s.files = ["CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "bin/boxgrinder-build", "boxgrinder-build.gemspec", "lib/boxgrinder-build/appliance.rb", "lib/boxgrinder-build/helpers/appliance-customize-helper.rb", "lib/boxgrinder-build/helpers/augeas-helper.rb", "lib/boxgrinder-build/helpers/guestfs-helper.rb", "lib/boxgrinder-build/helpers/image-helper.rb", "lib/boxgrinder-build/helpers/linux-helper.rb", "lib/boxgrinder-build/helpers/package-helper.rb", "lib/boxgrinder-build/helpers/plugin-helper.rb", "lib/boxgrinder-build/managers/plugin-manager.rb", "lib/boxgrinder-build/plugins/base-plugin.rb", "rubygem-boxgrinder-build.spec", "spec/Rakefile", "spec/appliance-spec.rb", "spec/helpers/appliance-customize-helper-spec.rb", "spec/helpers/augeas-helper-spec.rb", "spec/helpers/guestfs-helper-spec.rb", "spec/helpers/image-helper-spec.rb", "spec/helpers/linux-helper-spec.rb", "spec/helpers/package-helper-spec.rb", "spec/helpers/plugin-helper-spec.rb", "spec/managers/plugin-manager-spec.rb", "spec/plugins/base-plugin-spec.rb", "spec/rspec/src/appliances/jeos-f13.appl", "spec/rspec/src/appliances/jeos-f13.ks"]
|
16
16
|
s.homepage = %q{http://www.jboss.org/boxgrinder}
|
17
17
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Boxgrinder-build", "--main", "README"]
|
18
18
|
s.require_paths = ["lib"]
|
@@ -26,13 +26,13 @@ Gem::Specification.new do |s|
|
|
26
26
|
|
27
27
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
28
28
|
s.add_runtime_dependency(%q<commander>, ["~> 4.0.3"])
|
29
|
-
s.add_runtime_dependency(%q<boxgrinder-core>, ["~> 0.1.
|
29
|
+
s.add_runtime_dependency(%q<boxgrinder-core>, ["~> 0.1.5"])
|
30
30
|
else
|
31
31
|
s.add_dependency(%q<commander>, ["~> 4.0.3"])
|
32
|
-
s.add_dependency(%q<boxgrinder-core>, ["~> 0.1.
|
32
|
+
s.add_dependency(%q<boxgrinder-core>, ["~> 0.1.5"])
|
33
33
|
end
|
34
34
|
else
|
35
35
|
s.add_dependency(%q<commander>, ["~> 4.0.3"])
|
36
|
-
s.add_dependency(%q<boxgrinder-core>, ["~> 0.1.
|
36
|
+
s.add_dependency(%q<boxgrinder-core>, ["~> 0.1.5"])
|
37
37
|
end
|
38
38
|
end
|
@@ -29,32 +29,45 @@ module BoxGrinder
|
|
29
29
|
class Appliance
|
30
30
|
|
31
31
|
def initialize(appliance_definition_file, options = {})
|
32
|
-
@config
|
32
|
+
@config = Config.new
|
33
33
|
@appliance_definition_file = appliance_definition_file
|
34
|
-
@log
|
35
|
-
@options
|
34
|
+
@log = options[:log] || Logger.new(STDOUT)
|
35
|
+
@options = options[:options]
|
36
36
|
|
37
|
-
@config.name
|
38
|
-
@config.version.version
|
39
|
-
@config.version.release
|
37
|
+
@config.name = @options.name
|
38
|
+
@config.version.version = @options.version
|
39
|
+
@config.version.release = nil
|
40
40
|
end
|
41
41
|
|
42
42
|
def read_definition
|
43
|
-
|
44
|
-
|
43
|
+
begin
|
44
|
+
# first try to read as appliance definition file
|
45
|
+
appliance_configs, appliance_config = ApplianceHelper.new(:log => @log).read_definitions(@appliance_definition_file)
|
46
|
+
rescue
|
47
|
+
# then try to read OS plugin specific format
|
48
|
+
PluginManager.instance.plugins[:os].each_value do |info|
|
49
|
+
plugin = info[:class].new
|
50
|
+
appliance_config = plugin.read_file(@appliance_definition_file) if plugin.respond_to?(:read_file)
|
51
|
+
break unless appliance_config.nil?
|
52
|
+
end
|
53
|
+
appliance_configs = [appliance_config]
|
54
|
+
end
|
45
55
|
|
46
|
-
|
56
|
+
raise "Couldn't read appliance definition file: #{File.basename(@appliance_definition_file)}" if appliance_config.nil?
|
57
|
+
|
58
|
+
appliance_config_helper = ApplianceConfigHelper.new(appliance_configs)
|
59
|
+
@appliance_config = appliance_config_helper.merge(appliance_config.clone.init_arch).initialize_paths
|
47
60
|
end
|
48
61
|
|
49
62
|
def validate_definition
|
50
63
|
ApplianceConfigValidator.new(@appliance_config).validate
|
51
64
|
|
52
|
-
|
65
|
+
abort "No operating system plugins installed. Install one or more operating system plugin. See http://community.jboss.org/docs/DOC-15081 and http://community.jboss.org/docs/DOC-15214 for more info" if PluginManager.instance.plugins[:os].empty?
|
53
66
|
|
54
67
|
os_plugin = PluginManager.instance.plugins[:os][@appliance_config.os.name.to_sym]
|
55
68
|
|
56
|
-
|
57
|
-
|
69
|
+
abort "Not supported operating system selected: #{@appliance_config.os.name}. Make sure you have installed right operating system plugin, see http://community.jboss.org/docs/DOC-15214. Supported OSes are: #{PluginManager.instance.plugins[:os].keys.join(", ")}" if os_plugin.nil?
|
70
|
+
abort "Not supported operating system version selected: #{@appliance_config.os.version}. Supported versions are: #{os_plugin[:versions].join(", ")}" unless @appliance_config.os.version.nil? or os_plugin[:versions].include?(@appliance_config.os.version)
|
58
71
|
end
|
59
72
|
|
60
73
|
def remove_old_builds
|
@@ -66,10 +79,7 @@ module BoxGrinder
|
|
66
79
|
def execute_plugin_chain
|
67
80
|
@log.info "Building '#{@appliance_config.name}' appliance for #{@appliance_config.hardware.arch} architecture."
|
68
81
|
|
69
|
-
|
70
|
-
platform_plugin_output = execute_platform_plugin(base_plugin_output)
|
71
|
-
|
72
|
-
execute_delivery_plugin(platform_plugin_output)
|
82
|
+
execute_delivery_plugin(execute_platform_plugin(execute_os_plugin))
|
73
83
|
end
|
74
84
|
|
75
85
|
def create
|
@@ -96,7 +106,7 @@ module BoxGrinder
|
|
96
106
|
end
|
97
107
|
|
98
108
|
@log.debug "Executing operating system plugin for #{@appliance_config.os.name}..."
|
99
|
-
os_plugin.run
|
109
|
+
os_plugin.run(@appliance_definition_file)
|
100
110
|
@log.debug "Operating system plugin executed."
|
101
111
|
|
102
112
|
{:deliverables => os_plugin.deliverables, :plugin_info => os_plugin_info}
|
@@ -25,8 +25,8 @@ require 'rbconfig'
|
|
25
25
|
module BoxGrinder
|
26
26
|
class SilencerProxy
|
27
27
|
def initialize(o, destination)
|
28
|
-
@o
|
29
|
-
@destination
|
28
|
+
@o = o
|
29
|
+
@destination = destination
|
30
30
|
end
|
31
31
|
|
32
32
|
def method_missing(m, *args, &block)
|
@@ -82,7 +82,7 @@ module BoxGrinder
|
|
82
82
|
class GuestFSHelper
|
83
83
|
def initialize(raw_disk, options = {})
|
84
84
|
@raw_disk = raw_disk
|
85
|
-
@log
|
85
|
+
@log = options[:log] || Logger.new(STDOUT)
|
86
86
|
|
87
87
|
@partitions = {}
|
88
88
|
end
|
@@ -145,8 +145,11 @@ module BoxGrinder
|
|
145
145
|
@guestfs.set_verbose(1)
|
146
146
|
@guestfs.set_trace(1)
|
147
147
|
|
148
|
+
@log.trace "Enabling SElinux support in guestfs..."
|
149
|
+
@guestfs.set_selinux(1)
|
150
|
+
|
148
151
|
unless hw_virtualization_available?
|
149
|
-
qemu_wrapper =
|
152
|
+
qemu_wrapper = (RbConfig::CONFIG['host_cpu'].eql?('x86_64') ? "/usr/bin/qemu-system-x86_64" : "/usr/bin/qemu")
|
150
153
|
|
151
154
|
if File.exists?(qemu_wrapper)
|
152
155
|
@log.trace "Setting QEMU wrapper to #{qemu_wrapper}..."
|
@@ -176,11 +179,30 @@ module BoxGrinder
|
|
176
179
|
mount_partitions
|
177
180
|
end
|
178
181
|
|
182
|
+
load_selinux_policy
|
183
|
+
|
179
184
|
@log.trace "Guestfs launched."
|
180
185
|
|
181
186
|
self
|
182
187
|
end
|
183
188
|
|
189
|
+
def load_selinux_policy
|
190
|
+
return unless @guestfs.exists('/etc/sysconfig/selinux') != 0
|
191
|
+
|
192
|
+
@log.trace "Loading SElinux policy..."
|
193
|
+
|
194
|
+
@guestfs.aug_init("/", 32)
|
195
|
+
@guestfs.aug_rm("/augeas/load//incl[. != '/etc/sysconfig/selinux']")
|
196
|
+
@guestfs.aug_load
|
197
|
+
|
198
|
+
selinux = @guestfs.aug_get("/files/etc/sysconfig/selinux/SELINUX")
|
199
|
+
|
200
|
+
@guestfs.sh("/usr/sbin/load_policy") if !selinux.nil? and !selinux.eql?('disabled')
|
201
|
+
@guestfs.aug_close
|
202
|
+
|
203
|
+
@log.trace "SElinux policy loaded."
|
204
|
+
end
|
205
|
+
|
184
206
|
def clean_close
|
185
207
|
@log.trace "Closing guestfs..."
|
186
208
|
|
@@ -117,7 +117,7 @@ module BoxGrinder
|
|
117
117
|
|
118
118
|
def sync_files(from_dir, to_dir)
|
119
119
|
@log.debug "Syncing files between #{from_dir} and #{to_dir}..."
|
120
|
-
@exec_helper.execute "rsync -
|
120
|
+
@exec_helper.execute "rsync -Xura #{from_dir}/* #{to_dir}"
|
121
121
|
@log.debug "Sync finished."
|
122
122
|
end
|
123
123
|
|
@@ -27,25 +27,26 @@ module BoxGrinder
|
|
27
27
|
@exec_helper = options[:exec_helper] || ExecHelper.new({:log => @log})
|
28
28
|
end
|
29
29
|
|
30
|
-
def package(
|
31
|
-
files = []
|
32
|
-
|
33
|
-
deliverables.each_value do |file|
|
34
|
-
files << File.basename(file)
|
35
|
-
end
|
36
|
-
|
30
|
+
def package(dir, package, type = :tar)
|
37
31
|
if File.exists?(package)
|
38
32
|
@log.info "Package of #{type} type for #{@appliance_config.name} appliance already exists, skipping."
|
39
33
|
return package
|
40
34
|
end
|
41
35
|
|
42
|
-
FileUtils.mkdir_p(File.dirname(package))
|
43
|
-
|
44
36
|
@log.info "Packaging #{@appliance_config.name} appliance to #{type}..."
|
45
37
|
|
46
38
|
case type
|
47
39
|
when :tar
|
48
|
-
|
40
|
+
package_name = File.basename(package, '.tgz')
|
41
|
+
symlink = "#{File.dirname(package)}/#{package_name}"
|
42
|
+
|
43
|
+
FileUtils.ln_s(File.expand_path(dir), symlink)
|
44
|
+
|
45
|
+
Dir.chdir(File.dirname(package)) do
|
46
|
+
@exec_helper.execute "tar -hcvzf #{package_name}.tgz #{package_name}"
|
47
|
+
end
|
48
|
+
|
49
|
+
FileUtils.rm(symlink)
|
49
50
|
else
|
50
51
|
raise "Only tar format is currently supported."
|
51
52
|
end
|
@@ -58,9 +58,8 @@ module BoxGrinder
|
|
58
58
|
@log.trace "Requiring plugin '#{plugin}'..."
|
59
59
|
|
60
60
|
begin
|
61
|
-
gem plugin
|
62
61
|
require plugin
|
63
|
-
rescue
|
62
|
+
rescue LoadError
|
64
63
|
@log.warn "Specified gem: '#{plugin}' wasn't found. Make sure its name is correct, skipping..." unless plugin.match(/^boxgrinder-build-(.*)-plugin/)
|
65
64
|
end
|
66
65
|
end
|
@@ -27,34 +27,35 @@ require 'logger'
|
|
27
27
|
|
28
28
|
module BoxGrinder
|
29
29
|
class BasePlugin
|
30
|
-
def
|
31
|
-
@
|
32
|
-
@appliance_config = appliance_config
|
33
|
-
@options = options
|
34
|
-
|
35
|
-
@log = options[:log] || Logger.new(STDOUT)
|
36
|
-
@exec_helper = options[:exec_helper] || ExecHelper.new(:log => @log)
|
37
|
-
@image_helper = options[:image_helper] || ImageHelper.new(@config, @appliance_config, :log => @log)
|
38
|
-
|
39
|
-
@plugin_info = options[:plugin_info]
|
40
|
-
@previous_plugin_info = options[:previous_plugin_info]
|
30
|
+
def initialize
|
31
|
+
@plugin_config = {}
|
41
32
|
|
42
|
-
@
|
43
|
-
@
|
33
|
+
@deliverables = OpenCascade.new
|
34
|
+
@supported_oses = OpenCascade.new
|
35
|
+
@target_deliverables = OpenCascade.new
|
36
|
+
@dir = OpenCascade.new
|
37
|
+
end
|
44
38
|
|
45
|
-
|
46
|
-
@
|
47
|
-
@
|
48
|
-
@
|
39
|
+
def init(config, appliance_config, options = {})
|
40
|
+
@config = config
|
41
|
+
@appliance_config = appliance_config
|
42
|
+
@options = options
|
43
|
+
@log = options[:log] || Logger.new(STDOUT)
|
44
|
+
@exec_helper = options[:exec_helper] || ExecHelper.new(:log => @log)
|
45
|
+
@image_helper = options[:image_helper] || ImageHelper.new(@config, @appliance_config, :log => @log)
|
46
|
+
@plugin_info = options[:plugin_info]
|
47
|
+
@previous_plugin_info = options[:previous_plugin_info]
|
48
|
+
@previous_deliverables = options[:previous_deliverables] || {}
|
49
49
|
|
50
|
-
@dir.base
|
51
|
-
@dir.tmp
|
50
|
+
@dir.base = "#{@appliance_config.path.build}/#{@plugin_info[:name]}-plugin"
|
51
|
+
@dir.tmp = "#{@dir.base}/tmp"
|
52
52
|
|
53
|
-
@config_file
|
53
|
+
@config_file = "#{ENV['HOME']}/.boxgrinder/plugins/#{@plugin_info[:name]}"
|
54
54
|
|
55
55
|
read_plugin_config
|
56
56
|
|
57
|
-
@
|
57
|
+
@move_deliverables = true
|
58
|
+
@initialized = true
|
58
59
|
|
59
60
|
after_init
|
60
61
|
|
@@ -66,8 +67,8 @@ module BoxGrinder
|
|
66
67
|
raise "Please specify deliverables as Hash, not #{deliverable.class}." unless deliverable.is_a?(Hash)
|
67
68
|
|
68
69
|
deliverable.each do |name, path|
|
69
|
-
@deliverables[name]
|
70
|
-
@target_deliverables[name]
|
70
|
+
@deliverables[name] = "#{@dir.tmp}/#{path}"
|
71
|
+
@target_deliverables[name] = "#{@dir.base}/#{path}"
|
71
72
|
end
|
72
73
|
end
|
73
74
|
|
@@ -134,7 +135,7 @@ module BoxGrinder
|
|
134
135
|
@deliverables.each do |name, path|
|
135
136
|
@log.trace "Moving '#{path}' deliverable to target destination '#{@target_deliverables[name]}'..."
|
136
137
|
FileUtils.mv(path, @target_deliverables[name])
|
137
|
-
end
|
138
|
+
end if @move_deliverables
|
138
139
|
|
139
140
|
FileUtils.rm_rf @dir.tmp
|
140
141
|
end
|
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Summary: A tool for creating appliances from simple plain text files
|
7
7
|
Name: rubygem-%{gemname}
|
8
|
-
Version: 0.
|
8
|
+
Version: 0.7.0
|
9
9
|
Release: 1%{?dist}
|
10
10
|
Group: Development/Languages
|
11
11
|
License: LGPLv3+
|
@@ -14,14 +14,14 @@ Source0: http://rubygems.org/gems/%{gemname}-%{version}.gem
|
|
14
14
|
|
15
15
|
Requires: ruby(abi) = %{rubyabi}
|
16
16
|
Requires: rubygem(commander)
|
17
|
-
Requires: rubygem(boxgrinder-core)
|
17
|
+
Requires: rubygem(boxgrinder-core) >= 0.1.5
|
18
18
|
Requires: ruby-libguestfs
|
19
19
|
Requires: parted
|
20
20
|
Requires: e2fsprogs
|
21
21
|
|
22
22
|
BuildRequires: rubygem(rake)
|
23
23
|
BuildRequires: rubygem(rspec)
|
24
|
-
BuildRequires: rubygem(boxgrinder-core)
|
24
|
+
BuildRequires: rubygem(boxgrinder-core) >= 0.1.5
|
25
25
|
BuildRequires: rubygem(echoe)
|
26
26
|
BuildRequires: ruby-libguestfs
|
27
27
|
|
@@ -85,6 +85,14 @@ popd
|
|
85
85
|
%{gemdir}/doc/%{gemname}-%{version}
|
86
86
|
|
87
87
|
%changelog
|
88
|
+
* Fri Dec 17 2010 <mgoldman@redhat.com> - 0.7.0-1
|
89
|
+
- Updated to upstream version: 0.7.0
|
90
|
+
- [BGBUILD-113] Allow to specify supported file formats for operating system plugin
|
91
|
+
- [BGBUILD-73] Add support for kickstart files
|
92
|
+
- [BGBUILD-80] VMware .tgz Bundle Should Expand Into Subdirectory, Not Current Directory
|
93
|
+
- [BGBUILD-118] Enable SElinux in guestfs
|
94
|
+
- [BGBUILD-119] Fix SElinux issues on EC2 appliances
|
95
|
+
|
88
96
|
* Thu Dec 02 2010 <mgoldman@redhat.com> - 0.6.5-1
|
89
97
|
- Updated to new upstream release: 0.6.5
|
90
98
|
|
data/spec/appliance-spec.rb
CHANGED
@@ -23,18 +23,18 @@ require 'logger'
|
|
23
23
|
|
24
24
|
module BoxGrinder
|
25
25
|
describe Appliance do
|
26
|
-
def prepare_appliance(options = OpenStruct.new)
|
27
|
-
options.name
|
26
|
+
def prepare_appliance(options = OpenStruct.new, definition_file = "#{File.dirname(__FILE__)}/rspec/src/appliances/jeos-f13.appl")
|
27
|
+
options.name = 'boxgrinder'
|
28
28
|
options.version = '1.0'
|
29
29
|
|
30
|
-
@options
|
31
|
-
@log
|
30
|
+
@options = options
|
31
|
+
@log = Logger.new('/dev/null')
|
32
32
|
|
33
33
|
@plugin_manager = mock(PluginManager)
|
34
34
|
|
35
35
|
PluginManager.stub!(:instance).and_return(@plugin_manager)
|
36
36
|
|
37
|
-
@appliance = Appliance.new(
|
37
|
+
@appliance = Appliance.new(definition_file, :log => @log, :options => @options)
|
38
38
|
end
|
39
39
|
|
40
40
|
def prepare_appliance_config
|
@@ -51,13 +51,13 @@ module BoxGrinder
|
|
51
51
|
OpenCascade.new({
|
52
52
|
:partitions =>
|
53
53
|
{
|
54
|
-
'/'
|
54
|
+
'/' => {'size' => 2},
|
55
55
|
'/home' => {'size' => 3},
|
56
56
|
},
|
57
|
-
:arch
|
58
|
-
:base_arch
|
59
|
-
:cpus
|
60
|
-
:memory
|
57
|
+
:arch => 'i686',
|
58
|
+
:base_arch => 'i386',
|
59
|
+
:cpus => 1,
|
60
|
+
:memory => 256,
|
61
61
|
})
|
62
62
|
)
|
63
63
|
|
@@ -100,27 +100,84 @@ module BoxGrinder
|
|
100
100
|
@appliance.create
|
101
101
|
end
|
102
102
|
|
103
|
-
|
104
|
-
|
103
|
+
describe ".validate_definition" do
|
104
|
+
it "should read definition with standard appliance definition file" do
|
105
|
+
prepare_appliance
|
106
|
+
|
107
|
+
appliance_config = ApplianceConfig.new
|
108
|
+
|
109
|
+
appliance_helper = mock(ApplianceHelper)
|
110
|
+
appliance_helper.should_receive(:read_definitions).with("#{File.dirname(__FILE__)}/rspec/src/appliances/jeos-f13.appl").and_return([{}, appliance_config])
|
111
|
+
|
112
|
+
ApplianceHelper.should_receive(:new).with(:log => @log).and_return(appliance_helper)
|
113
|
+
|
114
|
+
appliance_config_helper = mock(ApplianceConfigHelper)
|
115
|
+
|
116
|
+
appliance_config.should_receive(:clone).and_return(appliance_config)
|
117
|
+
appliance_config.should_receive(:init_arch).and_return(appliance_config)
|
118
|
+
appliance_config.should_receive(:initialize_paths).and_return(appliance_config)
|
119
|
+
|
120
|
+
appliance_config_helper.should_receive(:merge).with(appliance_config).and_return(appliance_config)
|
121
|
+
|
122
|
+
ApplianceConfigHelper.should_receive(:new).with({}).and_return(appliance_config_helper)
|
123
|
+
|
124
|
+
@appliance.read_definition
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should read definition with kickstart appliance definition file" do
|
128
|
+
prepare_appliance(OpenStruct.new, "#{File.dirname(__FILE__)}/rspec/src/appliances/jeos-f13.ks")
|
129
|
+
|
130
|
+
appliance_config = ApplianceConfig.new
|
131
|
+
|
132
|
+
appliance_helper = mock(ApplianceHelper)
|
133
|
+
appliance_helper.should_receive(:read_definitions).with("#{File.dirname(__FILE__)}/rspec/src/appliances/jeos-f13.ks").and_raise("Unknown format")
|
134
|
+
|
135
|
+
clazz = mock('PluginClass')
|
105
136
|
|
106
|
-
|
137
|
+
plugin_manager = mock(PluginManager)
|
138
|
+
plugin_manager.should_receive(:plugins).and_return({:os => {:fedora => {:class => clazz, :type => :os, :name => :fedora, :full_name => "Fedora", :versions => ["11", "12", "13", "14", "rawhide"]}}})
|
139
|
+
|
140
|
+
plugin = mock('Plugin')
|
141
|
+
plugin.should_receive(:respond_to?).with(:read_file).and_return(true)
|
142
|
+
plugin.should_receive(:read_file).and_return(appliance_config)
|
143
|
+
|
144
|
+
clazz.should_receive(:new).and_return(plugin)
|
145
|
+
|
146
|
+
PluginManager.should_receive(:instance).and_return(plugin_manager)
|
147
|
+
|
148
|
+
ApplianceHelper.should_receive(:new).with(:log => @log).and_return(appliance_helper)
|
149
|
+
|
150
|
+
appliance_config_helper = mock(ApplianceConfigHelper)
|
151
|
+
|
152
|
+
appliance_config.should_receive(:clone).and_return(appliance_config)
|
153
|
+
appliance_config.should_receive(:init_arch).and_return(appliance_config)
|
154
|
+
appliance_config.should_receive(:initialize_paths).and_return(appliance_config)
|
155
|
+
|
156
|
+
appliance_config_helper.should_receive(:merge).with(appliance_config).and_return(appliance_config)
|
107
157
|
|
108
|
-
|
109
|
-
appliance_helper.should_receive(:read_definitions).with("#{File.dirname(__FILE__)}/rspec/src/appliances/jeos-f13.appl").and_return([{}, appliance_config])
|
158
|
+
ApplianceConfigHelper.should_receive(:new).with([appliance_config]).and_return(appliance_config_helper)
|
110
159
|
|
111
|
-
|
160
|
+
@appliance.read_definition
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should read definition with kickstart appliance definition file and fail because there was no plugin able to read .ks" do
|
164
|
+
prepare_appliance(OpenStruct.new, "#{File.dirname(__FILE__)}/rspec/src/appliances/jeos-f13.ks")
|
112
165
|
|
113
|
-
|
166
|
+
appliance_helper = mock(ApplianceHelper)
|
167
|
+
appliance_helper.should_receive(:read_definitions).with("#{File.dirname(__FILE__)}/rspec/src/appliances/jeos-f13.ks").and_raise("Unknown format")
|
168
|
+
|
169
|
+
plugin_manager = mock(PluginManager)
|
170
|
+
plugin_manager.should_receive(:plugins).and_return({:os => {}})
|
114
171
|
|
115
|
-
appliance_config.should_receive(:clone).and_return(appliance_config)
|
116
|
-
appliance_config.should_receive(:init_arch).and_return(appliance_config)
|
117
|
-
appliance_config.should_receive(:initialize_paths).and_return(appliance_config)
|
118
172
|
|
119
|
-
|
173
|
+
PluginManager.should_receive(:instance).and_return(plugin_manager)
|
120
174
|
|
121
|
-
|
175
|
+
ApplianceHelper.should_receive(:new).with(:log => @log).and_return(appliance_helper)
|
122
176
|
|
123
|
-
|
177
|
+
lambda {
|
178
|
+
@appliance.read_definition
|
179
|
+
}.should raise_error("Couldn't read appliance definition file: jeos-f13.ks")
|
180
|
+
end
|
124
181
|
end
|
125
182
|
|
126
183
|
describe ".validate_definition" do
|
@@ -133,8 +190,6 @@ module BoxGrinder
|
|
133
190
|
|
134
191
|
ApplianceConfigValidator.should_receive(:new).with(@appliance_config).and_return(appliance_config_validator)
|
135
192
|
|
136
|
-
puts @appliance_config
|
137
|
-
|
138
193
|
plugin_manager = mock(PluginManager)
|
139
194
|
plugin_manager.stub!(:plugins).and_return({:os => {:fedora => {:type => :os, :name => :fedora, :full_name => "Fedora", :versions => ["11", "12", "13", "14", "rawhide"]}}})
|
140
195
|
|
@@ -157,12 +212,9 @@ module BoxGrinder
|
|
157
212
|
|
158
213
|
PluginManager.stub!(:instance).and_return(plugin_manager)
|
159
214
|
|
160
|
-
|
215
|
+
lambda {
|
161
216
|
@appliance.validate_definition
|
162
|
-
|
163
|
-
rescue => e
|
164
|
-
e.message.should == "No operating system plugins installed. Install one or more operating system plugin. See http://community.jboss.org/docs/DOC-15081 and http://community.jboss.org/docs/DOC-15214 for more info"
|
165
|
-
end
|
217
|
+
}.should raise_error(SystemExit, "No operating system plugins installed. Install one or more operating system plugin. See http://community.jboss.org/docs/DOC-15081 and http://community.jboss.org/docs/DOC-15214 for more info")
|
166
218
|
end
|
167
219
|
|
168
220
|
it "should validate definition and fail because no supported operating system plugins is installed" do
|
@@ -174,19 +226,14 @@ module BoxGrinder
|
|
174
226
|
|
175
227
|
ApplianceConfigValidator.should_receive(:new).with(@appliance_config).and_return(appliance_config_validator)
|
176
228
|
|
177
|
-
puts @appliance_config
|
178
|
-
|
179
229
|
plugin_manager = mock(PluginManager)
|
180
230
|
plugin_manager.stub!(:plugins).and_return({:os => {:rhel => {}}})
|
181
231
|
|
182
232
|
PluginManager.stub!(:instance).and_return(plugin_manager)
|
183
233
|
|
184
|
-
|
234
|
+
lambda {
|
185
235
|
@appliance.validate_definition
|
186
|
-
|
187
|
-
rescue => e
|
188
|
-
e.message.should == "Not supported operating system selected: fedora. Make sure you have installed right operating system plugin, see http://community.jboss.org/docs/DOC-15214. Supported OSes are: rhel"
|
189
|
-
end
|
236
|
+
}.should raise_error(SystemExit, "Not supported operating system selected: fedora. Make sure you have installed right operating system plugin, see http://community.jboss.org/docs/DOC-15214. Supported OSes are: rhel")
|
190
237
|
end
|
191
238
|
|
192
239
|
it "should validate definition and fail because no supported operating system version plugins is installed" do
|
@@ -198,19 +245,14 @@ module BoxGrinder
|
|
198
245
|
|
199
246
|
ApplianceConfigValidator.should_receive(:new).with(@appliance_config).and_return(appliance_config_validator)
|
200
247
|
|
201
|
-
puts @appliance_config
|
202
|
-
|
203
248
|
plugin_manager = mock(PluginManager)
|
204
249
|
plugin_manager.stub!(:plugins).and_return({:os => {:fedora => {:type => :os, :name => :fedora, :full_name => "Fedora", :versions => ["xyz"]}}})
|
205
250
|
|
206
251
|
PluginManager.stub!(:instance).and_return(plugin_manager)
|
207
252
|
|
208
|
-
|
253
|
+
lambda {
|
209
254
|
@appliance.validate_definition
|
210
|
-
|
211
|
-
rescue => e
|
212
|
-
e.message.should == "Not supported operating system version selected: 11. Supported versions are: xyz"
|
213
|
-
end
|
255
|
+
}.should raise_error(SystemExit, "Not supported operating system version selected: 11. Supported versions are: xyz")
|
214
256
|
end
|
215
257
|
end
|
216
258
|
|
@@ -44,6 +44,7 @@ module BoxGrinder
|
|
44
44
|
@guestfs.should_receive(:aug_load)
|
45
45
|
@guestfs.should_receive(:aug_set).with("/files/etc/ssh/sshd_config/UseDNS", "no")
|
46
46
|
@guestfs.should_receive(:aug_save)
|
47
|
+
@guestfs.should_receive(:aug_close)
|
47
48
|
|
48
49
|
@helper.edit do
|
49
50
|
set('/etc/ssh/sshd_config', 'UseDNS', 'no')
|
@@ -61,6 +62,7 @@ module BoxGrinder
|
|
61
62
|
@guestfs.should_receive(:aug_set).with("/files/etc/ssh/sshd_config/UseDNS", "no")
|
62
63
|
@guestfs.should_receive(:aug_set).with("/files/etc/sysconfig/selinux/SELINUX", "permissive")
|
63
64
|
@guestfs.should_receive(:aug_save)
|
65
|
+
@guestfs.should_receive(:aug_close)
|
64
66
|
|
65
67
|
@helper.edit do
|
66
68
|
set('/etc/ssh/sshd_config', 'UseDNS', 'no')
|
@@ -78,6 +80,7 @@ module BoxGrinder
|
|
78
80
|
@guestfs.should_receive(:aug_load)
|
79
81
|
@guestfs.should_receive(:aug_set).with("/files/etc/ssh/sshd_config/UseDNS", "no")
|
80
82
|
@guestfs.should_receive(:aug_save)
|
83
|
+
@guestfs.should_receive(:aug_close)
|
81
84
|
|
82
85
|
@helper.edit do
|
83
86
|
set('/etc/ssh/sshd_config', 'UseDNS', 'no')
|
@@ -94,6 +97,7 @@ module BoxGrinder
|
|
94
97
|
@guestfs.should_receive(:aug_load)
|
95
98
|
@guestfs.should_receive(:aug_set).with("/files/etc/ssh/sshd_config/UseDNS", "no")
|
96
99
|
@guestfs.should_receive(:aug_save)
|
100
|
+
@guestfs.should_receive(:aug_close)
|
97
101
|
|
98
102
|
@helper.edit do
|
99
103
|
set('/etc/ssh/sshd_config', 'UseDNS', 'no')
|
@@ -26,7 +26,7 @@ module BoxGrinder
|
|
26
26
|
end
|
27
27
|
|
28
28
|
before(:each) do
|
29
|
-
@log
|
29
|
+
@log = Logger.new('/dev/null')
|
30
30
|
@helper = GuestFSHelper.new('a/raw/disk', :log => @log)
|
31
31
|
end
|
32
32
|
|
@@ -35,8 +35,10 @@ module BoxGrinder
|
|
35
35
|
guetfs.should_receive(:set_append).with('noapic')
|
36
36
|
guetfs.should_receive(:set_verbose)
|
37
37
|
guetfs.should_receive(:set_trace)
|
38
|
+
guetfs.should_receive(:set_selinux).with(1)
|
38
39
|
|
39
40
|
@helper.should_receive(:hw_virtualization_available?).and_return(true)
|
41
|
+
@helper.should_receive(:load_selinux_policy)
|
40
42
|
|
41
43
|
guetfs.should_receive(:set_qemu).with(wrapper) unless wrapper.nil?
|
42
44
|
guetfs.should_receive(:add_drive).with('a/raw/disk')
|
@@ -190,5 +192,37 @@ module BoxGrinder
|
|
190
192
|
@helper.hw_virtualization_available?.should == false
|
191
193
|
end
|
192
194
|
end
|
195
|
+
|
196
|
+
describe ".load_selinux_policy" do
|
197
|
+
it "should load SElinux policy for SElinux enabled guests" do
|
198
|
+
guestfs = mock('Guestfs')
|
199
|
+
@helper.instance_variable_set(:@guestfs, guestfs)
|
200
|
+
|
201
|
+
guestfs.should_receive(:exists).with('/etc/sysconfig/selinux').and_return(1)
|
202
|
+
guestfs.should_receive(:aug_init).with("/", 32)
|
203
|
+
guestfs.should_receive(:aug_rm).with("/augeas/load//incl[. != '/etc/sysconfig/selinux']")
|
204
|
+
guestfs.should_receive(:aug_load)
|
205
|
+
guestfs.should_receive(:aug_get).with("/files/etc/sysconfig/selinux/SELINUX").and_return('permissive')
|
206
|
+
guestfs.should_receive(:sh).with("/usr/sbin/load_policy")
|
207
|
+
guestfs.should_receive(:aug_close)
|
208
|
+
|
209
|
+
@helper.load_selinux_policy
|
210
|
+
end
|
211
|
+
|
212
|
+
it "should not load SElinux policy for SElinux disabled guests" do
|
213
|
+
guestfs = mock('Guestfs')
|
214
|
+
@helper.instance_variable_set(:@guestfs, guestfs)
|
215
|
+
|
216
|
+
guestfs.should_receive(:exists).with('/etc/sysconfig/selinux').and_return(1)
|
217
|
+
guestfs.should_receive(:aug_init).with("/", 32)
|
218
|
+
guestfs.should_receive(:aug_rm).with("/augeas/load//incl[. != '/etc/sysconfig/selinux']")
|
219
|
+
guestfs.should_receive(:aug_load)
|
220
|
+
guestfs.should_receive(:aug_get).with("/files/etc/sysconfig/selinux/SELINUX").and_return('disabled')
|
221
|
+
guestfs.should_not_receive(:sh).with("/usr/sbin/load_policy")
|
222
|
+
guestfs.should_receive(:aug_close)
|
223
|
+
|
224
|
+
@helper.load_selinux_policy
|
225
|
+
end
|
226
|
+
end
|
193
227
|
end
|
194
228
|
end
|
@@ -149,7 +149,7 @@ module BoxGrinder
|
|
149
149
|
|
150
150
|
|
151
151
|
it "should sync files" do
|
152
|
-
@exec_helper.should_receive(:execute).with("rsync -
|
152
|
+
@exec_helper.should_receive(:execute).with("rsync -Xura from_dir/* to_dir")
|
153
153
|
|
154
154
|
@helper.sync_files('from_dir', 'to_dir')
|
155
155
|
end
|
@@ -27,7 +27,7 @@ module BoxGrinder
|
|
27
27
|
end
|
28
28
|
|
29
29
|
before(:each) do
|
30
|
-
@plugin_helper = PluginHelper.new(
|
30
|
+
@plugin_helper = PluginHelper.new(:options => OpenStruct.new)
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should parse plugin list and return empty array when no plugins are provided" do
|
@@ -35,23 +35,22 @@ module BoxGrinder
|
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should parse plugin list with double quotes" do
|
38
|
-
@plugin_helper = PluginHelper.new(
|
38
|
+
@plugin_helper = PluginHelper.new(:options => OpenStruct.new(:plugins => '"abc,def"'))
|
39
39
|
@plugin_helper.parse_plugin_list.should == ['abc', 'def']
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should parse plugin list with single quotes" do
|
43
|
-
@plugin_helper = PluginHelper.new(
|
43
|
+
@plugin_helper = PluginHelper.new(:options => OpenStruct.new(:plugins => "'abc,def'"))
|
44
44
|
@plugin_helper.parse_plugin_list.should == ['abc', 'def']
|
45
45
|
end
|
46
46
|
|
47
47
|
it "should parse plugin list with single quotes and clean up it" do
|
48
|
-
@plugin_helper = PluginHelper.new(
|
48
|
+
@plugin_helper = PluginHelper.new(:options => OpenStruct.new(:plugins => "' abc , def'"))
|
49
49
|
@plugin_helper.parse_plugin_list.should == ['abc', 'def']
|
50
50
|
end
|
51
51
|
|
52
52
|
it "should require default plugins" do
|
53
53
|
@plugin_array.each do |plugin|
|
54
|
-
@plugin_helper.should_receive(:gem).ordered.with(plugin)
|
55
54
|
@plugin_helper.should_receive(:require).once.with(plugin)
|
56
55
|
end
|
57
56
|
|
@@ -59,16 +58,13 @@ module BoxGrinder
|
|
59
58
|
end
|
60
59
|
|
61
60
|
it "should read plugins specified in command line" do
|
62
|
-
@plugin_helper = PluginHelper.new(
|
61
|
+
@plugin_helper = PluginHelper.new(:options => OpenStruct.new(:plugins => 'abc,def'))
|
63
62
|
|
64
63
|
@plugin_array.each do |plugin|
|
65
|
-
@plugin_helper.should_receive(:gem).ordered.with(plugin)
|
66
64
|
@plugin_helper.should_receive(:require).once.with(plugin)
|
67
65
|
end
|
68
66
|
|
69
|
-
@plugin_helper.should_receive(:gem).ordered.with('abc')
|
70
67
|
@plugin_helper.should_receive(:require).ordered.with('abc')
|
71
|
-
@plugin_helper.should_receive(:gem).ordered.with('def')
|
72
68
|
@plugin_helper.should_receive(:require).ordered.with('def')
|
73
69
|
|
74
70
|
@plugin_helper.read_and_require
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# bg_os_name: fedora
|
2
|
+
# bg_os_version: 13
|
3
|
+
|
4
|
+
lang en_US.UTF-8
|
5
|
+
keyboard us
|
6
|
+
timezone US/Eastern
|
7
|
+
auth --useshadow --enablemd5
|
8
|
+
selinux --permissive
|
9
|
+
firewall --disabled
|
10
|
+
bootloader --timeout=1 --append="acpi=force scsi_mod.scan=sync"
|
11
|
+
firstboot --disabled
|
12
|
+
network --bootproto=dhcp --device=eth0 --onboot=on
|
13
|
+
services --enabled=network
|
14
|
+
rootpw boxgrinder
|
15
|
+
|
16
|
+
part / --size 2048 --fstype ext4 --ondisk sda
|
17
|
+
|
18
|
+
repo --name=fedora-14-base --cost=40 --mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-13&arch=x86_64
|
19
|
+
repo --name=fedora-14-updates --cost=41 --mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=updates-released-f13&arch=x86_64
|
20
|
+
|
21
|
+
%packages --excludedocs --nobase
|
22
|
+
@core
|
23
|
+
%end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: boxgrinder-build
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 7
|
9
|
+
- 0
|
10
|
+
version: 0.7.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Marek Goldmann
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-12-
|
18
|
+
date: 2010-12-17 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -42,12 +42,12 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
hash:
|
45
|
+
hash: 17
|
46
46
|
segments:
|
47
47
|
- 0
|
48
48
|
- 1
|
49
|
-
-
|
50
|
-
version: 0.1.
|
49
|
+
- 5
|
50
|
+
version: 0.1.5
|
51
51
|
type: :runtime
|
52
52
|
version_requirements: *id002
|
53
53
|
description: A tool for creating appliances from simple plain text files for various virtual environments.
|
@@ -102,6 +102,7 @@ files:
|
|
102
102
|
- spec/managers/plugin-manager-spec.rb
|
103
103
|
- spec/plugins/base-plugin-spec.rb
|
104
104
|
- spec/rspec/src/appliances/jeos-f13.appl
|
105
|
+
- spec/rspec/src/appliances/jeos-f13.ks
|
105
106
|
has_rdoc: true
|
106
107
|
homepage: http://www.jboss.org/boxgrinder
|
107
108
|
licenses: []
|