boxgrinder-core 0.0.22 → 0.1.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 -29
- data/boxgrinder-core.gemspec +5 -5
- data/lib/boxgrinder-core/helpers/appliance-config-helper.rb +54 -8
- data/lib/boxgrinder-core/helpers/appliance-helper.rb +9 -6
- data/lib/boxgrinder-core/models/appliance-config.rb +5 -2
- data/lib/boxgrinder-core/models/config.rb +2 -1
- data/lib/boxgrinder-core/validators/appliance-config-validator.rb +5 -6
- data/spec/Rakefile +1 -1
- data/spec/helpers/appliance-config-helper-spec.rb +261 -0
- data/spec/helpers/appliance-helper-spec.rb +56 -0
- data/spec/helpers/exec-helper-spec.rb +2 -2
- data/spec/rspec/ls/one +0 -0
- data/spec/rspec/ls/two +0 -0
- metadata +13 -4
data/CHANGELOG
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
|
|
2
|
+
v0.1.0
|
|
3
|
+
|
|
4
|
+
* [BGBUILD-58] Add ability to substitute custom variables in appliance definition file
|
|
5
|
+
* [BGBUILD-52] Wrong post section inheritance
|
|
6
|
+
* [BGBUILD-48] Hint about missing plugins
|
|
7
|
+
* [BGBUILD-46] Allow building 32 bit images on 64 bit arch
|
|
8
|
+
|
|
2
9
|
v0.0.22
|
|
3
10
|
|
|
4
11
|
* [BGBUILD-44] ExecHelper should raise exception if execution fails
|
data/Manifest
CHANGED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
CHANGELOG
|
|
2
|
-
LICENSE
|
|
3
|
-
Manifest
|
|
4
|
-
README
|
|
5
|
-
Rakefile
|
|
6
|
-
lib/boxgrinder-core.rb
|
|
7
|
-
lib/boxgrinder-core/defaults.rb
|
|
8
|
-
lib/boxgrinder-core/helpers/appliance-config-helper.rb
|
|
9
|
-
lib/boxgrinder-core/helpers/appliance-helper.rb
|
|
10
|
-
lib/boxgrinder-core/helpers/exec-helper.rb
|
|
11
|
-
lib/boxgrinder-core/helpers/log-helper.rb
|
|
12
|
-
lib/boxgrinder-core/helpers/queue-helper.rb
|
|
13
|
-
lib/boxgrinder-core/models/appliance-config.rb
|
|
14
|
-
lib/boxgrinder-core/models/config.rb
|
|
15
|
-
lib/boxgrinder-core/models/task.rb
|
|
16
|
-
lib/boxgrinder-core/validators/appliance-config-validator.rb
|
|
17
|
-
lib/boxgrinder-core/validators/errors.rb
|
|
18
|
-
lib/openhash/openhash.rb
|
|
19
|
-
spec/Rakefile
|
|
20
|
-
spec/helpers/appliance-config-helper-spec.rb
|
|
21
|
-
spec/helpers/appliance-helper-spec.rb
|
|
22
|
-
spec/helpers/exec-helper-spec.rb
|
|
23
|
-
spec/helpers/log-helper-spec.rb
|
|
24
|
-
spec/helpers/queue-helper-spec.rb
|
|
25
|
-
spec/rspec/rspec-config-helper.rb
|
|
26
|
-
spec/rspec/src/appliances/ephemeral-repo.appl
|
|
27
|
-
spec/rspec/src/appliances/full.appl
|
|
28
|
-
spec/rspec/src/appliances/repo.appl
|
|
29
|
-
spec/validators/appliance-config-validator-spec.rb
|
data/boxgrinder-core.gemspec
CHANGED
|
@@ -2,27 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
Gem::Specification.new do |s|
|
|
4
4
|
s.name = %q{boxgrinder-core}
|
|
5
|
-
s.version = "0.0
|
|
5
|
+
s.version = "0.1.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-
|
|
9
|
+
s.date = %q{2010-10-12}
|
|
10
10
|
s.description = %q{Core files for BoxGrinder.}
|
|
11
11
|
s.email = %q{info@boxgrinder.org}
|
|
12
12
|
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "lib/boxgrinder-core.rb", "lib/boxgrinder-core/defaults.rb", "lib/boxgrinder-core/helpers/appliance-config-helper.rb", "lib/boxgrinder-core/helpers/appliance-helper.rb", "lib/boxgrinder-core/helpers/exec-helper.rb", "lib/boxgrinder-core/helpers/log-helper.rb", "lib/boxgrinder-core/helpers/queue-helper.rb", "lib/boxgrinder-core/models/appliance-config.rb", "lib/boxgrinder-core/models/config.rb", "lib/boxgrinder-core/models/task.rb", "lib/boxgrinder-core/validators/appliance-config-validator.rb", "lib/boxgrinder-core/validators/errors.rb", "lib/openhash/openhash.rb"]
|
|
13
|
-
s.files = ["CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "lib/boxgrinder-core.rb", "lib/boxgrinder-core/defaults.rb", "lib/boxgrinder-core/helpers/appliance-config-helper.rb", "lib/boxgrinder-core/helpers/appliance-helper.rb", "lib/boxgrinder-core/helpers/exec-helper.rb", "lib/boxgrinder-core/helpers/log-helper.rb", "lib/boxgrinder-core/helpers/queue-helper.rb", "lib/boxgrinder-core/models/appliance-config.rb", "lib/boxgrinder-core/models/config.rb", "lib/boxgrinder-core/models/task.rb", "lib/boxgrinder-core/validators/appliance-config-validator.rb", "lib/boxgrinder-core/validators/errors.rb", "lib/openhash/openhash.rb", "spec/Rakefile", "spec/helpers/appliance-config-helper-spec.rb", "spec/helpers/appliance-helper-spec.rb", "spec/helpers/exec-helper-spec.rb", "spec/helpers/log-helper-spec.rb", "spec/helpers/queue-helper-spec.rb", "spec/rspec/rspec-config-helper.rb", "spec/rspec/src/appliances/ephemeral-repo.appl", "spec/rspec/src/appliances/full.appl", "spec/rspec/src/appliances/repo.appl", "spec/validators/appliance-config-validator-spec.rb", "boxgrinder-core.gemspec"]
|
|
13
|
+
s.files = ["CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "lib/boxgrinder-core.rb", "lib/boxgrinder-core/defaults.rb", "lib/boxgrinder-core/helpers/appliance-config-helper.rb", "lib/boxgrinder-core/helpers/appliance-helper.rb", "lib/boxgrinder-core/helpers/exec-helper.rb", "lib/boxgrinder-core/helpers/log-helper.rb", "lib/boxgrinder-core/helpers/queue-helper.rb", "lib/boxgrinder-core/models/appliance-config.rb", "lib/boxgrinder-core/models/config.rb", "lib/boxgrinder-core/models/task.rb", "lib/boxgrinder-core/validators/appliance-config-validator.rb", "lib/boxgrinder-core/validators/errors.rb", "lib/openhash/openhash.rb", "spec/Rakefile", "spec/helpers/appliance-config-helper-spec.rb", "spec/helpers/appliance-helper-spec.rb", "spec/helpers/exec-helper-spec.rb", "spec/helpers/log-helper-spec.rb", "spec/helpers/queue-helper-spec.rb", "spec/rspec/ls/one", "spec/rspec/ls/two", "spec/rspec/rspec-config-helper.rb", "spec/rspec/src/appliances/ephemeral-repo.appl", "spec/rspec/src/appliances/full.appl", "spec/rspec/src/appliances/repo.appl", "spec/validators/appliance-config-validator-spec.rb", "boxgrinder-core.gemspec"]
|
|
14
14
|
s.homepage = %q{http://www.jboss.org/stormgrind/projects/boxgrinder.html}
|
|
15
15
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Boxgrinder-core", "--main", "README"]
|
|
16
16
|
s.require_paths = ["lib"]
|
|
17
17
|
s.rubyforge_project = %q{BoxGrinder Core}
|
|
18
|
-
s.rubygems_version = %q{1.3.
|
|
18
|
+
s.rubygems_version = %q{1.3.7}
|
|
19
19
|
s.summary = %q{Core files for BoxGrinder.}
|
|
20
20
|
|
|
21
21
|
if s.respond_to? :specification_version then
|
|
22
22
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
|
23
23
|
s.specification_version = 3
|
|
24
24
|
|
|
25
|
-
if Gem::Version.new(Gem::
|
|
25
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
|
26
26
|
s.add_runtime_dependency(%q<open4>, [">= 1.0.0"])
|
|
27
27
|
else
|
|
28
28
|
s.add_dependency(%q<open4>, [">= 1.0.0"])
|
|
@@ -19,12 +19,13 @@
|
|
|
19
19
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
|
20
20
|
|
|
21
21
|
require 'boxgrinder-core/validators/errors'
|
|
22
|
+
require 'set'
|
|
22
23
|
|
|
23
24
|
module BoxGrinder
|
|
24
25
|
class ApplianceConfigHelper
|
|
25
26
|
|
|
26
|
-
def initialize(appliance_configs)
|
|
27
|
-
@appliance_configs = appliance_configs.
|
|
27
|
+
def initialize( appliance_configs )
|
|
28
|
+
@appliance_configs = appliance_configs.reverse
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
def merge(appliance_config)
|
|
@@ -33,6 +34,7 @@ module BoxGrinder
|
|
|
33
34
|
prepare_os
|
|
34
35
|
prepare_appliances
|
|
35
36
|
|
|
37
|
+
merge_variables
|
|
36
38
|
merge_hardware
|
|
37
39
|
merge_repos
|
|
38
40
|
merge_packages
|
|
@@ -41,7 +43,41 @@ module BoxGrinder
|
|
|
41
43
|
@appliance_config
|
|
42
44
|
end
|
|
43
45
|
|
|
44
|
-
|
|
46
|
+
def merge_variables
|
|
47
|
+
@appliance_config.variables = {} if @appliance_config.variables.nil?
|
|
48
|
+
@appliance_configs.each do |appliance_config|
|
|
49
|
+
appliance_config.variables.each do |var, val|
|
|
50
|
+
@appliance_config.variables[var] = val
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
@appliance_config.variables["OS_NAME"] = @appliance_config.os.name
|
|
55
|
+
@appliance_config.variables["OS_VERSION"] = @appliance_config.os.version
|
|
56
|
+
@appliance_config.variables["ARCH"] = @appliance_config.hardware.arch
|
|
57
|
+
@appliance_config.variables["BASE_ARCH"] = @appliance_config.hardware.base_arch
|
|
58
|
+
|
|
59
|
+
resolve
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def resolve(resolve_stack = nil, resolved_set = Set.new())
|
|
63
|
+
if resolve_stack.nil?
|
|
64
|
+
@appliance_config.variables.keys.each { |var| resolve([var], resolved_set) }
|
|
65
|
+
else
|
|
66
|
+
var = resolve_stack.last
|
|
67
|
+
refs = @appliance_config.variables.keys.delete_if { |k|
|
|
68
|
+
@appliance_config.variables[k].nil? ||
|
|
69
|
+
@appliance_config.variables[k].index("##{k}#").nil? ||
|
|
70
|
+
resolve_stack.index(k).nil?
|
|
71
|
+
}
|
|
72
|
+
refs.each do |ref|
|
|
73
|
+
resolve(Arrays.new(resolve_stack).push(ref), resolved_set) unless resolved_set.include?(ref)
|
|
74
|
+
while @appliance_config.variables[var].include? "##{ref}#" do
|
|
75
|
+
@appliance_config.variables[var].gsub!("##{ref}#", @appliance_config.variables[ref])
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
resolved_set << var
|
|
79
|
+
end
|
|
80
|
+
end
|
|
45
81
|
|
|
46
82
|
def merge_hardware
|
|
47
83
|
merge_cpus
|
|
@@ -61,6 +97,12 @@ module BoxGrinder
|
|
|
61
97
|
parts.each do |root, partition|
|
|
62
98
|
if partitions.keys.include?(root)
|
|
63
99
|
partitions[root]['size'] = partition['size'] if partitions[root]['size'] < partition['size']
|
|
100
|
+
|
|
101
|
+
unless partition['type'].nil?
|
|
102
|
+
partitions[root].delete('options') if partitions[root]['type'] != partition['type']
|
|
103
|
+
partitions[root]['type'] = partition['type']
|
|
104
|
+
end
|
|
105
|
+
partitions[root]['options'] = partition['options'] unless partition['options'].nil? and partitions[root]['type'] == partition['type']
|
|
64
106
|
else
|
|
65
107
|
partitions[root] = partition
|
|
66
108
|
end
|
|
@@ -95,9 +137,9 @@ module BoxGrinder
|
|
|
95
137
|
|
|
96
138
|
@appliance_configs.each do |appliance_config|
|
|
97
139
|
for repo in appliance_config.repos
|
|
98
|
-
repo['name'] =
|
|
140
|
+
repo['name'] = substitute_vars(repo['name'])
|
|
99
141
|
['baseurl', 'mirrorlist'].each do |type|
|
|
100
|
-
repo[type] =
|
|
142
|
+
repo[type] = substitute_vars(repo[type]) unless repo[type].nil?
|
|
101
143
|
end
|
|
102
144
|
|
|
103
145
|
@appliance_config.repos << repo
|
|
@@ -105,9 +147,12 @@ module BoxGrinder
|
|
|
105
147
|
end
|
|
106
148
|
end
|
|
107
149
|
|
|
108
|
-
def
|
|
150
|
+
def substitute_vars(str)
|
|
109
151
|
return if str.nil?
|
|
110
|
-
|
|
152
|
+
@appliance_config.variables.keys.each do |var|
|
|
153
|
+
str = str.gsub("##{var}#", @appliance_config.variables[var])
|
|
154
|
+
end
|
|
155
|
+
str
|
|
111
156
|
end
|
|
112
157
|
|
|
113
158
|
def merge_packages
|
|
@@ -130,7 +175,8 @@ module BoxGrinder
|
|
|
130
175
|
|
|
131
176
|
@appliance_configs.each do |appliance_config|
|
|
132
177
|
appliance_config.post.each do |platform, cmds|
|
|
133
|
-
|
|
178
|
+
@appliance_config.post[platform] = [] if @appliance_config.post[platform].nil?
|
|
179
|
+
cmds.each { |cmd| @appliance_config.post[platform] << substitute_vars(cmd) }
|
|
134
180
|
end
|
|
135
181
|
end
|
|
136
182
|
end
|
|
@@ -30,11 +30,11 @@ module BoxGrinder
|
|
|
30
30
|
@log.debug "Reading definition from '#{definition_file}' file..."
|
|
31
31
|
|
|
32
32
|
definition_file_extension = File.extname(definition_file)
|
|
33
|
-
configs =
|
|
33
|
+
configs = []
|
|
34
34
|
|
|
35
35
|
appliance_config =
|
|
36
36
|
case definition_file_extension
|
|
37
|
-
when '.appl', '.yml'
|
|
37
|
+
when '.appl', '.yml', '.yaml'
|
|
38
38
|
read_yaml(definition_file)
|
|
39
39
|
when '.xml'
|
|
40
40
|
read_xml(definition_file)
|
|
@@ -51,13 +51,13 @@ module BoxGrinder
|
|
|
51
51
|
end
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
-
configs
|
|
54
|
+
configs << appliance_config
|
|
55
55
|
|
|
56
|
-
appliance_config.appliances.each do |appliance_name|
|
|
57
|
-
configs
|
|
56
|
+
appliance_config.appliances.reverse.each do |appliance_name|
|
|
57
|
+
configs << read_definitions("#{File.dirname(definition_file)}/#{appliance_name}#{definition_file_extension}").first
|
|
58
58
|
end unless appliance_config.appliances.nil? or !appliance_config.appliances.is_a?(Array)
|
|
59
59
|
|
|
60
|
-
[ configs, appliance_config ]
|
|
60
|
+
[ configs.flatten, appliance_config ]
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
def read_yaml(file)
|
|
@@ -74,6 +74,9 @@ module BoxGrinder
|
|
|
74
74
|
|
|
75
75
|
appliance_config.name = definition['name'] unless definition['name'].nil?
|
|
76
76
|
appliance_config.summary = definition['summary'] unless definition['summary'].nil?
|
|
77
|
+
|
|
78
|
+
definition['variables'].each { |key, value| appliance_config.variables[key] = value } unless definition['variables'].nil?
|
|
79
|
+
|
|
77
80
|
appliance_config.appliances = definition['appliances'] unless definition['appliances'].nil?
|
|
78
81
|
appliance_config.repos = definition['repos'] unless definition['repos'].nil?
|
|
79
82
|
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
|
|
21
21
|
require 'boxgrinder-core/defaults'
|
|
22
22
|
require 'openhash/openhash'
|
|
23
|
-
require 'rbconfig'
|
|
24
23
|
|
|
25
24
|
module BoxGrinder
|
|
26
25
|
class ApplianceConfig
|
|
@@ -28,6 +27,8 @@ module BoxGrinder
|
|
|
28
27
|
@name = nil
|
|
29
28
|
@summary = nil
|
|
30
29
|
|
|
30
|
+
@variables = {}
|
|
31
|
+
|
|
31
32
|
@os = OpenHash.new
|
|
32
33
|
|
|
33
34
|
@os.name = nil
|
|
@@ -53,6 +54,7 @@ module BoxGrinder
|
|
|
53
54
|
@release = 0
|
|
54
55
|
end
|
|
55
56
|
|
|
57
|
+
attr_reader :variables
|
|
56
58
|
attr_reader :os
|
|
57
59
|
attr_reader :hardware
|
|
58
60
|
attr_reader :path
|
|
@@ -74,7 +76,8 @@ module BoxGrinder
|
|
|
74
76
|
end
|
|
75
77
|
|
|
76
78
|
def init_arch
|
|
77
|
-
@hardware.arch =
|
|
79
|
+
@hardware.arch = `uname -m`.chomp.strip
|
|
80
|
+
@hardware.base_arch = is64bit? ? "x86_64" : "i386"
|
|
78
81
|
self
|
|
79
82
|
end
|
|
80
83
|
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
|
|
21
21
|
require 'boxgrinder-core/defaults'
|
|
22
22
|
require 'ostruct'
|
|
23
|
-
require 'rbconfig'
|
|
24
23
|
|
|
25
24
|
module BoxGrinder
|
|
26
25
|
class Config
|
|
@@ -52,6 +51,8 @@ module BoxGrinder
|
|
|
52
51
|
if File.exists?( @config_file )
|
|
53
52
|
@data = YAML.load_file( @config_file )
|
|
54
53
|
@data['gpg_password'].gsub!(/\$/, "\\$") unless @data['gpg_password'].nil? or @data['gpg_password'].length == 0
|
|
54
|
+
@dir.rpms_cache = @data['rpms_cache'] || @dir.rpms_cache
|
|
55
|
+
@dir.src_cache = @data['src_cache'] || @dir.src_cache
|
|
55
56
|
end
|
|
56
57
|
end
|
|
57
58
|
|
|
@@ -44,14 +44,13 @@ module BoxGrinder
|
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
def validate_os
|
|
47
|
-
raise
|
|
47
|
+
raise "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?
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
os_plugin = @options[:os_plugins][@appliance_config.os.name.to_sym]
|
|
49
|
+
os_plugin = PluginManager.instance.plugins[:os][@appliance_config.os.name.to_sym]
|
|
51
50
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
raise ApplianceValidationError, "No operating system selected" if @appliance_config.os.name.nil?
|
|
52
|
+
raise ApplianceValidationError, "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?
|
|
53
|
+
raise ApplianceValidationError, "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 )
|
|
55
54
|
end
|
|
56
55
|
|
|
57
56
|
def validate_hardware
|
data/spec/Rakefile
CHANGED
|
@@ -2,7 +2,7 @@ require 'rake'
|
|
|
2
2
|
require 'spec/rake/spectask'
|
|
3
3
|
|
|
4
4
|
desc "Run all examples"
|
|
5
|
-
Spec::Rake::SpecTask.new(
|
|
5
|
+
Spec::Rake::SpecTask.new(:default) do |t|
|
|
6
6
|
t.spec_files = FileList['**/*-spec.rb']
|
|
7
7
|
t.rcov = true
|
|
8
8
|
t.spec_opts = ['--colour', '--format', 'nested']
|
|
@@ -1,6 +1,267 @@
|
|
|
1
1
|
require 'boxgrinder-core/helpers/appliance-config-helper'
|
|
2
|
+
require 'rspec/rspec-config-helper'
|
|
2
3
|
|
|
3
4
|
module BoxGrinder
|
|
4
5
|
describe ApplianceConfigHelper do
|
|
6
|
+
include RSpecConfigHelper
|
|
7
|
+
|
|
8
|
+
before(:all) do
|
|
9
|
+
@arch = `uname -m`.chomp.strip
|
|
10
|
+
@base_arch = @arch.eql?("x86_64") ? "x86_64" : "i386"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def prepare_helper( configs )
|
|
14
|
+
@helper = ApplianceConfigHelper.new( configs )
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should merge post sections in right order" do
|
|
18
|
+
config_a = ApplianceConfig.new
|
|
19
|
+
config_a.name = 'a'
|
|
20
|
+
config_a.post['base'] = [ "1_1", "1_2" ]
|
|
21
|
+
config_a.appliances << 'b'
|
|
22
|
+
|
|
23
|
+
config_b = ApplianceConfig.new
|
|
24
|
+
config_b.name = 'b'
|
|
25
|
+
config_b.post['base'] = [ "2_1", "2_2" ]
|
|
26
|
+
|
|
27
|
+
prepare_helper( [ config_a, config_b ] )
|
|
28
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
|
29
|
+
|
|
30
|
+
@helper.merge_post_operations
|
|
31
|
+
|
|
32
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
|
33
|
+
config.post['base'].size.should == 4
|
|
34
|
+
config.post['base'].should == ['2_1', '2_2', '1_1', '1_2']
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should merge post sections in right order with more complicated inheritance" do
|
|
38
|
+
config_a = ApplianceConfig.new
|
|
39
|
+
config_a.name = 'a'
|
|
40
|
+
config_a.post['base'] = [ "1_1", "1_2" ]
|
|
41
|
+
config_a.appliances << 'b1'
|
|
42
|
+
config_a.appliances << 'b2'
|
|
43
|
+
|
|
44
|
+
config_b1 = ApplianceConfig.new
|
|
45
|
+
config_b1.name = 'b1'
|
|
46
|
+
config_b1.post['base'] = [ "2_1", "2_2" ]
|
|
47
|
+
|
|
48
|
+
config_b2 = ApplianceConfig.new
|
|
49
|
+
config_b2.name = 'b2'
|
|
50
|
+
config_b2.post['base'] = [ "3_1", "3_2" ]
|
|
51
|
+
|
|
52
|
+
prepare_helper( [ config_a, config_b1, config_b2 ] )
|
|
53
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
|
54
|
+
|
|
55
|
+
@helper.merge_post_operations
|
|
56
|
+
|
|
57
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
|
58
|
+
config.post['base'].size.should == 6
|
|
59
|
+
config.post['base'].should == ['3_1', '3_2', '2_1', '2_2', '1_1', '1_2']
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should merge post sections in right order with even more and more complicated inheritance" do
|
|
63
|
+
config_a = ApplianceConfig.new
|
|
64
|
+
config_a.name = 'a'
|
|
65
|
+
config_a.post['base'] = [ "1_1", "1_2" ]
|
|
66
|
+
config_a.appliances << 'b1'
|
|
67
|
+
config_a.appliances << 'b2'
|
|
68
|
+
|
|
69
|
+
config_b1 = ApplianceConfig.new
|
|
70
|
+
config_b1.name = 'b1'
|
|
71
|
+
config_b1.appliances << 'c1'
|
|
72
|
+
config_b1.post['base'] = [ "2_1", "2_2" ]
|
|
73
|
+
|
|
74
|
+
config_b2 = ApplianceConfig.new
|
|
75
|
+
config_b2.name = 'b2'
|
|
76
|
+
config_b2.appliances << 'c2'
|
|
77
|
+
config_b2.post['base'] = [ "3_1", "3_2" ]
|
|
78
|
+
|
|
79
|
+
config_c1 = ApplianceConfig.new
|
|
80
|
+
config_c1.name = 'c1'
|
|
81
|
+
config_c1.post['base'] = [ "4_1", "4_2" ]
|
|
82
|
+
|
|
83
|
+
config_c2 = ApplianceConfig.new
|
|
84
|
+
config_c2.name = 'c2'
|
|
85
|
+
config_c2.post['base'] = [ "5_1", "5_2" ]
|
|
86
|
+
|
|
87
|
+
prepare_helper( [
|
|
88
|
+
config_a,
|
|
89
|
+
config_b1,
|
|
90
|
+
config_c1,
|
|
91
|
+
config_b2,
|
|
92
|
+
config_c2
|
|
93
|
+
] )
|
|
94
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
|
95
|
+
|
|
96
|
+
@helper.merge_post_operations
|
|
97
|
+
|
|
98
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
|
99
|
+
config.post['base'].size.should == 10
|
|
100
|
+
config.post['base'].should == ['5_1', '5_2', '3_1', '3_2', '4_1', '4_2', '2_1', '2_2', '1_1', '1_2']
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "should merge post sections when dependent appliance has post section for platform for which we haven't specified post operations" do
|
|
104
|
+
config_a = ApplianceConfig.new
|
|
105
|
+
config_a.name = 'a'
|
|
106
|
+
config_a.post['base'] = [ "1_1", "1_2" ]
|
|
107
|
+
config_a.appliances << 'b'
|
|
108
|
+
|
|
109
|
+
config_b = ApplianceConfig.new
|
|
110
|
+
config_b.name = 'b'
|
|
111
|
+
config_b.post['ec2'] = [ "2_1", "2_2" ]
|
|
112
|
+
|
|
113
|
+
prepare_helper( [ config_a, config_b ] )
|
|
114
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
|
115
|
+
|
|
116
|
+
@helper.merge_post_operations
|
|
117
|
+
|
|
118
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
|
119
|
+
config.post['base'].size.should == 2
|
|
120
|
+
config.post['base'].should == ['1_1', '1_2']
|
|
121
|
+
config.post['ec2'].size.should == 2
|
|
122
|
+
config.post['ec2'].should == ['2_1', '2_2']
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "should merge partitions" do
|
|
126
|
+
config_a = ApplianceConfig.new
|
|
127
|
+
config_a.name = 'a'
|
|
128
|
+
config_a.appliances << 'b'
|
|
129
|
+
config_a.hardware.partitions = { "/" => { 'size' => '2' } }
|
|
130
|
+
|
|
131
|
+
config_b = ApplianceConfig.new
|
|
132
|
+
config_b.name = 'b'
|
|
133
|
+
config_b.hardware.partitions = { "/" => { 'size' => '4' }, "/home" => { 'size' => '2' } }
|
|
134
|
+
|
|
135
|
+
prepare_helper( [ config_a, config_b ] )
|
|
136
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
|
137
|
+
|
|
138
|
+
@helper.merge_partitions
|
|
139
|
+
|
|
140
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
|
141
|
+
config.hardware.partitions.size.should == 2
|
|
142
|
+
config.hardware.partitions.should == { "/" => { 'size' => '4' }, "/home" => { 'size' => '2' } }
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it "should merge partitions with different filesystem types" do
|
|
146
|
+
config_a = ApplianceConfig.new
|
|
147
|
+
config_a.name = 'a'
|
|
148
|
+
config_a.appliances << 'b'
|
|
149
|
+
config_a.hardware.partitions = { "/" => { 'size' => '2', 'type' => 'ext4' } }
|
|
150
|
+
|
|
151
|
+
config_b = ApplianceConfig.new
|
|
152
|
+
config_b.name = 'b'
|
|
153
|
+
config_b.hardware.partitions = { "/" => { 'size' => '4', 'type' => 'ext3' }, "/home" => { 'size' => '2' } }
|
|
154
|
+
|
|
155
|
+
prepare_helper( [ config_a, config_b ] )
|
|
156
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
|
157
|
+
|
|
158
|
+
@helper.merge_partitions
|
|
159
|
+
|
|
160
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
|
161
|
+
config.hardware.partitions.size.should == 2
|
|
162
|
+
config.hardware.partitions.should == { "/" => { 'size' => '4', 'type' => 'ext4' }, "/home" => { 'size' => '2' } }
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it "should merge partitions with different options" do
|
|
166
|
+
config_a = ApplianceConfig.new
|
|
167
|
+
config_a.name = 'a'
|
|
168
|
+
config_a.appliances << 'b'
|
|
169
|
+
config_a.hardware.partitions = { "/" => { 'size' => '2', 'type' => 'ext4', 'options' => 'barrier=0,nodelalloc,nobh,noatime' } }
|
|
170
|
+
|
|
171
|
+
config_b = ApplianceConfig.new
|
|
172
|
+
config_b.name = 'b'
|
|
173
|
+
config_b.hardware.partitions = { "/" => { 'size' => '4', 'type' => 'ext3', 'options' => 'shouldnt appear' }, "/home" => { 'size' => '2' } }
|
|
174
|
+
|
|
175
|
+
prepare_helper( [ config_a, config_b ] )
|
|
176
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
|
177
|
+
|
|
178
|
+
@helper.merge_partitions
|
|
179
|
+
|
|
180
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
|
181
|
+
config.hardware.partitions.size.should == 2
|
|
182
|
+
config.hardware.partitions.should == { "/" => { 'size' => '4', 'type' => 'ext4', 'options' => 'barrier=0,nodelalloc,nobh,noatime' }, "/home" => { 'size' => '2' } }
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
it "should merge partitions with different options, another case where type is changing - options should be vanished" do
|
|
186
|
+
config_a = ApplianceConfig.new
|
|
187
|
+
config_a.name = 'a'
|
|
188
|
+
config_a.appliances << 'b'
|
|
189
|
+
config_a.hardware.partitions = { "/" => { 'size' => '2', 'type' => 'ext4' } }
|
|
190
|
+
|
|
191
|
+
config_b = ApplianceConfig.new
|
|
192
|
+
config_b.name = 'b'
|
|
193
|
+
config_b.hardware.partitions = { "/" => { 'size' => '4', 'type' => 'ext3', 'options' => 'shouldnt appear' }, "/home" => { 'size' => '2' } }
|
|
194
|
+
|
|
195
|
+
prepare_helper( [ config_a, config_b ] )
|
|
196
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
|
197
|
+
|
|
198
|
+
@helper.merge_partitions
|
|
199
|
+
|
|
200
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
|
201
|
+
config.hardware.partitions.size.should == 2
|
|
202
|
+
config.hardware.partitions.should == { "/" => { 'size' => '4', 'type' => 'ext4' }, "/home" => { 'size' => '2' } }
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
it "should substitute variables in repos" do
|
|
206
|
+
config_a = ApplianceConfig.new
|
|
207
|
+
config_a.name = 'a'
|
|
208
|
+
config_a.os.name = 'fedora'
|
|
209
|
+
config_a.os.version = '12'
|
|
210
|
+
config_a.repos << { 'name' => '#ARCH#', 'baseurl' => '#BASE_ARCH#', 'mirrorlist' => '#OS_NAME#-#OS_VERSION#' }
|
|
211
|
+
config_a.init_arch
|
|
212
|
+
|
|
213
|
+
prepare_helper( [ config_a ] )
|
|
214
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
|
215
|
+
|
|
216
|
+
@helper.merge_variables
|
|
217
|
+
@helper.merge_repos
|
|
218
|
+
|
|
219
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
|
220
|
+
config.repos.size.should == 1
|
|
221
|
+
config.repos.first.should == { 'name' => "#{@arch}", 'baseurl' => "#{@base_arch}", 'mirrorlist' => 'fedora-12' }
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it "should substitute variables in post section" do
|
|
225
|
+
config_a = ApplianceConfig.new
|
|
226
|
+
config_a.name = 'a'
|
|
227
|
+
config_a.os.name = 'fedora'
|
|
228
|
+
config_a.os.version = '12'
|
|
229
|
+
config_a.post['base'] = ['#ARCH#', '#BASE_ARCH#', '#OS_VERSION#', '#OS_NAME#']
|
|
230
|
+
config_a.post['ec2'] = ['#ARCH#', '#BASE_ARCH#', '#OS_VERSION#', '#OS_NAME#']
|
|
231
|
+
config_a.init_arch
|
|
232
|
+
|
|
233
|
+
prepare_helper( [ config_a ] )
|
|
234
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
|
235
|
+
|
|
236
|
+
@helper.merge_variables
|
|
237
|
+
@helper.merge_post_operations
|
|
238
|
+
|
|
239
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
|
240
|
+
config.post.size.should == 2
|
|
241
|
+
config.post['base'].should == [@arch, @base_arch, '12', 'fedora']
|
|
242
|
+
config.post['ec2'].should == [@arch, @base_arch, '12', 'fedora']
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
it "should substitute custom variables" do
|
|
246
|
+
config_a = ApplianceConfig.new
|
|
247
|
+
config_a.name = 'a'
|
|
248
|
+
config_a.os.name = 'fedora'
|
|
249
|
+
config_a.os.version = '12'
|
|
250
|
+
config_a.variables['CUSTOM_A'] = "AAA"
|
|
251
|
+
config_a.variables['CUSTOM_B'] = "BBB"
|
|
252
|
+
config_a.post['base'] = ['#ARCH#', '#BASE_ARCH#', '#OS_VERSION#', '#OS_NAME#', '#CUSTOM_A#', '#CUSTOM_B#']
|
|
253
|
+
config_a.init_arch
|
|
254
|
+
|
|
255
|
+
prepare_helper( [ config_a ] )
|
|
256
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
|
257
|
+
|
|
258
|
+
@helper.merge_variables
|
|
259
|
+
@helper.merge_post_operations
|
|
260
|
+
|
|
261
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
|
262
|
+
config.post.size.should == 1
|
|
263
|
+
config.post['base'].should == [@arch, @base_arch, '12', 'fedora', 'AAA', 'BBB']
|
|
264
|
+
end
|
|
265
|
+
|
|
5
266
|
end
|
|
6
267
|
end
|
|
@@ -1,6 +1,62 @@
|
|
|
1
1
|
require 'boxgrinder-core/helpers/appliance-helper'
|
|
2
|
+
require 'rspec/rspec-config-helper'
|
|
2
3
|
|
|
3
4
|
module BoxGrinder
|
|
4
5
|
describe ApplianceHelper do
|
|
6
|
+
include RSpecConfigHelper
|
|
7
|
+
|
|
8
|
+
before(:each) do
|
|
9
|
+
@helper = ApplianceHelper.new( :log => Logger.new('/dev/null') )
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should read definition from one file" do
|
|
13
|
+
appliance_config = ApplianceConfig.new
|
|
14
|
+
@helper.should_receive(:read_yaml).with('file.appl').and_return( appliance_config )
|
|
15
|
+
@helper.read_definitions( "file.appl" ).should == [ [ appliance_config ], appliance_config ]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should read definition from two files" do
|
|
19
|
+
appliance_a = ApplianceConfig.new
|
|
20
|
+
appliance_a.name = 'a'
|
|
21
|
+
appliance_a.appliances << "b"
|
|
22
|
+
|
|
23
|
+
appliance_b = ApplianceConfig.new
|
|
24
|
+
appliance_b.name = 'b'
|
|
25
|
+
|
|
26
|
+
@helper.should_receive(:read_yaml).ordered.with('a.appl').and_return( appliance_a )
|
|
27
|
+
@helper.should_receive(:read_yaml).ordered.with('./b.appl').and_return( appliance_b )
|
|
28
|
+
|
|
29
|
+
@helper.read_definitions( "a.appl" ).should == [ [ appliance_a, appliance_b ], appliance_a ]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "should read definitions from a tree file structure" do
|
|
33
|
+
appliance_a = ApplianceConfig.new
|
|
34
|
+
appliance_a.name = 'a'
|
|
35
|
+
appliance_a.appliances << "b1"
|
|
36
|
+
appliance_a.appliances << "b2"
|
|
37
|
+
|
|
38
|
+
appliance_b1 = ApplianceConfig.new
|
|
39
|
+
appliance_b1.name = 'b1'
|
|
40
|
+
appliance_b1.appliances << "c1"
|
|
41
|
+
|
|
42
|
+
appliance_b2 = ApplianceConfig.new
|
|
43
|
+
appliance_b2.name = 'b2'
|
|
44
|
+
appliance_b2.appliances << "c2"
|
|
45
|
+
|
|
46
|
+
appliance_c1 = ApplianceConfig.new
|
|
47
|
+
appliance_c1.name = 'c1'
|
|
48
|
+
|
|
49
|
+
appliance_c2 = ApplianceConfig.new
|
|
50
|
+
appliance_c2.name = 'c2'
|
|
51
|
+
|
|
52
|
+
@helper.should_receive(:read_yaml).ordered.with('a.appl').and_return( appliance_a )
|
|
53
|
+
@helper.should_receive(:read_yaml).ordered.with('./b2.appl').and_return( appliance_b2 )
|
|
54
|
+
@helper.should_receive(:read_yaml).ordered.with('./c2.appl').and_return( appliance_c2 )
|
|
55
|
+
@helper.should_receive(:read_yaml).ordered.with('./b1.appl').and_return( appliance_b1 )
|
|
56
|
+
@helper.should_receive(:read_yaml).ordered.with('./c1.appl').and_return( appliance_c1 )
|
|
57
|
+
|
|
58
|
+
@helper.read_definitions( "a.appl" ).should == [ [ appliance_a, appliance_b2, appliance_c2, appliance_b1, appliance_c1 ], appliance_a ]
|
|
59
|
+
end
|
|
60
|
+
|
|
5
61
|
end
|
|
6
62
|
end
|
|
@@ -31,11 +31,11 @@ module BoxGrinder
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
it "should execute the command and return output" do
|
|
34
|
-
@helper.execute("ls rspec/ls | wc -l").should == "2"
|
|
34
|
+
@helper.execute("ls #{File.dirname( __FILE__ )}/../rspec/ls | wc -l").should == "2"
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
it "should execute the command and return multi line output" do
|
|
38
|
-
@helper.execute("ls -1 rspec/ls").should == "one\ntwo"
|
|
38
|
+
@helper.execute("ls -1 #{File.dirname( __FILE__ )}/../rspec/ls").should == "one\ntwo"
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
end
|
data/spec/rspec/ls/one
ADDED
|
File without changes
|
data/spec/rspec/ls/two
ADDED
|
File without changes
|
metadata
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: boxgrinder-core
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
+
hash: 27
|
|
4
5
|
prerelease: false
|
|
5
6
|
segments:
|
|
6
7
|
- 0
|
|
8
|
+
- 1
|
|
7
9
|
- 0
|
|
8
|
-
|
|
9
|
-
version: 0.0.22
|
|
10
|
+
version: 0.1.0
|
|
10
11
|
platform: ruby
|
|
11
12
|
authors:
|
|
12
13
|
- Marek Goldmann
|
|
@@ -14,16 +15,18 @@ autorequire:
|
|
|
14
15
|
bindir: bin
|
|
15
16
|
cert_chain: []
|
|
16
17
|
|
|
17
|
-
date: 2010-
|
|
18
|
+
date: 2010-10-12 00:00:00 +02:00
|
|
18
19
|
default_executable:
|
|
19
20
|
dependencies:
|
|
20
21
|
- !ruby/object:Gem::Dependency
|
|
21
22
|
name: open4
|
|
22
23
|
prerelease: false
|
|
23
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
24
26
|
requirements:
|
|
25
27
|
- - ">="
|
|
26
28
|
- !ruby/object:Gem::Version
|
|
29
|
+
hash: 23
|
|
27
30
|
segments:
|
|
28
31
|
- 1
|
|
29
32
|
- 0
|
|
@@ -79,6 +82,8 @@ files:
|
|
|
79
82
|
- spec/helpers/exec-helper-spec.rb
|
|
80
83
|
- spec/helpers/log-helper-spec.rb
|
|
81
84
|
- spec/helpers/queue-helper-spec.rb
|
|
85
|
+
- spec/rspec/ls/one
|
|
86
|
+
- spec/rspec/ls/two
|
|
82
87
|
- spec/rspec/rspec-config-helper.rb
|
|
83
88
|
- spec/rspec/src/appliances/ephemeral-repo.appl
|
|
84
89
|
- spec/rspec/src/appliances/full.appl
|
|
@@ -100,16 +105,20 @@ rdoc_options:
|
|
|
100
105
|
require_paths:
|
|
101
106
|
- lib
|
|
102
107
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
108
|
+
none: false
|
|
103
109
|
requirements:
|
|
104
110
|
- - ">="
|
|
105
111
|
- !ruby/object:Gem::Version
|
|
112
|
+
hash: 3
|
|
106
113
|
segments:
|
|
107
114
|
- 0
|
|
108
115
|
version: "0"
|
|
109
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
|
+
none: false
|
|
110
118
|
requirements:
|
|
111
119
|
- - ">="
|
|
112
120
|
- !ruby/object:Gem::Version
|
|
121
|
+
hash: 11
|
|
113
122
|
segments:
|
|
114
123
|
- 1
|
|
115
124
|
- 2
|
|
@@ -117,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
117
126
|
requirements: []
|
|
118
127
|
|
|
119
128
|
rubyforge_project: BoxGrinder Core
|
|
120
|
-
rubygems_version: 1.3.
|
|
129
|
+
rubygems_version: 1.3.7
|
|
121
130
|
signing_key:
|
|
122
131
|
specification_version: 3
|
|
123
132
|
summary: Core files for BoxGrinder.
|