boxgrinder-core 0.1.5 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +14 -0
- data/Manifest +4 -1
- data/boxgrinder-core.gemspec +4 -4
- data/lib/boxgrinder-core.rb +0 -2
- data/lib/boxgrinder-core/helpers/appliance-config-helper.rb +13 -16
- data/lib/boxgrinder-core/helpers/appliance-helper.rb +64 -35
- data/lib/boxgrinder-core/helpers/exec-helper.rb +3 -0
- data/lib/boxgrinder-core/helpers/log-helper.rb +2 -3
- data/lib/boxgrinder-core/models/appliance-config.rb +6 -11
- data/lib/boxgrinder-core/models/config.rb +36 -45
- data/lib/boxgrinder-core/validators/appliance-config-validator.rb +0 -1
- data/rubygem-boxgrinder-core.spec +18 -1
- data/spec/helpers/appliance-config-helper-spec.rb +197 -113
- data/spec/helpers/appliance-helper-spec.rb +160 -45
- data/spec/helpers/log-helper-spec.rb +2 -2
- data/spec/models/config-spec.rb +56 -0
- data/spec/rspec/src/appliances/ephemeral-repo.appl +2 -3
- data/spec/rspec/src/appliances/full.appl +2 -3
- data/spec/rspec/src/appliances/invalid_yaml.appl +1 -0
- data/spec/rspec/src/appliances/repo.appl +2 -3
- data/spec/rspec/src/config/empty +0 -0
- data/spec/rspec/src/config/valid +4 -0
- metadata +9 -7
- data/lib/boxgrinder-core/defaults.rb +0 -58
data/CHANGELOG
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
v0.2.0
|
2
|
+
|
3
|
+
* [BGBUILD-133] Support a consolidated configuration file
|
4
|
+
* [BGBUILD-68] Global .boxgrinder/config or rc style file for config
|
5
|
+
* [BGBUILD-127] Use appliance definition object instead of a file when using BG as a library
|
6
|
+
* [BGBUILD-79] Allow to use BoxGrinder Build as a library
|
7
|
+
* [BGBUILD-93] Add Red Hat Enterprise Linux 6 support
|
8
|
+
* [BGBUILD-101] Don't use 'includes' subsection when specifying packages
|
9
|
+
* [BGBUILD-60] Post section merging pattern for appliances depending on the same appliance
|
10
|
+
* [BGBUILD-151] Overriding hardware partitions via inclusion in Appliance Definition File causes build failure
|
11
|
+
|
12
|
+
v0.1.6
|
13
|
+
|
14
|
+
* [BGBUILD-100] Enable boxgrinder_build to create a Fedora image with encrypted partition(s)
|
1
15
|
|
2
16
|
v0.1.5
|
3
17
|
|
data/Manifest
CHANGED
@@ -5,7 +5,6 @@ README
|
|
5
5
|
Rakefile
|
6
6
|
boxgrinder-core.gemspec
|
7
7
|
lib/boxgrinder-core.rb
|
8
|
-
lib/boxgrinder-core/defaults.rb
|
9
8
|
lib/boxgrinder-core/helpers/appliance-config-helper.rb
|
10
9
|
lib/boxgrinder-core/helpers/appliance-helper.rb
|
11
10
|
lib/boxgrinder-core/helpers/exec-helper.rb
|
@@ -20,10 +19,14 @@ spec/helpers/appliance-config-helper-spec.rb
|
|
20
19
|
spec/helpers/appliance-helper-spec.rb
|
21
20
|
spec/helpers/exec-helper-spec.rb
|
22
21
|
spec/helpers/log-helper-spec.rb
|
22
|
+
spec/models/config-spec.rb
|
23
23
|
spec/rspec/ls/one
|
24
24
|
spec/rspec/ls/two
|
25
25
|
spec/rspec/rspec-config-helper.rb
|
26
26
|
spec/rspec/src/appliances/ephemeral-repo.appl
|
27
27
|
spec/rspec/src/appliances/full.appl
|
28
|
+
spec/rspec/src/appliances/invalid_yaml.appl
|
28
29
|
spec/rspec/src/appliances/repo.appl
|
30
|
+
spec/rspec/src/config/empty
|
31
|
+
spec/rspec/src/config/valid
|
29
32
|
spec/validators/appliance-config-validator-spec.rb
|
data/boxgrinder-core.gemspec
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{boxgrinder-core}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.2.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{
|
9
|
+
s.date = %q{2011-02-09}
|
10
10
|
s.description = %q{Core library for BoxGrinder}
|
11
11
|
s.email = %q{info@boxgrinder.org}
|
12
|
-
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "lib/boxgrinder-core.rb", "lib/boxgrinder-core/
|
13
|
-
s.files = ["CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "boxgrinder-core.gemspec", "lib/boxgrinder-core.rb", "lib/boxgrinder-core/
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "lib/boxgrinder-core.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/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"]
|
13
|
+
s.files = ["CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "boxgrinder-core.gemspec", "lib/boxgrinder-core.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/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", "rubygem-boxgrinder-core.spec", "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/models/config-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/invalid_yaml.appl", "spec/rspec/src/appliances/repo.appl", "spec/rspec/src/config/empty", "spec/rspec/src/config/valid", "spec/validators/appliance-config-validator-spec.rb"]
|
14
14
|
s.homepage = %q{http://www.jboss.org/boxgrinder}
|
15
15
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Boxgrinder-core", "--main", "README"]
|
16
16
|
s.require_paths = ["lib"]
|
data/lib/boxgrinder-core.rb
CHANGED
@@ -23,7 +23,7 @@ module BoxGrinder
|
|
23
23
|
class ApplianceConfigHelper
|
24
24
|
|
25
25
|
def initialize(appliance_configs)
|
26
|
-
@appliance_configs
|
26
|
+
@appliance_configs = appliance_configs.reverse
|
27
27
|
end
|
28
28
|
|
29
29
|
def merge(appliance_config)
|
@@ -125,6 +125,7 @@ module BoxGrinder
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
+
partitions[root]['passphrase'] = partition['passphrase'] unless partition['passphrase'].nil?
|
128
129
|
partitions[root]['options'] = partition['options'] unless partition['options'].nil?
|
129
130
|
end
|
130
131
|
end
|
@@ -133,14 +134,13 @@ module BoxGrinder
|
|
133
134
|
end
|
134
135
|
|
135
136
|
def default_filesystem_type
|
136
|
-
fs = '
|
137
|
+
fs = 'ext4'
|
137
138
|
|
138
139
|
case @appliance_config.os.name
|
139
|
-
when '
|
140
|
-
|
140
|
+
when 'rhel', 'centos'
|
141
141
|
case @appliance_config.os.version
|
142
|
-
when '
|
143
|
-
fs = '
|
142
|
+
when '5'
|
143
|
+
fs = 'ext3'
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
@@ -155,8 +155,6 @@ module BoxGrinder
|
|
155
155
|
merge_field('os.name') { |name| @appliance_config.os.name = name.to_s }
|
156
156
|
merge_field('os.version') { |version| @appliance_config.os.version = version.to_s }
|
157
157
|
merge_field('os.password') { |password| @appliance_config.os.password = password.to_s }
|
158
|
-
|
159
|
-
@appliance_config.os.password = APPLIANCE_DEFAULTS[:os][:password] if @appliance_config.os.password.nil?
|
160
158
|
end
|
161
159
|
|
162
160
|
def prepare_appliances
|
@@ -191,16 +189,11 @@ module BoxGrinder
|
|
191
189
|
end
|
192
190
|
|
193
191
|
def merge_packages
|
194
|
-
@appliance_config.packages.
|
195
|
-
@appliance_config.packages.excludes.clear
|
192
|
+
@appliance_config.packages.clear
|
196
193
|
|
197
194
|
@appliance_configs.each do |appliance_config|
|
198
|
-
appliance_config.packages.
|
199
|
-
@appliance_config.packages
|
200
|
-
end
|
201
|
-
|
202
|
-
appliance_config.packages.excludes.each do |package|
|
203
|
-
@appliance_config.packages.excludes << package
|
195
|
+
appliance_config.packages.each do |package|
|
196
|
+
@appliance_config.packages << package
|
204
197
|
end
|
205
198
|
end
|
206
199
|
end
|
@@ -208,11 +201,15 @@ module BoxGrinder
|
|
208
201
|
def merge_post_operations
|
209
202
|
@appliance_config.post.each_value { |cmds| cmds.clear }
|
210
203
|
|
204
|
+
included = []
|
205
|
+
|
211
206
|
@appliance_configs.each do |appliance_config|
|
207
|
+
next if included.include?(appliance_config)
|
212
208
|
appliance_config.post.each do |platform, cmds|
|
213
209
|
@appliance_config.post[platform] = [] if @appliance_config.post[platform].nil?
|
214
210
|
cmds.each { |cmd| @appliance_config.post[platform] << substitute_vars(cmd) }
|
215
211
|
end
|
212
|
+
included << appliance_config
|
216
213
|
end
|
217
214
|
end
|
218
215
|
|
@@ -25,49 +25,77 @@ module BoxGrinder
|
|
25
25
|
@log = options[:log] || Logger.new(STDOUT)
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
# Reads definition provided as string. This string can be a YAML document. In this case
|
29
|
+
# definition is parsed and an ApplianceConfig object is returned. In other cases it tries to search
|
30
|
+
# for a file with provided name.
|
31
|
+
def read_definitions(definition, content_type = nil)
|
32
32
|
configs = []
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
34
|
+
if File.exists?(definition)
|
35
|
+
@log.debug "Reading definition from '#{definition}' file..."
|
36
|
+
|
37
|
+
definition_file_extension = File.extname(definition)
|
38
|
+
|
39
|
+
appliance_config =
|
40
|
+
case definition_file_extension
|
41
|
+
when '.appl', '.yml', '.yaml'
|
42
|
+
read_yaml_file(definition)
|
43
|
+
when '.xml'
|
44
|
+
read_xml_file(definition)
|
45
|
+
else
|
46
|
+
unless content_type.nil?
|
47
|
+
case content_type
|
48
|
+
when 'application/x-yaml', 'text/yaml'
|
49
|
+
read_yaml_file(definition)
|
50
|
+
when 'application/xml', 'text/xml', 'application/x-xml'
|
51
|
+
read_xml_file(definition)
|
52
|
+
end
|
47
53
|
end
|
48
|
-
|
49
|
-
|
54
|
+
end
|
55
|
+
|
56
|
+
raise 'Unsupported file format for appliance definition file.' if appliance_config.nil?
|
50
57
|
|
51
|
-
|
58
|
+
configs << appliance_config
|
52
59
|
|
53
|
-
|
60
|
+
appliance_config.appliances.reverse.each do |appliance_name|
|
61
|
+
configs << read_definitions("#{File.dirname(definition)}/#{appliance_name}#{definition_file_extension}").first
|
62
|
+
end unless appliance_config.appliances.nil? or !appliance_config.appliances.is_a?(Array)
|
63
|
+
else
|
64
|
+
@log.debug "Reading definition..."
|
54
65
|
|
55
|
-
|
56
|
-
configs <<
|
57
|
-
end
|
66
|
+
appliance_config = read_yaml(definition)
|
67
|
+
configs << appliance_config
|
68
|
+
end
|
58
69
|
|
59
70
|
[configs.flatten, appliance_config]
|
60
71
|
end
|
61
72
|
|
62
|
-
def read_yaml(
|
73
|
+
def read_yaml(content)
|
74
|
+
begin
|
75
|
+
definition = YAML.load(content)
|
76
|
+
raise "Not a valid YAML content." if definition.nil? or definition == false
|
77
|
+
rescue
|
78
|
+
raise "Provided definition could not be read."
|
79
|
+
end
|
80
|
+
|
81
|
+
parse_yaml(definition)
|
82
|
+
end
|
83
|
+
|
84
|
+
def read_yaml_file(file)
|
63
85
|
begin
|
64
86
|
definition = YAML.load_file(file)
|
65
|
-
raise if definition.nil? or definition == false
|
87
|
+
raise "Not a valid YAML file." if definition.nil? or definition == false
|
66
88
|
rescue
|
67
89
|
raise "File '#{file}' could not be read."
|
68
90
|
end
|
69
91
|
|
92
|
+
parse_yaml(definition)
|
93
|
+
end
|
94
|
+
|
95
|
+
# TODO this needs to be rewritten
|
96
|
+
def parse_yaml(definition)
|
70
97
|
return definition if definition.is_a?(ApplianceConfig)
|
98
|
+
raise "Provided definition is not a Hash." unless definition.is_a?(Hash)
|
71
99
|
|
72
100
|
appliance_config = ApplianceConfig.new
|
73
101
|
|
@@ -76,6 +104,7 @@ module BoxGrinder
|
|
76
104
|
|
77
105
|
definition['variables'].each { |key, value| appliance_config.variables[key] = value } unless definition['variables'].nil?
|
78
106
|
|
107
|
+
appliance_config.packages = definition['packages'] unless definition['packages'].nil?
|
79
108
|
appliance_config.appliances = definition['appliances'] unless definition['appliances'].nil?
|
80
109
|
appliance_config.repos = definition['repos'] unless definition['repos'].nil?
|
81
110
|
|
@@ -84,12 +113,7 @@ module BoxGrinder
|
|
84
113
|
|
85
114
|
unless definition['default_repos'].nil?
|
86
115
|
appliance_config.default_repos = definition['default_repos']
|
87
|
-
raise "
|
88
|
-
end
|
89
|
-
|
90
|
-
unless definition['packages'].nil?
|
91
|
-
appliance_config.packages.includes = definition['packages']['includes'] unless definition['packages']['includes'].nil?
|
92
|
-
appliance_config.packages.excludes = definition['packages']['excludes'] unless definition['packages']['excludes'].nil?
|
116
|
+
raise "default_repos should be set to true or false" unless appliance_config.default_repos.is_a?(TrueClass) or appliance_config.default_repos.is_a?(FalseClass)
|
93
117
|
end
|
94
118
|
|
95
119
|
unless definition['os'].nil?
|
@@ -103,7 +127,12 @@ module BoxGrinder
|
|
103
127
|
appliance_config.hardware.cpus = definition['hardware']['cpus'] unless definition['hardware']['cpus'].nil?
|
104
128
|
appliance_config.hardware.memory = definition['hardware']['memory'] unless definition['hardware']['memory'].nil?
|
105
129
|
appliance_config.hardware.network = definition['hardware']['network'] unless definition['hardware']['network'].nil?
|
106
|
-
|
130
|
+
|
131
|
+
unless definition['hardware']['partitions'].nil?
|
132
|
+
definition['hardware']['partitions'].each do |key, part|
|
133
|
+
appliance_config.hardware.partitions[key] = part
|
134
|
+
end if definition['hardware']['partitions'].is_a?(Hash)
|
135
|
+
end
|
107
136
|
end
|
108
137
|
|
109
138
|
definition['post'].each { |key, value| appliance_config.post[key] = value } unless definition['post'].nil?
|
@@ -111,8 +140,8 @@ module BoxGrinder
|
|
111
140
|
appliance_config
|
112
141
|
end
|
113
142
|
|
114
|
-
def
|
115
|
-
raise "Reading XML files is not supported right now. File '#{file}' could not be read"
|
143
|
+
def read_xml_file(file)
|
144
|
+
raise "Reading XML files is not supported right now. File '#{file}' could not be read."
|
116
145
|
end
|
117
146
|
end
|
118
147
|
end
|
@@ -17,7 +17,6 @@
|
|
17
17
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
18
18
|
|
19
19
|
require 'logger'
|
20
|
-
require 'boxgrinder-core/defaults'
|
21
20
|
require 'fileutils'
|
22
21
|
|
23
22
|
Logger.const_set(:TRACE, 0)
|
@@ -53,8 +52,8 @@ module BoxGrinder
|
|
53
52
|
}
|
54
53
|
|
55
54
|
def initialize(options = {})
|
56
|
-
location = options[:location] ||
|
57
|
-
threshold = options[:
|
55
|
+
location = options[:location] || 'log/boxgrinder.log'
|
56
|
+
threshold = options[:level].nil? ? :info : options[:level].to_sym
|
58
57
|
type = options[:type] || [:stdout, :file]
|
59
58
|
|
60
59
|
unless type.is_a?(Array)
|
@@ -17,7 +17,6 @@
|
|
17
17
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
18
18
|
|
19
19
|
require 'rubygems'
|
20
|
-
require 'boxgrinder-core/defaults'
|
21
20
|
require 'hashery/opencascade'
|
22
21
|
|
23
22
|
module BoxGrinder
|
@@ -32,21 +31,18 @@ module BoxGrinder
|
|
32
31
|
|
33
32
|
@os.name = nil
|
34
33
|
@os.version = nil
|
35
|
-
@os.password =
|
34
|
+
@os.password = 'boxgrinder'
|
36
35
|
|
37
36
|
@hardware = OpenCascade.new
|
38
37
|
|
39
|
-
@hardware.cpus =
|
40
|
-
@hardware.memory =
|
41
|
-
@hardware.network =
|
42
|
-
@hardware.partitions =
|
38
|
+
@hardware.cpus = 1
|
39
|
+
@hardware.memory = 256
|
40
|
+
@hardware.network = 'NAT'
|
41
|
+
@hardware.partitions = {"/" => { 'size' => 1 }}
|
43
42
|
|
44
43
|
@post = {}
|
45
44
|
|
46
|
-
@packages =
|
47
|
-
@packages.includes = []
|
48
|
-
@packages.excludes = []
|
49
|
-
|
45
|
+
@packages = []
|
50
46
|
@appliances = []
|
51
47
|
@repos = []
|
52
48
|
|
@@ -58,7 +54,6 @@ module BoxGrinder
|
|
58
54
|
attr_reader :os
|
59
55
|
attr_reader :hardware
|
60
56
|
attr_reader :path
|
61
|
-
attr_reader :file
|
62
57
|
attr_reader :post
|
63
58
|
|
64
59
|
attr_accessor :packages
|
@@ -16,55 +16,46 @@
|
|
16
16
|
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
17
17
|
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
18
18
|
|
19
|
-
require '
|
20
|
-
require '
|
19
|
+
require 'rubygems'
|
20
|
+
require 'hashery/opencascade'
|
21
|
+
require 'yaml'
|
21
22
|
|
22
23
|
module BoxGrinder
|
23
|
-
class Config
|
24
|
-
def initialize
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
if File.exists?( @config_file )
|
50
|
-
@data = YAML.load_file( @config_file )
|
51
|
-
@data['gpg_password'].gsub!(/\$/, "\\$") unless @data['gpg_password'].nil? or @data['gpg_password'].length == 0
|
52
|
-
@dir.rpms_cache = @data['rpms_cache'] || @dir.rpms_cache
|
53
|
-
@dir.src_cache = @data['src_cache'] || @dir.src_cache
|
54
|
-
end
|
24
|
+
class Config < OpenCascade
|
25
|
+
def initialize(values = {})
|
26
|
+
super({})
|
27
|
+
|
28
|
+
merge!(
|
29
|
+
:file => ENV['BG_CONFIG_FILE'] || "#{ENV['HOME']}/.boxgrinder/config",
|
30
|
+
:name => 'BoxGrinder Build',
|
31
|
+
:platform => :none,
|
32
|
+
:delivery => :none,
|
33
|
+
:force => false,
|
34
|
+
:log_level => :info,
|
35
|
+
:dir => {
|
36
|
+
:root => Dir.pwd,
|
37
|
+
:build => 'build',
|
38
|
+
:cache => '/var/cache/boxgrinder' # required for appliance-creator
|
39
|
+
},
|
40
|
+
:os_config => {},
|
41
|
+
:platform_config => {},
|
42
|
+
:delivery_config => {},
|
43
|
+
:additional_plugins => []
|
44
|
+
)
|
45
|
+
|
46
|
+
merge!(values.inject({}) { |memo, (k, v)| memo[k.to_sym] = v; memo })
|
47
|
+
|
48
|
+
deep_merge(self, YAML.load_file(self.file)) if File.exists?(self.file)
|
55
49
|
end
|
56
50
|
|
57
|
-
def
|
58
|
-
|
51
|
+
def deep_merge(first, second)
|
52
|
+
second.each_key do |k|
|
53
|
+
if first[k.to_sym].is_a?(Hash) and second[k].is_a?(Hash)
|
54
|
+
deep_merge(first[k.to_sym], second[k])
|
55
|
+
else
|
56
|
+
first[k.to_sym] = second[k]
|
57
|
+
end
|
58
|
+
end if second
|
59
59
|
end
|
60
|
-
|
61
|
-
attr_accessor :name
|
62
|
-
attr_accessor :version
|
63
|
-
attr_accessor :release
|
64
|
-
attr_accessor :config_file
|
65
|
-
attr_reader :files
|
66
|
-
|
67
|
-
attr_reader :data
|
68
|
-
attr_reader :dir
|
69
60
|
end
|
70
61
|
end
|