vagrant-config_builder 0.7.1 → 0.8.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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OGY5Y2JhMzAxMmUxMjU0NjIxMDIyNWFiYzUxY2Y3Y2NlYjg5OWYzZQ==
4
+ NzdiNDExYzFlYThhOWYwZDUyNGYzMWUzMDEwZDc3MTNmMDIwNjQ1NQ==
5
5
  data.tar.gz: !binary |-
6
- MDVmMjllYTcwYjIwMzBhOTA4ZGQxZDMzM2EwN2QwMmRmMTdhZGNhNA==
6
+ MTk1ZDczYzU4ZjhlOGI5YjIwMjE2ZmMzMTVjZjk1MjcyMDMyOTgwOQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZGU3MjdjNGUwMmMwNmI0OGFkY2EzZWUxNTllNDRmZTIxMjVhNGJjMmJkMjE2
10
- NWNlMzhlNzU5NmNhNWU5MTc5OGE3MzQ2ZmVjZmM4NTY4YjMwNjlmMTllZjc0
11
- OTg1MTZmYzlmNzI2NmU2MDQxMmM1OTYwYzhlN2I4ZjBmYTE1OTc=
9
+ OWJiOGMxNzI1N2M2NmZhY2NhN2E5MWM4ZGQyZjdiYjhmOWU4YjY5OGI0MTUx
10
+ ODYxMmQ4MjFhOTA1NjU3NzZhM2VhYTUyYTAzMTczODUwODk3OTcxZjYyNjhm
11
+ ZTdkZDE5MGE2MDRlN2U0NjJiM2EwNzFhNmYzMGI1YWMwYmY0Mzg=
12
12
  data.tar.gz: !binary |-
13
- NWZlNTA2ZGJkNDJiY2I2ZDZjMDE0Y2IyMjRmYmI1NjZhYzE3ZjM3ZDk5NmZh
14
- NzIwMDVhYmQxZWZiNDI0OTY0MDkwZjI3YmI0MWZjNDNlMTI3ZTNhMDFkYjcz
15
- YjExZjJiM2E3ZmYwNWM5YjY0MzMwZGI0YTAxNWUyM2JjYjY0YTY=
13
+ OGNjZGQ0MjRlOGUzMmQwODY2MGMyNDEyYmRjNWZjNWRhYjQ4MjVmYTBkNDcy
14
+ NTFiOWY0YjI2M2UzNTJhYjkzNmUwZjU2MDIxYWVjOTQ1MGZiYTkyM2U0Yzg3
15
+ OWIzNjg3NGQ3NWQxNDIzMzU1YmY2ZDZhY2EzOTU0NDUxYzMzMTg=
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ .bundle
2
+ .yardoc
3
+ doc
data/.yardopts ADDED
@@ -0,0 +1,5 @@
1
+ -
2
+ README.markdown
3
+ docs/GettingStarted.markdown
4
+ CHANGELOG
5
+ LICENSE
data/CHANGELOG CHANGED
@@ -1,6 +1,13 @@
1
1
  CHANGELOG
2
2
  =========
3
3
 
4
+ 0.8.0
5
+ -----
6
+
7
+ 2014-05-02
8
+
9
+ * (GH-16) Add vmware_fusion provider implementation.
10
+
4
11
  0.7.1
5
12
  -----
6
13
 
data/Gemfile CHANGED
@@ -7,6 +7,8 @@ group :development do
7
7
  # gem dependency because we expect to be installed within the
8
8
  # Vagrant environment itself using `vagrant plugin`.
9
9
  gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git"
10
+ gem "yard"
11
+ gem "redcarpet"
10
12
  end
11
13
 
12
14
  if File.exists? "#{__FILE__}.local"
@@ -0,0 +1,175 @@
1
+ # @title Getting Started
2
+
3
+ # Getting Started
4
+
5
+ The vagrant-config_builder plugin is designed to ease the management of complex Vagrant setups.
6
+ This goal is accomplished by moving configuration data out of the Vagrant DSL and into formats that excel at expressing hierarchical information.
7
+ Moving the configuration to a dedicated data structure allows multiple VMs to be defined by composing and remixing a set of common components.
8
+ This guide describes:
9
+
10
+ - How to transition a Vagrant configuration to a ConfigBuilder data structure.
11
+
12
+ - How vagrant-config_builder maps that structure back to a Vagrant configuration.
13
+
14
+ - The methodology that vagrant-config_builder uses to manage components of configuration shared by multiple VMs.
15
+
16
+
17
+ ## Expressing Configuration as Data
18
+
19
+ This guide will walk through re-implementing the following Vagrantfile using vagrant-config_builder:
20
+
21
+ ```ruby
22
+ # Vagrantfile
23
+
24
+ # Requires the following plugins:
25
+ #
26
+ # - vagrant-hosts
27
+ # - vagrant-auto_network
28
+ #
29
+ Vagrant.configure('2') do |config|
30
+
31
+ box_url = 'http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210-nocm.box'
32
+ box_name = 'centos-64-x64-vbox4210-nocm'
33
+
34
+ config.vm.define :puppetmaster do |node|
35
+ node.vm.box_url = box_url
36
+ node.vm.box = box_name
37
+
38
+ node.vm.hostname = 'puppetmaster.boxnet'
39
+
40
+ node.vm.network :private_network, :ip => '0.0.0.0', :auto_network => true
41
+ node.vm.provision :hosts
42
+
43
+ node.vm.provision :shell, :inline => <<-EOF
44
+ if which puppet > /dev/null 2>&1; then
45
+ echo 'Puppet Installed.'
46
+ else
47
+ echo 'Installing Puppet Master.'
48
+ rpm -ivh http://yum.puppetlabs.com/el/6/products/i386/puppetlabs-release-6-6.noarch.rpm
49
+ yum --nogpgcheck -y install puppet-server
50
+ echo '*.boxnet' > /etc/puppet/autosign.conf
51
+ /usr/bin/puppet resource service iptables ensure=stopped enable=false
52
+ /usr/bin/puppet resource service puppetmaster ensure=running enable=true
53
+ fi
54
+ EOF
55
+ end
56
+
57
+ config.vm.define :puppetagent do |node|
58
+ node.vm.box_url = box_url
59
+ node.vm.box = box_name
60
+
61
+ node.vm.hostname = 'puppetagent.boxnet'
62
+
63
+ node.vm.network :private_network, :ip => '0.0.0.0', :auto_network => true
64
+ node.vm.provision :hosts
65
+
66
+ node.vm.provision :shell, :inline => <<-EOF
67
+ if which puppet > /dev/null 2>&1; then
68
+ echo 'Puppet Installed.'
69
+ else
70
+ echo 'Installing Puppet Agent.'
71
+ rpm -ivh http://yum.puppetlabs.com/el/6/products/i386/puppetlabs-release-6-6.noarch.rpm
72
+ yum --nogpgcheck -y install puppet
73
+ fi
74
+ EOF
75
+ end
76
+
77
+ end
78
+ ```
79
+
80
+ The above listing showcases several examples of duplicated configuration: both VMs are using the same Vagrant box, both are configuring their networks in the same way and both are provisioned using nearly identical shell scripts.
81
+ In fact, the only real difference between the VMs are the hostnames and the few lines of shell that install and configure the Puppet master instead or the Puppet agent.
82
+ These little bits of shared configuration pop up constantly in multi-machine Vagrant environments and are commonly handled by a combination of copy-and-paste and factoring out bits of data and configuration into variables or methods (such as `box_name` and `box_url` used above).
83
+ There are some significant drawbacks to this situation:
84
+
85
+ - Copy and paste quickly becomes expensive to maintain as the number of machines in the environment increases.
86
+
87
+ - Factoring configuration out to variables and methods can help, but requires care to produce something that is portable and reusable across environments.
88
+
89
+ - Determining which bits of configuration are shared among which machines is a challenging task to complete quickly and usually requires a careful reading of the Vagrantfile.
90
+
91
+ vagrant-config_builder approaches this problem by storing every bit of configuration in a unified data structure.
92
+ The structure can be loaded from any data source that is convertable to a hash such as YAML, JSON, XML (possibly [interpretive dance][oscar data sources]).
93
+ Generation of configuration hashes from data sources is implemented through the `ConfigBuilder::Loader` module and is completely pluggable.
94
+ This guide will use YAML as the configuration storage format as vagrant-config_builder includes a YAML Loader.
95
+
96
+ If the Vagrantfile above were to be translated to YAML, it would look like this:
97
+
98
+ ```yaml
99
+ # config/vms.yaml
100
+ ---
101
+ vms:
102
+ - name: puppetmaster
103
+ box_url: http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210-nocm.box
104
+ box: centos-64-x64-vbox4210-nocm
105
+ hostname: puppetmaster.boxnet
106
+ private_networks:
107
+ - {ip: 0.0.0.0, auto_network: true}
108
+ provisioners:
109
+ - type: hosts
110
+ - type: shell
111
+ inline: |
112
+ if which puppet > /dev/null 2>&1; then
113
+ echo 'Puppet Installed.'
114
+ else
115
+ echo 'Installing Puppet Master.'
116
+ rpm -ivh http://yum.puppetlabs.com/el/6/products/i386/puppetlabs-release-6-6.noarch.rpm
117
+ yum --nogpgcheck -y install puppet-server
118
+ echo '*.boxnet' > /etc/puppet/autosign.conf
119
+ /usr/bin/puppet resource service iptables ensure=stopped enable=false
120
+ /usr/bin/puppet resource service puppetmaster ensure=running enable=true
121
+ fi
122
+
123
+ - name: puppetagent
124
+ box_url: http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210-nocm.box
125
+ box: centos-64-x64-vbox4210-nocm
126
+ hostname: puppetagent.boxnet
127
+ private_networks:
128
+ - {ip: 0.0.0.0, auto_network: true}
129
+ provisioners:
130
+ - type: hosts
131
+ - type: shell
132
+ inline: |
133
+ if which puppet > /dev/null 2>&1; then
134
+ echo 'Puppet Installed.'
135
+ else
136
+ echo 'Installing Puppet Master.'
137
+ rpm -ivh http://yum.puppetlabs.com/el/6/products/i386/puppetlabs-release-6-6.noarch.rpm
138
+ yum --nogpgcheck -y install puppet
139
+ fi
140
+ ```
141
+ The YAML configuration above maps very closely to the original Vagrant DSL.
142
+ The major differences are:
143
+
144
+ - Repetitive bits of syntax such as `config.vm.*` and `node.vm.*` are now expressed implicitly through the structure of the data.
145
+
146
+ - Operations that are executed multiple times are expressed as arrays. These are:
147
+
148
+ - Defining VMs.
149
+
150
+ - Defining network interfaces on VMs.
151
+
152
+ - Running provisioners on VMs.
153
+
154
+ The mapping between the ConfigBuilder data and the original Vagrantfile will be covered in detail in the next section.
155
+ With the YAML configuration saved in `config/vms.yaml`, the Vagrantfile can updated to invoke `ConfigBuilder.load`:
156
+
157
+ ```ruby
158
+ # Vagrantfile
159
+
160
+ # Requires the following plugins:
161
+ #
162
+ # - vagrant-hosts
163
+ # - vagrant-auto_network
164
+ # - vagrant-config_builder
165
+ #
166
+ Vagrant.configure('2', &ConfigBuilder.load(
167
+ :yaml,
168
+ :yamldir,
169
+ File.expand_path('../config', __FILE__)
170
+ ))
171
+ ```
172
+
173
+ This calls the `yamldir` method of the YAML Loader and passes a path to a `config` directory located adjacent to the Vagrantfile.
174
+
175
+ [oscar data sources]: http://www.youtube.com/watch?v=1TgGQjjLDXg&t=19m27s
@@ -38,6 +38,7 @@ module ConfigBuilder
38
38
  end
39
39
 
40
40
  require 'config_builder/model/provider/virtualbox'
41
+ require 'config_builder/model/provider/vmware_fusion'
41
42
  end
42
43
 
43
44
  module Provisioner
@@ -0,0 +1,36 @@
1
+ # @see http://docs.vagrantup.com/v2/vmware/configuration.html
2
+ class ConfigBuilder::Model::Provider::VMwareFusion < ConfigBuilder::Model::Base
3
+
4
+ # @!attribute [rw] vmx
5
+ # @return [Hash<String, String>] A hash of VMX options for the given VM
6
+ # @example
7
+ # model.vmx = {
8
+ # 'memsize' => '1024',
9
+ # 'numvcpus' => '2',
10
+ # }
11
+ def_model_attribute :vmx
12
+
13
+ # @!attribute [rw] gui
14
+ # @return [Boolean] Whether the GUI should be launched when the VM is created
15
+ def_model_attribute :gui
16
+
17
+ def initialize
18
+ @defaults = {
19
+ :gui => false,
20
+ :vmx => {},
21
+ }
22
+ end
23
+
24
+ def to_proc
25
+ Proc.new do |vm_config|
26
+ vm_config.provider 'vmware_fusion' do |fusion_config|
27
+ fusion_config.gui = attr(:gui)
28
+ attr(:vmx).each_pair do |key, value|
29
+ fusion_config.vmx[key] = value
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ ConfigBuilder::Model::Provider.register('vmware_fusion', self)
36
+ end
@@ -1,3 +1,3 @@
1
1
  module ConfigBuilder
2
- VERSION = '0.7.1'
2
+ VERSION = '0.8.0'
3
3
  end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'config_builder/model'
3
+
4
+ describe ConfigBuilder::Model::Provider::VMwareFusion do
5
+ describe "converting to a proc" do
6
+
7
+ let(:vmx) { Hash.new }
8
+ let(:fusion_config) { double('fusion provider config', :vmx => vmx) }
9
+ let(:vm_config) { double('vagrant VM config', :provider => fusion_config) }
10
+
11
+ before do
12
+ allow(vm_config).to receive(:provider).and_yield(fusion_config)
13
+ end
14
+
15
+ it "assigns the gui value to the fusion provider object" do
16
+ subject.attrs = {:gui => 'guivalue'}
17
+ expect(fusion_config).to receive(:gui=).with('guivalue')
18
+ p = subject.to_proc
19
+ p.call(vm_config)
20
+ end
21
+
22
+ it "assigns the vmx value to the fusion provider object" do
23
+ subject.attrs = {:vmx => {:hello => 'world'}}
24
+ allow(fusion_config).to receive(:gui=)
25
+ subject.call(vm_config)
26
+ expect(vmx).to eq({:hello => 'world'})
27
+ end
28
+ end
29
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-config_builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrien Thebo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-23 00:00:00.000000000 Z
11
+ date: 2014-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deep_merge
@@ -44,10 +44,13 @@ executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files: []
46
46
  files:
47
+ - .gitignore
48
+ - .yardopts
47
49
  - CHANGELOG
48
50
  - Gemfile
49
51
  - LICENSE
50
52
  - README.markdown
53
+ - docs/GettingStarted.markdown
51
54
  - examples/Vagrantfile
52
55
  - examples/roles.yaml
53
56
  - examples/vms.yaml
@@ -66,6 +69,7 @@ files:
66
69
  - lib/config_builder/model/network/forwarded_port.rb
67
70
  - lib/config_builder/model/network/private_network.rb
68
71
  - lib/config_builder/model/provider/virtualbox.rb
72
+ - lib/config_builder/model/provider/vmware_fusion.rb
69
73
  - lib/config_builder/model/provisioner/puppet.rb
70
74
  - lib/config_builder/model/provisioner/puppet_server.rb
71
75
  - lib/config_builder/model/provisioner/shell.rb
@@ -81,6 +85,7 @@ files:
81
85
  - spec/config_builder/filter/boxes_spec.rb
82
86
  - spec/config_builder/filter/roles_spec.rb
83
87
  - spec/config_builder/loader/yaml_spec.rb
88
+ - spec/config_builder/model/provider/vmware_fusion_spec.rb
84
89
  - spec/spec_helper.rb
85
90
  - templates/locales/en.yml
86
91
  - vagrant-config_builder.gemspec