rspec-system 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,37 @@
1
+ 1.4.0
2
+ =====
3
+
4
+ This release adds the ability to provide a custom prefabs.yml.
5
+
6
+ To define custom prefabs you can now place a `.prefabs.yml` file in your projects root directory.
7
+
8
+ ---
9
+ 'scientific-64-x64':
10
+ description: ""
11
+ facts:
12
+ kernelrelease: "2.6.32-358.el6.x86_64"
13
+ operatingsystem: Scientific
14
+ kernelmajversion: "2.6"
15
+ architecture: x86_64
16
+ facterversion: "1.7.0"
17
+ kernelversion: "2.6.32"
18
+ operatingsystemrelease: "6.4"
19
+ osfamily: RedHat
20
+ kernel: Linux
21
+ rubyversion: "1.8.7"
22
+ provider_specifics:
23
+ vagrant:
24
+ box: 'scientific-64-x64-vb4210-nocm'
25
+ box_url: 'http://example.com/path/to/scientific-64-x64-vb4210-nocm.box'
26
+
27
+ This also supports overriding the built-in prefabs as well, in case you wish to use your own image files - or use a cache host for example.
28
+
29
+ #### Detailed Changes
30
+
31
+ * Allow overriding prefabs including using boxes on local system (Trey Dockendorf)
32
+
33
+ -------------------------------
34
+
1
35
  1.3.0
2
36
  =====
3
37
 
data/README.md CHANGED
@@ -86,7 +86,7 @@ The file must adhere to the Kwalify schema supplied in `resources/kwalify-schema
86
86
 
87
87
  ### Prefabs
88
88
 
89
- Prefabs are 'pre-rolled' virtual images, for now its the only way to specify a template. In the future we will probably allow you to specify your own prefab file, and override prefab settings in a nodeset file as well.
89
+ Prefabs are 'pre-rolled' virtual images, for now its the only way to specify a template.
90
90
 
91
91
  The current built-in prefabs are defined in `resources/prefabs.yml`. The current set are based on boxes hosted on <http://puppet-vagrant-boxes.puppetlabs.com> as they have been built by myself and are generally trusted and have a reproducable build cycle (they aren't just 'golden images'). In the future I'll probably expand that list, but attempt to stick to boxes that we have control over.
92
92
 
@@ -96,6 +96,42 @@ For this reason there are various `provider_specific` settings that apply to dif
96
96
 
97
97
  `facts` in the prefab are literally dumps of `facter -p` on the host stored in the prefab file so you can look them up without addressing the machine. These are accessed using the `system_node#facts` method on the helper results and can be used in conditional logic during test runs and setup tasks. Not all the facts are supplied, only the more interesting ones.
98
98
 
99
+ #### Custom Prefabs
100
+
101
+ To define custom prefabs place a `.prefabs.yml` file in your project's root directory.
102
+
103
+ ---
104
+ 'scientific-64-x64':
105
+ description: ""
106
+ facts:
107
+ kernelrelease: "2.6.32-358.el6.x86_64"
108
+ operatingsystem: Scientific
109
+ kernelmajversion: "2.6"
110
+ architecture: x86_64
111
+ facterversion: "1.7.0"
112
+ kernelversion: "2.6.32"
113
+ operatingsystemrelease: "6.4"
114
+ osfamily: RedHat
115
+ kernel: Linux
116
+ rubyversion: "1.8.7"
117
+ provider_specifics:
118
+ vagrant:
119
+ box: 'scientific-64-x64-vb4210-nocm'
120
+ box_url: 'http://example.com/path/to/scientific-64-x64-vb4210-nocm.box'
121
+
122
+ #### Overriding Prefabs
123
+
124
+ The custom prefab file, `.prefabs.yml` can also be used to override any of the built-in Prefabs.
125
+
126
+ For example, to use a different box for CentOS 6.4 x64, you can override the `box_url`. The example below overrides the URL to use the box with configuration management already installed.
127
+
128
+ ---
129
+ 'centos-64-x64':
130
+ provider_specifics:
131
+ vagrant:
132
+ box: 'centos-64-x64-vbox4210'
133
+ box_url: 'http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box'
134
+
99
135
  ### Running tests
100
136
 
101
137
  There are two providers at the moment you can use to launch your nodes for testing:
@@ -7,10 +7,12 @@ module RSpecSystem
7
7
  # @param nodeset [RSpecSystem::Node] nodeset that this node belongs to
8
8
  # @param k [String] name of node
9
9
  # @param v [Hash<String,String>] hash configuration as given from the nodeset yaml file
10
+ # @param custom_prefabs_path [String] path of custom prefabs yaml file
10
11
  # @return [RSpecSystem::Node] returns a new node object
11
- def self.node_from_yaml(nodeset, k, v)
12
+ def self.node_from_yaml(nodeset, k, v, custom_prefabs_path)
12
13
  RSpecSystem::Node.new(
13
14
  :nodeset => nodeset,
15
+ :custom_prefabs_path => custom_prefabs_path,
14
16
  :name => k,
15
17
  :prefab => v['prefab']
16
18
  )
@@ -23,16 +25,19 @@ module RSpecSystem
23
25
  # @option options [String] :prefab prefab setting. Mandatory.
24
26
  # @option options [RSpecSystem::NodeSet] :nodeset the parent nodeset for
25
27
  # this node. Mandatory.
28
+ # @option options [String] :custom_prefabs_path path of custom prefabs
29
+ # yaml file. Optional.
26
30
  def initialize(options)
27
31
  @name = options[:name]
28
32
  prefab = options[:prefab]
29
33
  @nodeset = options[:nodeset]
34
+ @custom_prefabs_path = options[:custom_prefabs_path]
30
35
 
31
36
  if prefab.nil?
32
37
  # TODO: do not support not prefabs yet
33
38
  raise "No prefab defined, bailing"
34
39
  else
35
- @prefab = RSpecSystem::Prefab.prefab(prefab)
40
+ @prefab = RSpecSystem::Prefab.prefab(prefab, custom_prefabs_path)
36
41
  @facts = @prefab.facts
37
42
  @provider_specifics = @prefab.provider_specifics
38
43
  end
@@ -5,12 +5,12 @@ module RSpecSystem
5
5
  #
6
6
  # @return [RSpecSystem::NodeSet::Base] returns an object based on the Base
7
7
  # abstract class.
8
- def self.create(setname, config, virtual_env, options)
8
+ def self.create(setname, config, virtual_env, custom_prefabs_path, options)
9
9
  case(virtual_env)
10
10
  when 'vagrant'
11
- RSpecSystem::NodeSet::Vagrant.new(setname, config, options)
11
+ RSpecSystem::NodeSet::Vagrant.new(setname, config, custom_prefabs_path, options)
12
12
  when 'vsphere'
13
- RSpecSystem::NodeSet::Vsphere.new(setname, config, options)
13
+ RSpecSystem::NodeSet::Vsphere.new(setname, config, custom_prefabs_path, options)
14
14
  else
15
15
  raise "Unsupported virtual environment #{virtual_env}"
16
16
  end
@@ -6,18 +6,20 @@ module RSpecSystem
6
6
  class NodeSet::Base
7
7
  attr_reader :config
8
8
  attr_reader :setname
9
+ attr_reader :custom_prefabs_path
9
10
  attr_reader :nodes
10
11
  attr_reader :destroy
11
12
 
12
13
  # Create new NodeSet, populating necessary data structures.
13
- def initialize(setname, config, options)
14
+ def initialize(setname, config, custom_prefabs_path, options)
14
15
  @setname = setname
15
16
  @config = config
17
+ @custom_prefabs_path = custom_prefabs_path
16
18
  @destroy = options[:destroy]
17
19
 
18
20
  @nodes = {}
19
21
  config['nodes'].each do |k,v|
20
- @nodes[k] = RSpecSystem::Node.node_from_yaml(self, k, v)
22
+ @nodes[k] = RSpecSystem::Node.node_from_yaml(self, k, v, custom_prefabs_path)
21
23
  end
22
24
  end
23
25
 
@@ -14,8 +14,9 @@ module RSpecSystem
14
14
  #
15
15
  # @param setname [String] name of the set to instantiate
16
16
  # @param config [Hash] nodeset configuration hash
17
+ # @param custom_prefabs_path [String] path of custom prefabs yaml file
17
18
  # @param options [Hash] options Hash
18
- def initialize(setname, config, options)
19
+ def initialize(setname, config, custom_prefabs_path, options)
19
20
  super
20
21
  @vagrant_path = File.expand_path(File.join(RSpec.configuration.system_tmp, 'vagrant_projects', setname))
21
22
  end
@@ -134,16 +135,16 @@ module RSpecSystem
134
135
 
135
136
  ps = v.provider_specifics['vagrant']
136
137
 
137
- f.write(<<-EOS)
138
- c.vm.define '#{k}' do |v|
139
- v.vm.host_name = '#{k}'
140
- v.vm.box = '#{ps['box']}'
141
- v.vm.box_url = '#{ps['box_url']}'
142
- v.vm.base_mac = '#{randmac}'
143
- end
144
- EOS
138
+ node_config = " c.vm.define '#{k}' do |v|\n"
139
+ node_config << " v.vm.host_name = '#{k}'\n"
140
+ node_config << " v.vm.box = '#{ps['box']}'\n"
141
+ node_config << " v.vm.box_url = '#{ps['box_url']}'\n" unless ps['box_url'].nil?
142
+ node_config << " v.vm.base_mac = '#{randmac}'\n"
143
+ node_config << " end\n"
144
+
145
+ f.write(node_config)
145
146
  end
146
- f.write('end')
147
+ f.write("end\n")
147
148
  end
148
149
  log.debug "[Vagrant#create_vagrantfile] Finished creating vagrant file"
149
150
  nil
@@ -15,8 +15,9 @@ module RSpecSystem
15
15
  #
16
16
  # @param setname [String] name of the set to instantiate
17
17
  # @param config [Hash] nodeset configuration hash
18
+ # @param custom_prefabs_path [String] path of custom prefabs yaml file
18
19
  # @param options [Hash] options Hash
19
- def initialize(setname, config, options)
20
+ def initialize(setname, config, custom_prefabs_path, options)
20
21
  super
21
22
  @vim = RbVmomi::VIM.connect(
22
23
  :host => ENV["RSPEC_VSPHERE_HOST"],
@@ -7,8 +7,15 @@ module RSpecSystem
7
7
  attr_reader :provider_specifics
8
8
 
9
9
  # Return prefab object based on name
10
- def self.prefab(name)
10
+ def self.prefab(name, custom_prefabs_path)
11
+ if File.exists?(custom_prefabs_path)
12
+ custom_prefabs = YAML.load_file(custom_prefabs_path)
13
+ else
14
+ custom_prefabs = {}
15
+ end
16
+
11
17
  prefabs = YAML.load_file(File.join(File.dirname(__FILE__), '..', '..', 'resources', 'prefabs.yml'))
18
+ prefabs.merge!(custom_prefabs)
12
19
  raise "No such prefab" unless pf = prefabs[name]
13
20
 
14
21
  RSpecSystem::Prefab.new(
@@ -22,6 +22,10 @@ RSpec.configure do |c|
22
22
  Pathname.new(File.join(File.basename(__FILE__), '..', '.nodeset.yml'))
23
23
  end
24
24
 
25
+ def custom_prefabs_path
26
+ File.expand_path(File.join(File.basename(__FILE__), '..', '.prefabs.yml'))
27
+ end
28
+
25
29
  def rspec_system_config
26
30
  YAML.load_file('.nodeset.yml')
27
31
  end
@@ -42,7 +46,7 @@ RSpec.configure do |c|
42
46
  config = rspec_system_config['sets'][setname]
43
47
  options = {}
44
48
  options[:destroy] = rspec_destroy
45
- RSpecSystem::NodeSet.create(setname, config, rspec_virtual_env, options)
49
+ RSpecSystem::NodeSet.create(setname, config, rspec_virtual_env, custom_prefabs_path, options)
46
50
  end
47
51
 
48
52
  def start_nodes
@@ -2,7 +2,7 @@
2
2
  Gem::Specification.new do |s|
3
3
  # Metadata
4
4
  s.name = "rspec-system"
5
- s.version = "1.3.0"
5
+ s.version = "1.4.0"
6
6
  s.authors = ["Ken Barber"]
7
7
  s.email = ["ken@bob.sh"]
8
8
  s.homepage = "https://github.com/puppetlabs/rspec-system"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-system
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-28 00:00:00.000000000 Z
12
+ date: 2013-05-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec