boxgrinder-core 0.3.0 → 0.3.1
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 +10 -0
- data/Rakefile +13 -9
- data/boxgrinder-core.gemspec +11 -8
- data/lib/boxgrinder-core/appliance-parser.rb +84 -0
- data/{spec/validators/appliance-config-validator-spec.rb → lib/boxgrinder-core/appliance-validator.rb} +15 -2
- data/lib/boxgrinder-core/{validators/errors.rb → errors.rb} +16 -0
- data/lib/boxgrinder-core/helpers/appliance-config-helper.rb +10 -18
- data/lib/boxgrinder-core/helpers/appliance-definition-helper.rb +19 -59
- data/lib/boxgrinder-core/helpers/appliance-transformation-helper.rb +58 -0
- data/lib/boxgrinder-core/helpers/exec-helper.rb +48 -21
- data/lib/boxgrinder-core/models/appliance-config.rb +39 -23
- data/lib/boxgrinder-core/models/config.rb +4 -2
- data/lib/boxgrinder-core/schemas/appliance_schema_0.8.0.yaml +95 -0
- data/lib/boxgrinder-core/schemas/appliance_schema_0.9.0.yaml +92 -0
- data/rubygem-boxgrinder-core.spec +13 -1
- data/spec/appliance-parser-spec.rb +68 -0
- data/spec/appliance-validator-spec.rb +71 -0
- data/spec/helpers/appliance-config-helper-spec.rb +136 -1
- data/spec/helpers/appliance-definition-helper-spec.rb +51 -79
- data/spec/helpers/appliance-transformation-helper-spec.rb +51 -0
- data/spec/helpers/exec-helper-spec.rb +40 -12
- data/spec/helpers/log-helper-spec.rb +1 -0
- data/spec/models/config-spec.rb +2 -1
- data/spec/rspec/src/appliances/0.8.x.appl +38 -0
- data/spec/rspec/src/appliances/0.9.x-invalid.appl +40 -0
- data/spec/rspec/src/appliances/0.9.x.appl +36 -0
- metadata +48 -19
- data/lib/boxgrinder-core/validators/appliance-config-validator.rb +0 -65
@@ -22,32 +22,33 @@ require 'hashery/opencascade'
|
|
22
22
|
module BoxGrinder
|
23
23
|
class ApplianceConfig
|
24
24
|
def initialize
|
25
|
-
@name
|
26
|
-
@summary
|
25
|
+
@name = nil
|
26
|
+
@summary = nil
|
27
27
|
|
28
|
-
@variables
|
28
|
+
@variables = {}
|
29
29
|
|
30
|
-
@os
|
30
|
+
@os = OpenCascade.new
|
31
31
|
|
32
|
-
@os.name
|
33
|
-
@os.version
|
34
|
-
@os.password
|
32
|
+
@os.name = nil
|
33
|
+
@os.version = nil
|
34
|
+
@os.password = nil
|
35
|
+
@os.pae = true
|
35
36
|
|
36
|
-
@hardware
|
37
|
+
@hardware = OpenCascade.new
|
37
38
|
|
38
|
-
@hardware.cpus
|
39
|
-
@hardware.memory
|
40
|
-
@hardware.network
|
41
|
-
@hardware.partitions = {"/" => {
|
39
|
+
@hardware.cpus = 1
|
40
|
+
@hardware.memory = 256
|
41
|
+
@hardware.network = 'NAT'
|
42
|
+
@hardware.partitions = {"/" => {'size' => 1}}
|
42
43
|
|
43
|
-
@post
|
44
|
+
@post = {}
|
44
45
|
|
45
|
-
@packages
|
46
|
-
@appliances
|
47
|
-
@repos
|
46
|
+
@packages = []
|
47
|
+
@appliances = []
|
48
|
+
@repos = []
|
48
49
|
|
49
|
-
@version
|
50
|
-
@release
|
50
|
+
@version = 1
|
51
|
+
@release = 0
|
51
52
|
end
|
52
53
|
|
53
54
|
attr_reader :variables
|
@@ -72,22 +73,37 @@ module BoxGrinder
|
|
72
73
|
end
|
73
74
|
|
74
75
|
def init_arch
|
75
|
-
@hardware.arch
|
76
|
+
@hardware.arch = `uname -m`.chomp.strip
|
76
77
|
@hardware.base_arch = is64bit? ? "x86_64" : "i386"
|
77
78
|
self
|
78
79
|
end
|
79
80
|
|
80
81
|
def initialize_paths
|
81
|
-
@path
|
82
|
+
@path = OpenCascade.new
|
82
83
|
|
83
|
-
@path.os
|
84
|
-
@path.main
|
84
|
+
@path.os = "#{@os.name}/#{@os.version}"
|
85
|
+
@path.main = "#{@hardware.arch}/#{@path.os}"
|
85
86
|
@path.appliance = "appliances/#{@path.main}/#{@name}"
|
86
|
-
@path.build
|
87
|
+
@path.build = "build/#{@path.appliance}"
|
87
88
|
|
88
89
|
self
|
89
90
|
end
|
90
91
|
|
92
|
+
# Returns default filesystem type for current OS
|
93
|
+
def default_filesystem_type
|
94
|
+
fs = 'ext4'
|
95
|
+
|
96
|
+
case @os.name
|
97
|
+
when 'rhel', 'centos'
|
98
|
+
case @os.version
|
99
|
+
when '5'
|
100
|
+
fs = 'ext3'
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
fs
|
105
|
+
end
|
106
|
+
|
91
107
|
# used to checking if configuration differs from previous in appliance-kickstart
|
92
108
|
def hash
|
93
109
|
"#{@name}-#{@summary}-#{@version}-#{@release}-#{@os.name}-#{@os.version}-#{@os.password}-#{@hardware.cpus}-#{@hardware.memory}-#{@hardware.partitions}-#{@appliances}".hash
|
@@ -36,7 +36,8 @@ module BoxGrinder
|
|
36
36
|
:dir => {
|
37
37
|
:root => Dir.pwd,
|
38
38
|
:build => 'build',
|
39
|
-
:cache => '/var/cache/boxgrinder' # required for appliance-creator
|
39
|
+
:cache => '/var/cache/boxgrinder', # required for appliance-creator
|
40
|
+
:tmp => '/tmp'
|
40
41
|
},
|
41
42
|
:os_config => {},
|
42
43
|
:platform_config => {},
|
@@ -44,9 +45,10 @@ module BoxGrinder
|
|
44
45
|
:additional_plugins => []
|
45
46
|
)
|
46
47
|
|
48
|
+
deep_merge(self, YAML.load_file(self.file)) if File.exists?(self.file)
|
47
49
|
merge!(values.inject({}) { |memo, (k, v)| memo[k.to_sym] = v; memo })
|
48
50
|
|
49
|
-
|
51
|
+
self.backtrace = true if [:debug, :trace].include?(self.log_level)
|
50
52
|
end
|
51
53
|
|
52
54
|
def deep_merge(first, second)
|
@@ -0,0 +1,95 @@
|
|
1
|
+
#0.8.x schema
|
2
|
+
version: 0.8.0
|
3
|
+
type: map
|
4
|
+
mapping:
|
5
|
+
"name":
|
6
|
+
type: str
|
7
|
+
length: { min: 1 }
|
8
|
+
required: yes
|
9
|
+
"summary":
|
10
|
+
type: str
|
11
|
+
length: { min: 1 }
|
12
|
+
"version":
|
13
|
+
type: int
|
14
|
+
"release":
|
15
|
+
type: int
|
16
|
+
"os":
|
17
|
+
type: map
|
18
|
+
mapping:
|
19
|
+
"name":
|
20
|
+
type: str
|
21
|
+
length: { min: 1 }
|
22
|
+
required: yes
|
23
|
+
"version":
|
24
|
+
type: text
|
25
|
+
required: yes
|
26
|
+
"password":
|
27
|
+
type: str
|
28
|
+
"hardware":
|
29
|
+
type: map
|
30
|
+
name: Hardware
|
31
|
+
mapping:
|
32
|
+
"cpus":
|
33
|
+
type: int
|
34
|
+
range: { min: 1, max: 4 }
|
35
|
+
"memory":
|
36
|
+
type: int
|
37
|
+
range: { min: 1 }
|
38
|
+
"partitions":
|
39
|
+
type: map
|
40
|
+
mapping:
|
41
|
+
"=": #No way of providing validation regex for wildcard name.
|
42
|
+
type: map
|
43
|
+
mapping:
|
44
|
+
"size":
|
45
|
+
type: number
|
46
|
+
range: { min: 0.01 }
|
47
|
+
"type":
|
48
|
+
type: str
|
49
|
+
enum: [ext3, ext4]
|
50
|
+
"appliances":
|
51
|
+
type: seq
|
52
|
+
sequence:
|
53
|
+
- type: str
|
54
|
+
pattern: /^[^\/]+$/ #dont support path resolution yet
|
55
|
+
length: { min: 1 }
|
56
|
+
"packages":
|
57
|
+
type: map
|
58
|
+
mapping:
|
59
|
+
"includes": &pkg
|
60
|
+
type: seq
|
61
|
+
sequence:
|
62
|
+
- type: str
|
63
|
+
pattern: /^[\w\-+.@\043]+$/ #fedora packaging standard http://bit.ly/h0JN9u (plus a few more, disallow symbols/spaces)
|
64
|
+
length: { min: 1 }
|
65
|
+
"excludes": *pkg
|
66
|
+
"repos":
|
67
|
+
type: seq
|
68
|
+
sequence:
|
69
|
+
- type: map
|
70
|
+
mapping:
|
71
|
+
"name":
|
72
|
+
type: str
|
73
|
+
pattern: /^[\w\-+.\043]+$/
|
74
|
+
length: { min: 1 }
|
75
|
+
required: yes
|
76
|
+
"baseurl": &pkg-mirror
|
77
|
+
type: str
|
78
|
+
pattern: /(^((http|ftp):)(\/\/([^\/?\043]*))?([^?\043]*)(\?([^\043]*))?(\043(.*))?$|^file:\/\/.+$)/ #customised rfc3986 standard regexp for URIs
|
79
|
+
"mirrorlist": *pkg-mirror
|
80
|
+
"ephemeral":
|
81
|
+
type: bool
|
82
|
+
"post":
|
83
|
+
type: map
|
84
|
+
mapping:
|
85
|
+
"=":
|
86
|
+
type: seq
|
87
|
+
sequence:
|
88
|
+
- type: str
|
89
|
+
length: { min: 1 }
|
90
|
+
"variables":
|
91
|
+
type: map
|
92
|
+
mapping:
|
93
|
+
"=": # wibble: value
|
94
|
+
type: str
|
95
|
+
length: { min: 1 }
|
@@ -0,0 +1,92 @@
|
|
1
|
+
#0.9.x schema
|
2
|
+
version: 0.9.0
|
3
|
+
type: map
|
4
|
+
mapping:
|
5
|
+
"name":
|
6
|
+
type: str
|
7
|
+
length: { min: 1 }
|
8
|
+
required: yes
|
9
|
+
"summary":
|
10
|
+
type: str
|
11
|
+
length: { min: 1 }
|
12
|
+
"version":
|
13
|
+
type: int
|
14
|
+
"release":
|
15
|
+
type: int
|
16
|
+
"os":
|
17
|
+
type: map
|
18
|
+
mapping:
|
19
|
+
"name":
|
20
|
+
type: str
|
21
|
+
length: { min: 1 }
|
22
|
+
required: yes
|
23
|
+
"version":
|
24
|
+
type: text
|
25
|
+
required: yes
|
26
|
+
"password":
|
27
|
+
type: str
|
28
|
+
"hardware":
|
29
|
+
type: map
|
30
|
+
name: Hardware
|
31
|
+
mapping:
|
32
|
+
"cpus":
|
33
|
+
type: int
|
34
|
+
range: { min: 1, max: 4 }
|
35
|
+
"memory":
|
36
|
+
type: int
|
37
|
+
range: { min: 1 }
|
38
|
+
"partitions":
|
39
|
+
type: map
|
40
|
+
mapping:
|
41
|
+
"=": #No way of providing validation regex for wildcard name.
|
42
|
+
type: map
|
43
|
+
mapping:
|
44
|
+
"size":
|
45
|
+
type: number
|
46
|
+
range: { min: 0.01 }
|
47
|
+
"type":
|
48
|
+
type: str
|
49
|
+
enum: [ext3, ext4]
|
50
|
+
"appliances":
|
51
|
+
type: seq
|
52
|
+
sequence:
|
53
|
+
- type: str
|
54
|
+
pattern: /^[^\/]+$/ #dont support path resolution yet
|
55
|
+
length: { min: 1 }
|
56
|
+
"packages":
|
57
|
+
type: seq
|
58
|
+
sequence:
|
59
|
+
- type: str
|
60
|
+
pattern: /^[\w\-+.@\043]+$/ #fedora packaging standard http://bit.ly/h0JN9u (plus a few more, disallow symbols/spaces)
|
61
|
+
length: { min: 1 }
|
62
|
+
"repos":
|
63
|
+
type: seq
|
64
|
+
sequence:
|
65
|
+
- type: map
|
66
|
+
name: Repository
|
67
|
+
mapping:
|
68
|
+
"name":
|
69
|
+
type: str
|
70
|
+
pattern: /^[\w\-+.\043]+$/
|
71
|
+
length: { min: 1 }
|
72
|
+
required: yes
|
73
|
+
"baseurl": &pkg-mirror
|
74
|
+
type: str
|
75
|
+
pattern: /(^((http|ftp):)(\/\/([^\/?\043]*))?([^?\043]*)(\?([^\043]*))?(\043(.*))?$|^file:\/\/.+$)/ #customised rfc3986 standard regexp for URIs
|
76
|
+
"mirrorlist": *pkg-mirror
|
77
|
+
"ephemeral":
|
78
|
+
type: bool
|
79
|
+
"post":
|
80
|
+
type: map
|
81
|
+
mapping:
|
82
|
+
"=":
|
83
|
+
type: seq
|
84
|
+
sequence:
|
85
|
+
- type: str
|
86
|
+
length: { min: 1 }
|
87
|
+
"variables":
|
88
|
+
type: map
|
89
|
+
mapping:
|
90
|
+
"=": # wibble: value
|
91
|
+
type: str
|
92
|
+
length: { min: 1 }
|
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Summary: Core library for BoxGrinder
|
7
7
|
Name: rubygem-%{gemname}
|
8
|
-
Version: 0.3.
|
8
|
+
Version: 0.3.1
|
9
9
|
Release: 1%{?dist}
|
10
10
|
Group: Development/Languages
|
11
11
|
License: LGPLv3+
|
@@ -16,12 +16,14 @@ BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
|
|
16
16
|
Requires: ruby(abi) = %{rubyabi}
|
17
17
|
Requires: rubygem(open4)
|
18
18
|
Requires: rubygem(hashery)
|
19
|
+
Requires: rubygem(kwalify)
|
19
20
|
|
20
21
|
BuildRequires: rubygem(rake)
|
21
22
|
BuildRequires: rubygem(rspec)
|
22
23
|
BuildRequires: rubygem(open4)
|
23
24
|
BuildRequires: rubygem(hashery)
|
24
25
|
BuildRequires: rubygem(echoe)
|
26
|
+
BuildRequires: rubygem(kwalify)
|
25
27
|
|
26
28
|
BuildArch: noarch
|
27
29
|
Provides: rubygem(%{gemname}) = %{version}
|
@@ -74,6 +76,16 @@ popd
|
|
74
76
|
%{gemdir}/doc/%{gemname}-%{version}
|
75
77
|
|
76
78
|
%changelog
|
79
|
+
* Thu Mar 17 2011 <mgoldman@redhat.com> - 0.3.1-1
|
80
|
+
- Upstream release: 0.3.1
|
81
|
+
- [BGBUILD-164] Guestfs writes to /tmp/ by default, potentially filling the root filesystem
|
82
|
+
- [BGBUILD-97] some filesystems dont get unmounted on BG interruption
|
83
|
+
- [BGBUILD-155] Images built on Centos5.x (el5) for VirtualBox kernel panic (/dev/root missing)
|
84
|
+
- [BGBUILD-190] Allow to specify kernel variant (PAE or not) for Fedora OS
|
85
|
+
- [BGBUILD-192] Use IO.popen4 instead open4 gem on JRuby
|
86
|
+
- [BGBUILD-198] root password is not inherited
|
87
|
+
- [BGBUILD-156] Validate appliance definition files early and return meaningful error messages
|
88
|
+
|
77
89
|
* Sat Mar 05 2011 <mgoldman@redhat.com> - 0.3.0-1
|
78
90
|
- Upstream release: 0.3.0
|
79
91
|
- [BGBUILD-178] Remove sensitive data from logs
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2010 Red Hat, Inc.
|
3
|
+
#
|
4
|
+
# This is free software; you can redistribute it and/or modify it
|
5
|
+
# under the terms of the GNU Lesser General Public License as
|
6
|
+
# published by the Free Software Foundation; either version 3 of
|
7
|
+
# the License, or (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This software is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
12
|
+
# Lesser General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
15
|
+
# License along with this software; if not, write to the Free
|
16
|
+
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
17
|
+
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
18
|
+
|
19
|
+
require 'rubygems'
|
20
|
+
require 'boxgrinder-core/appliance-parser'
|
21
|
+
require 'boxgrinder-core/helpers/log-helper'
|
22
|
+
|
23
|
+
module BoxGrinder
|
24
|
+
describe ApplianceParser do
|
25
|
+
before(:each) do
|
26
|
+
@log = LogHelper.new(:level => :trace, :type => :stdout)
|
27
|
+
@parser = ApplianceParser.new(:log => @log)
|
28
|
+
end
|
29
|
+
|
30
|
+
describe ".load_schemas" do
|
31
|
+
it "should load all available schemas" do
|
32
|
+
Kwalify::Yaml.should_receive(:load_file).with('filea').and_return({'version' => '0.8.0'})
|
33
|
+
Kwalify::Yaml.should_receive(:load_file).with('fileb').and_return({'version' => '0.9.0'})
|
34
|
+
|
35
|
+
Dir.should_receive(:glob).with(an_instance_of(String)).and_return(['filea', 'fileb'])
|
36
|
+
|
37
|
+
@parser.load_schemas
|
38
|
+
@parser.instance_variable_get(:@schemas).should == {'0.8.0' => {'version' => '0.8.0'}, '0.9.0' => {'version' => '0.9.0'}}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe ".parse_definition" do
|
43
|
+
it "should raise exception because the appliance definition is invalid" do
|
44
|
+
@parser.load_schemas
|
45
|
+
|
46
|
+
lambda {
|
47
|
+
@parser.parse_definition(File.read("#{File.dirname(__FILE__)}/rspec/src/appliances/invalid-yaml.appl"), false)
|
48
|
+
}.should raise_error(ApplianceValidationError, "The appliance definition was invalid according to schema 0.9.0. See log for details.")
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should validate 0.9.0 version definition without error" do
|
52
|
+
@parser.load_schemas
|
53
|
+
definition = @parser.parse_definition(File.read("#{File.dirname(__FILE__)}/rspec/src/appliances/0.9.x.appl"), false)
|
54
|
+
|
55
|
+
definition['os']['password'].should == 'boxgrinder-ftw'
|
56
|
+
definition['packages'].size.should == 2
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should validate 0.8.0 version definition without error" do
|
60
|
+
@parser.load_schemas
|
61
|
+
definition = @parser.parse_definition("#{File.dirname(__FILE__)}/rspec/src/appliances/0.8.x.appl")
|
62
|
+
|
63
|
+
definition['os']['password'].should == 'boxgrinder-ftw'
|
64
|
+
definition['packages'].size.should == 3
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2010 Red Hat, Inc.
|
3
|
+
#
|
4
|
+
# This is free software; you can redistribute it and/or modify it
|
5
|
+
# under the terms of the GNU Lesser General Public License as
|
6
|
+
# published by the Free Software Foundation; either version 3 of
|
7
|
+
# the License, or (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This software is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
12
|
+
# Lesser General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
15
|
+
# License along with this software; if not, write to the Free
|
16
|
+
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
17
|
+
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
18
|
+
|
19
|
+
require 'rubygems'
|
20
|
+
require 'boxgrinder-core/appliance-validator'
|
21
|
+
require 'hashery/opencascade'
|
22
|
+
|
23
|
+
module BoxGrinder
|
24
|
+
describe ApplianceValidator do
|
25
|
+
before(:each) do
|
26
|
+
schema = YAML.load_file("#{File.dirname(__FILE__)}/../lib/boxgrinder-core/schemas/appliance_schema_0.9.0.yaml")
|
27
|
+
schema.delete('version')
|
28
|
+
|
29
|
+
@validator = ApplianceValidator.new(schema)
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ".validate_hook" do
|
33
|
+
context "repository" do
|
34
|
+
it "should generate error when no baseurl or mirrorlist is specified for repository" do
|
35
|
+
a = []
|
36
|
+
@validator.validate_hook({}, OpenCascade.new(:name => 'Repository'), '/', a)
|
37
|
+
a.size.should == 1
|
38
|
+
a.first.message.should == 'Please specify either a baseurl or a mirrorlist.'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should generate error when both baseurl and mirrorlist are specified for repository" do
|
42
|
+
a = []
|
43
|
+
@validator.validate_hook({'baseurl' => 'abc', 'mirrorlist' => 'def'}, OpenCascade.new(:name => 'Repository'), '/', a)
|
44
|
+
a.size.should == 1
|
45
|
+
a.first.message.should == 'Please specify either a baseurl or a mirrorlist.'
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should pass if baseurl or mirrorlist is specified for repository" do
|
49
|
+
a = []
|
50
|
+
@validator.validate_hook({'baseurl' => 'abc'}, OpenCascade.new(:name => 'Repository'), '/', a)
|
51
|
+
a.size.should == 0
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "hardware" do
|
56
|
+
it "should allow only multiplicity of 64 for memory" do
|
57
|
+
a = []
|
58
|
+
@validator.validate_hook({'memory' => 235}, OpenCascade.new(:name => 'Hardware'), '/', a)
|
59
|
+
a.size.should == 1
|
60
|
+
a.first.message.should == "Specified memory amount: 235 is invalid. The value must be a multiple of 64."
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should pass if the memory is 256" do
|
64
|
+
a = []
|
65
|
+
@validator.validate_hook({'memory' => 256}, OpenCascade.new(:name => 'Hardware'), '/', a)
|
66
|
+
a.size.should == 0
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -16,7 +16,9 @@
|
|
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 'rubygems'
|
19
20
|
require 'boxgrinder-core/helpers/appliance-config-helper'
|
21
|
+
require 'boxgrinder-core/models/appliance-config'
|
20
22
|
|
21
23
|
module BoxGrinder
|
22
24
|
describe ApplianceConfigHelper do
|
@@ -237,9 +239,33 @@ module BoxGrinder
|
|
237
239
|
|
238
240
|
@helper.merge_partitions
|
239
241
|
|
242
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
243
|
+
config.hardware.partitions.size.should == 3
|
244
|
+
config.hardware.partitions.should == {"/" => {'size' => '4', 'type' => 'ext3'}, "/home" => {'size' => '2', 'type' => 'ext3'}, "/boot" => {'type' => 'ext3', 'size' => 0.1}}
|
245
|
+
end
|
246
|
+
|
247
|
+
it "should merge partitions for default fs_types without options for RHEL 5 (ext3) with /boot partition" do
|
248
|
+
config_a = ApplianceConfig.new
|
249
|
+
config_a.name = 'a'
|
250
|
+
config_a.appliances << 'b'
|
251
|
+
config_a.hardware.partitions = {"/" => {'size' => '2'}}
|
252
|
+
config_a.os.name = 'rhel'
|
253
|
+
config_a.os.version = '5'
|
254
|
+
|
255
|
+
config_b = ApplianceConfig.new
|
256
|
+
config_b.name = 'b'
|
257
|
+
config_b.hardware.partitions = {"/" => {'size' => '4'}, "/boot" => {'size' => '2'}}
|
258
|
+
config_b.os.name = 'rhel'
|
259
|
+
config_b.os.version = '5'
|
260
|
+
|
261
|
+
prepare_helper([config_a, config_b])
|
262
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
263
|
+
|
264
|
+
@helper.merge_partitions
|
265
|
+
|
240
266
|
config = @helper.instance_variable_get(:@appliance_config)
|
241
267
|
config.hardware.partitions.size.should == 2
|
242
|
-
config.hardware.partitions.should == {"/" => {'size' => '4', 'type' => 'ext3'}, "/
|
268
|
+
config.hardware.partitions.should == {"/" => {'size' => '4', 'type' => 'ext3'}, "/boot" => {'size' => '2', 'type' => 'ext3'}}
|
243
269
|
end
|
244
270
|
|
245
271
|
it "should merge partitions with different filesystem types" do
|
@@ -480,5 +506,114 @@ module BoxGrinder
|
|
480
506
|
config.default_repos.should == false
|
481
507
|
end
|
482
508
|
end
|
509
|
+
|
510
|
+
describe ".prepare_os" do
|
511
|
+
it "should set default value for pae" do
|
512
|
+
config_a = ApplianceConfig.new
|
513
|
+
config_a.name = 'a'
|
514
|
+
config_a.appliances << 'b'
|
515
|
+
|
516
|
+
config_b = ApplianceConfig.new
|
517
|
+
config_b.name = 'b'
|
518
|
+
|
519
|
+
prepare_helper([config_a, config_b])
|
520
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
521
|
+
|
522
|
+
@helper.prepare_os
|
523
|
+
|
524
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
525
|
+
config.os.pae.should == true
|
526
|
+
end
|
527
|
+
|
528
|
+
it "should set pae to false if it set so in dependent appliances" do
|
529
|
+
config_a = ApplianceConfig.new
|
530
|
+
config_a.name = 'a'
|
531
|
+
config_a.appliances << 'b'
|
532
|
+
|
533
|
+
config_b = ApplianceConfig.new
|
534
|
+
config_b.name = 'b'
|
535
|
+
config_b.os.pae = false
|
536
|
+
|
537
|
+
prepare_helper([config_a, config_b])
|
538
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
539
|
+
|
540
|
+
@helper.prepare_os
|
541
|
+
|
542
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
543
|
+
config.os.pae.should == false
|
544
|
+
end
|
545
|
+
|
546
|
+
it "should set default value for pae" do
|
547
|
+
config_a = ApplianceConfig.new
|
548
|
+
config_a.name = 'a'
|
549
|
+
config_a.appliances << 'b'
|
550
|
+
|
551
|
+
config_b = ApplianceConfig.new
|
552
|
+
config_b.name = 'b'
|
553
|
+
|
554
|
+
prepare_helper([config_a, config_b])
|
555
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
556
|
+
|
557
|
+
@helper.prepare_os
|
558
|
+
|
559
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
560
|
+
config.os.pae.should == true
|
561
|
+
end
|
562
|
+
|
563
|
+
context "root password" do
|
564
|
+
it "should set default password" do
|
565
|
+
config_a = ApplianceConfig.new
|
566
|
+
config_a.name = 'a'
|
567
|
+
config_a.appliances << 'b'
|
568
|
+
|
569
|
+
config_b = ApplianceConfig.new
|
570
|
+
config_b.name = 'b'
|
571
|
+
|
572
|
+
prepare_helper([config_a, config_b])
|
573
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
574
|
+
|
575
|
+
@helper.prepare_os
|
576
|
+
|
577
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
578
|
+
config.os.password.should == 'boxgrinder'
|
579
|
+
end
|
580
|
+
|
581
|
+
it "should set password from top-level appliance" do
|
582
|
+
config_a = ApplianceConfig.new
|
583
|
+
config_a.name = 'a'
|
584
|
+
config_a.os.password = 'test'
|
585
|
+
config_a.appliances << 'b'
|
586
|
+
|
587
|
+
config_b = ApplianceConfig.new
|
588
|
+
config_b.name = 'b'
|
589
|
+
|
590
|
+
prepare_helper([config_a, config_b])
|
591
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
592
|
+
|
593
|
+
@helper.prepare_os
|
594
|
+
|
595
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
596
|
+
config.os.password.should == 'test'
|
597
|
+
end
|
598
|
+
|
599
|
+
it "should set password from inherited appliance" do
|
600
|
+
config_a = ApplianceConfig.new
|
601
|
+
config_a.name = 'a'
|
602
|
+
config_a.appliances << 'b'
|
603
|
+
|
604
|
+
config_b = ApplianceConfig.new
|
605
|
+
config_b.name = 'b'
|
606
|
+
config_b.os.password = 'test'
|
607
|
+
|
608
|
+
prepare_helper([config_a, config_b])
|
609
|
+
@helper.instance_variable_set(:@appliance_config, config_a.clone)
|
610
|
+
|
611
|
+
@helper.prepare_os
|
612
|
+
|
613
|
+
config = @helper.instance_variable_get(:@appliance_config)
|
614
|
+
config.os.password.should == 'test'
|
615
|
+
end
|
616
|
+
end
|
617
|
+
end
|
483
618
|
end
|
484
619
|
end
|