zergrush 0.0.2 → 0.0.4

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/lib/zerg/runner.rb CHANGED
@@ -23,212 +23,29 @@
23
23
 
24
24
  require 'awesome_print'
25
25
  require 'fileutils'
26
- require 'erb'
27
- require 'rbconfig'
28
26
 
29
27
  module Zerg
30
28
  class Runner
31
-
32
- def check_provider(driver, provider)
33
- if driver == "vagrant"
34
- if provider == "aws"
35
- aws_pid = Process.spawn("vagrant plugin list | grep vagrant-aws")
36
- Process.wait(aws_pid)
37
-
38
- if $?.exitstatus != 0
39
- aws_pid = Process.spawn("vagrant plugin install vagrant-aws")
40
- Process.wait(aws_pid)
41
- abort("ERROR: vagrant-aws installation failed!") unless $?.exitstatus == 0
42
- end
43
- elsif provider == "libvirt"
44
- abort("ERROR: libvirt is only supported on a linux host!") unless /linux|arch/i === RbConfig::CONFIG['host_os']
45
-
46
- libvirt_pid = Process.spawn("vagrant plugin list | grep vagrant-libvirt")
47
- Process.wait(libvirt_pid)
48
-
49
- if $?.exitstatus != 0
50
- libvirt_pid = Process.spawn("vagrant plugin install vagrant-libvirt")
51
- Process.wait(libvirt_pid)
52
- abort("ERROR: vagrant-libvirt installation failed! Refer to https://github.com/pradels/vagrant-libvirt to install missing dependencies, if any.") unless $?.exitstatus == 0
53
- end
54
- end
55
- end
56
- end
57
-
58
- # cross platform way of checking if command is available in PATH
59
- def self.which(cmd)
60
- exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
61
- ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
62
- exts.each { |ext|
63
- exe = File.join(path, "#{cmd}#{ext}")
64
- return exe if File.executable? exe
65
- }
66
- end
67
- return nil
68
- end
69
-
70
- def process(taskname, task, debug)
71
- puts ("Will perform task #{taskname} with contents:\n #{task.ai}")
72
-
73
- # render driver template
74
- renderer = DriverRenderer.new(
75
- task["vm"],
76
- taskname,
77
- task["instances"],
78
- task["synced_folders"],
79
- task["tasks"])
80
-
81
- renderer.render
82
-
83
- # do we need additional plugins?
84
- task["tasks"].each { |task|
85
- if task["type"] == "chef_client" || task["type"] == "chef_solo"
86
- omnibus_pid = Process.spawn("vagrant plugin list | grep vagrant-omnibus")
87
- Process.wait(omnibus_pid)
88
-
89
- if $?.exitstatus != 0
90
- omnibus_pid = Process.spawn("vagrant plugin install vagrant-omnibus")
91
- Process.wait(aws_pid)
92
- abort("ERROR: vagrant-omnibus installation failed!") unless $?.exitstatus == 0
93
- end
94
- break;
95
- end
96
- }
97
-
98
-
99
- run(taskname, task["vm"]["driver"]["drivertype"], task["vm"]["driver"]["providertype"], task["instances"], (task["vm"]["keepalive"] == nil) ? false : task["vm"]["keepalive"], debug)
100
- end
101
-
102
- def cleanup(taskname, task, debug)
103
- puts ("Will cleanup task #{taskname}...")
104
-
105
- # TODO: generalize for multiple drivers
106
- # render driver template
107
- renderer = DriverRenderer.new(
108
- task["vm"],
109
- taskname,
110
- task["instances"],
111
- task["synced_folders"],
112
- task["tasks"])
113
- renderer.render
114
-
115
- check_provider(task["vm"]["driver"]["drivertype"], task["vm"]["driver"]["providertype"])
116
-
117
- # run vagrant cleanup
118
- debug_string = (debug == true) ? " --debug" : ""
119
-
120
- for index in 0..task["instances"] - 1
121
- cleanup_pid = Process.spawn(
122
- {
123
- "VAGRANT_CWD" => File.join("#{Dir.pwd}", ".hive", "driver", task["vm"]["driver"]["drivertype"], taskname),
124
- "VAGRANT_DEFAULT_PROVIDER" => task["vm"]["driver"]["providertype"]
125
- },
126
- "vagrant destroy zergling_#{index} --force#{debug_string}")
127
- Process.wait(cleanup_pid)
128
- abort("ERROR: vagrant failed!") unless $?.exitstatus == 0
129
- end
130
-
131
- cleanup_pid = Process.spawn(
132
- {
133
- "VAGRANT_CWD" => File.join("#{Dir.pwd}", ".hive", "driver", task["vm"]["driver"]["drivertype"], taskname)
134
- },
135
- "vagrant box remove zergling_#{taskname}_#{task["vm"]["driver"]["providertype"]}#{debug_string} #{task["vm"]["driver"]["providertype"]}")
136
- Process.wait(cleanup_pid)
137
- end
138
-
139
- def halt(taskname, driver, provider, instances, debug)
140
- puts("Halting all vagrant virtual machines...")
141
- debug_string = (debug == true) ? " --debug" : ""
142
-
143
- # halt all machines
144
- halt_pid = nil
145
- for index in 0..instances - 1
146
- halt_pid = Process.spawn(
147
- {
148
- "VAGRANT_CWD" => File.join("#{Dir.pwd}", ".hive", "driver", driver, taskname),
149
- "VAGRANT_DEFAULT_PROVIDER" => "#{provider}"
150
- },
151
- "vagrant halt zergling_#{index}#{debug_string}")
152
- Process.wait(halt_pid)
153
- abort("ERROR: vagrant halt failed on machine zergling_#{index}!") unless $?.exitstatus == 0
154
- end
155
- end
156
-
157
- def run(taskname, driver, provider, instances, keepalive, debug)
158
- check_provider(driver, provider)
159
-
160
- debug_string = (debug == true) ? " --debug" : ""
161
-
162
- # bring up all of the VMs first.
163
- puts("Starting vagrant in #{File.join("#{Dir.pwd}", ".hive", "driver", driver, taskname)}")
164
- for index in 0..instances - 1
165
- create_pid = Process.spawn(
166
- {
167
- "VAGRANT_CWD" => File.join("#{Dir.pwd}", ".hive", "driver", driver, taskname)
168
- },
169
- "vagrant up zergling_#{index} --no-provision --provider=#{provider}#{debug_string}")
170
- Process.wait(create_pid)
171
-
172
- if $?.exitstatus != 0
173
- puts "ERROR: vagrant failed while creating one of the VMs. Will clean task #{taskname}:"
174
- self.class.clean(taskname, debug)
175
- abort("ERROR: vagrant failed!")
176
- end
177
- end
178
-
179
- puts("Running tasks in vagrant virtual machines...")
180
- # and provision them all at once (sort of)
181
- provisioners = Array.new
182
- provision_pid = nil
183
- for index in 0..instances - 1
184
- provision_pid = Process.spawn(
185
- {
186
- "VAGRANT_CWD" => File.join("#{Dir.pwd}", ".hive", "driver", driver, taskname),
187
- "VAGRANT_DEFAULT_PROVIDER" => "#{provider}"
188
- },
189
- "vagrant provision zergling_#{index}#{debug_string}")
190
- provisioners.push({:name => "zergling_#{index}", :pid => provision_pid})
191
- end
192
-
193
- # wait for everything to finish...
194
- errors = Array.new
195
- lock = Mutex.new
196
- provisioners.each { |provisioner|
197
- Thread.new {
198
- Process.wait(provisioner[:pid]);
199
- lock.synchronize do
200
- errors.push(provisioner[:name]) unless $?.exitstatus == 0
201
- end
202
- }.join
203
- }
204
-
205
- if keepalive == false
206
- halt(taskname, driver, provider, instances, debug)
207
- else
208
- puts "Will leave instances running."
209
- end
210
-
211
- abort("ERROR: Finished with errors in: #{errors.to_s}") unless errors.length == 0
212
- puts("SUCCESS!")
213
- end
214
-
215
29
  def self.rush(task, debug)
216
- abort("ERROR: Vagrant not installed!") unless which("vagrant") != nil
217
-
218
30
  # load the hive first
219
31
  Zerg::Hive.instance.load
220
32
 
221
33
  puts "Loaded hive. Looking for task #{task}..."
222
34
  abort("ERROR: Task #{task} not found in current hive!") unless Zerg::Hive.instance.hive.has_key?(task)
223
35
 
224
- # grab the current task hash and parse it out
225
- runner = Runner.new
226
- runner.process(task, Zerg::Hive.instance.hive[task], debug);
36
+ # rush!
37
+ begin
38
+ pmgr = ZergGemPlugin::Manager.instance
39
+ pmgr.load
40
+ driver = pmgr.create("/driver/#{Zerg::Hive.instance.hive[task]["vm"]["driver"]["drivertype"]}")
41
+ driver.rush Zerg::Hive.instance.load_path, task, Zerg::Hive.instance.hive[task], debug
42
+ rescue ZergGemPlugin::PluginNotLoaded
43
+ abort("ERROR: driver #{Zerg::Hive.instance.hive[task]["vm"]["driver"]["drivertype"]} not found. Did you install the plugin gem?")
44
+ end
45
+ puts("SUCCESS!")
227
46
  end
228
47
 
229
48
  def self.halt(task, debug)
230
- abort("ERROR: Vagrant not installed!") unless which("vagrant") != nil
231
-
232
49
  # load the hive first
233
50
  Zerg::Hive.instance.load
234
51
 
@@ -236,22 +53,32 @@ module Zerg
236
53
  abort("ERROR: Task #{task} not found in current hive!") unless Zerg::Hive.instance.hive.has_key?(task)
237
54
 
238
55
  # halt!
239
- runner = Runner.new
240
- runner.halt(task, Zerg::Hive.instance.hive[task]["vm"]["driver"]["drivertype"], Zerg::Hive.instance.hive[task]["vm"]["driver"]["providertype"], Zerg::Hive.instance.hive[task]["instances"], debug)
56
+ begin
57
+ pmgr = ZergGemPlugin::Manager.instance
58
+ pmgr.load
59
+ driver = pmgr.create("/driver/#{Zerg::Hive.instance.hive[task]["vm"]["driver"]["drivertype"]}")
60
+ driver.halt Zerg::Hive.instance.load_path, task, Zerg::Hive.instance.hive[task], debug
61
+ rescue ZergGemPlugin::PluginNotLoaded
62
+ abort("ERROR: driver #{Zerg::Hive.instance.hive[task]["vm"]["driver"]["drivertype"]} not found. Did you install the plugin gem?")
63
+ end
241
64
  puts("SUCCESS!")
242
65
  end
243
66
 
244
67
  def self.clean(task, debug)
245
- abort("ERROR: Vagrant not installed!") unless which("vagrant") != nil
246
-
247
68
  # load the hive first
248
69
  Zerg::Hive.instance.load
249
70
 
250
71
  puts "Loaded hive. Looking for task #{task}..."
251
72
  abort("ERROR: Task #{task} not found in current hive!") unless Zerg::Hive.instance.hive.has_key?(task)
252
73
 
253
- runner = Runner.new
254
- runner.cleanup(task, Zerg::Hive.instance.hive[task], debug);
74
+ begin
75
+ pmgr = ZergGemPlugin::Manager.instance
76
+ pmgr.load
77
+ driver = pmgr.create("/driver/#{Zerg::Hive.instance.hive[task]["vm"]["driver"]["drivertype"]}")
78
+ driver.clean Zerg::Hive.instance.load_path, task, Zerg::Hive.instance.hive[task], debug
79
+ rescue ZergGemPlugin::PluginNotLoaded
80
+ abort("ERROR: driver #{Zerg::Hive.instance.hive[task]["vm"]["driver"]["drivertype"]} not found. Did you install the plugin gem?")
81
+ end
255
82
  puts("SUCCESS!")
256
83
  end
257
84
  end
data/lib/zerg/version.rb CHANGED
@@ -22,5 +22,5 @@
22
22
  #++
23
23
 
24
24
  module Zerg
25
- VERSION = "0.0.2"
25
+ VERSION = "0.0.4"
26
26
  end
data/zerg.gemspec CHANGED
@@ -8,10 +8,11 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["MTN Satellite Communications"]
9
9
  s.email = ["Marat.Garafutdinov@mtnsat.com"]
10
10
  s.homepage = "https://github.com/MTNSatelliteComm/zerg"
11
+ s.license = "MIT"
11
12
  s.summary = "Zerg is a tool for launching an arbitrary number of virtual machines and running a task on all of them at once"
12
13
  s.description = "Zerg is a tool for launching an arbitrary number of virtual machines and running a task on all of them at once"
13
14
 
14
- s.required_rubygems_version = ">= 1.3.6"
15
+ s.required_rubygems_version = ">= 2.0.0"
15
16
  s.rubyforge_project = "zergrush"
16
17
 
17
18
  s.add_development_dependency "bundler", ">= 1.0.0"
@@ -24,6 +25,7 @@ Gem::Specification.new do |s|
24
25
  s.add_dependency "json-schema"
25
26
  s.add_dependency "thor"
26
27
  s.add_dependency "highline"
28
+ s.add_dependency "zergrush_vagrant"
27
29
 
28
30
  s.files = `git ls-files`.split("\n")
29
31
  s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zergrush
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - MTN Satellite Communications
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-14 00:00:00.000000000 Z
11
+ date: 2014-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - '>='
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: zergrush_vagrant
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
139
153
  description: Zerg is a tool for launching an arbitrary number of virtual machines
140
154
  and running a task on all of them at once
141
155
  email:
@@ -151,18 +165,14 @@ files:
151
165
  - LICENSE.txt
152
166
  - Rakefile
153
167
  - bin/zerg
154
- - data/driver/vagrant/bridging.template
155
- - data/driver/vagrant/hostonly.template
156
- - data/driver/vagrant/machine.template
157
- - data/driver/vagrant/main.template
158
- - data/driver/vagrant/provider.template
159
168
  - data/ke.schema
160
169
  - features/hive.feature
161
170
  - features/support/setup.rb
162
171
  - features/task.feature
163
172
  - lib/zerg.rb
164
173
  - lib/zerg/cli.rb
165
- - lib/zerg/driver_renderer.rb
174
+ - lib/zerg/erbalize.rb
175
+ - lib/zerg/gem_plugin.rb
166
176
  - lib/zerg/generators/hivegen.rb
167
177
  - lib/zerg/generators/task/awstemplate.ke
168
178
  - lib/zerg/generators/task/template.ke
@@ -172,7 +182,8 @@ files:
172
182
  - spec/zerg_spec.rb
173
183
  - zerg.gemspec
174
184
  homepage: https://github.com/MTNSatelliteComm/zerg
175
- licenses: []
185
+ licenses:
186
+ - MIT
176
187
  metadata: {}
177
188
  post_install_message:
178
189
  rdoc_options: []
@@ -187,7 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
187
198
  requirements:
188
199
  - - '>='
189
200
  - !ruby/object:Gem::Version
190
- version: 1.3.6
201
+ version: 2.0.0
191
202
  requirements: []
192
203
  rubyforge_project: zergrush
193
204
  rubygems_version: 2.2.2
@@ -1 +0,0 @@
1
- <%= machine_name %>.vm.network :public_network, :bridge => "<%= bridged_eth_description %>", :mac => <%= machine_mac %>, :use_dhcp_assigned_default_route => true
@@ -1 +0,0 @@
1
- <%= machine_name %>.vm.network :private_network, ip: "192.168.50.<%= last_octet %>"
@@ -1,22 +0,0 @@
1
- # define the machine name
2
- config.vm.define "<%= machine_name %>" do |<%= machine_name %>|
3
- <%= bridge_specifics -%>
4
- <%= hostonly_specifics %>
5
- <%= sync_folders_array -%>
6
-
7
- # provisioning
8
- tasks = JSON.parse(<%= tasks_array %>)
9
- tasks.each { |task|
10
- if task["type"] == "chef_client" || task["type"] == "chef_solo"
11
- <%= machine_name %>.omnibus.chef_version = :latest
12
- end
13
-
14
- <%= machine_name %>.vm.provision "#{task["type"]}" do |provisioner|
15
- task.each do |key, value|
16
- next if key == "type"
17
- provisioner.send("#{key}=", value)
18
- end
19
- end
20
- }
21
- end
22
-
@@ -1,11 +0,0 @@
1
- Vagrant.configure(2) do |config|
2
- <%= provider_section %>
3
-
4
- config.vagrant.host = :detect
5
- config.vm.box_url = "<%= basebox_path %>"
6
- config.vm.box = "<%= box_name %>"
7
- config.vm.boot_timeout = 300
8
- config.vm.graceful_halt_timeout = 60
9
- <%= vm_defines -%>
10
-
11
- end
@@ -1,3 +0,0 @@
1
- config.vm.provider :<%= provider %> do |<%= provider %>, override|
2
- <%= provider_specifics -%>
3
- end
@@ -1,190 +0,0 @@
1
- #--
2
-
3
- # Copyright 2014 by MTN Sattelite Communications
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to
7
- # deal in the Software without restriction, including without limitation the
8
- # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9
- # sell copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
- # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
- # IN THE SOFTWARE.
22
- #++
23
-
24
- require 'awesome_print'
25
- require 'fileutils'
26
- require 'erb'
27
- require 'ostruct'
28
- require 'securerandom'
29
-
30
- module Zerg
31
- class DriverRenderer
32
- class Erbalize < OpenStruct
33
- def self.erbalize_hash(template, sources)
34
- Erbalize.new(sources).render(template)
35
- end
36
-
37
- def render(template)
38
- ERB.new(template, nil, '-').result(binding)
39
- end
40
- end
41
-
42
- # generate a virtualbox - compatible MAC address
43
- def generateMACAddress()
44
- firstChar = (0..255).map(&:chr).select{|x| x =~ /[0-9A-Fa-f]/}.sample(1).join
45
- secondChar = (0..255).map(&:chr).select{|x| x =~ /[02468ACEace]/}.sample(1).join
46
- restOfChars = (0..255).map(&:chr).select{|x| x =~ /[0-9A-Fa-f]/}.sample(10).join
47
- return "#{firstChar}#{secondChar}#{restOfChars}"
48
- end
49
-
50
- def initialize(vm, name, instances, synced_folders, tasks )
51
- @vm = vm
52
- @name = name
53
- @instances = instances
54
- @tasks = tasks
55
- @synced_folders = synced_folders
56
- end
57
-
58
- def render
59
- puts ("Rendering driver templates...")
60
-
61
- # TODO: generalize this processing better
62
- abort("ERROR: Driver type '#{@vm["driver"]["drivertype"]} is not supported.") unless (@vm["driver"]["drivertype"] == "vagrant")
63
-
64
- # load the template files
65
- main_template = File.open(File.join("#{File.dirname(__FILE__)}", "..", "..", "data", "driver", "#{@vm["driver"]["drivertype"]}", "main.template"), 'r').read
66
-
67
- # load the provider top level template
68
- provider_parent_template = File.open(File.join("#{File.dirname(__FILE__)}", "..", "..", "data", "driver", "#{@vm["driver"]["drivertype"]}", "provider.template"), 'r').read
69
-
70
- # load the machine details template
71
- machine_template = File.open(File.join("#{File.dirname(__FILE__)}", "..", "..", "data", "driver", "#{@vm["driver"]["drivertype"]}", "machine.template"), 'r').read
72
-
73
- # load the bridge details template
74
- bridge_template = File.open(File.join("#{File.dirname(__FILE__)}", "..", "..", "data", "driver", "#{@vm["driver"]["drivertype"]}", "bridging.template"), 'r').read
75
-
76
- # load the host only network details template
77
- hostonly_template = File.open(File.join("#{File.dirname(__FILE__)}", "..", "..", "data", "driver", "#{@vm["driver"]["drivertype"]}", "hostonly.template"), 'r').read
78
-
79
- # render templates....
80
- # render provider details to string
81
- #
82
- # render provider details into a string
83
- provider_details_array = @vm["driver"]["provider_options"]
84
- provider_details = ""
85
- for index in 0..provider_details_array.length - 1
86
- provider_details += "\t\t" + provider_details_array[index] + "\n"
87
- end
88
-
89
- # render provider parent
90
- sources = {
91
- :provider => @vm["driver"]["providertype"],
92
- :provider_specifics => provider_details
93
- }
94
- provider_parent_string = Erbalize.erbalize_hash(provider_parent_template, sources)
95
-
96
- # render machine template
97
- all_macs = Array.new
98
- all_machines = ""
99
- for index in 0..@instances - 1
100
-
101
- # last ip octet offset for host only networking
102
- ip_octet_offset = index
103
-
104
- # inject randomized node_name into chef_client tasks
105
- @tasks.each { |task|
106
- if task["type"] == "chef_client"
107
- task["node_name"] = "zergling_#{index}_#{SecureRandom.hex(20)}"
108
- end
109
- }
110
-
111
- # tasks array rendered to ruby string. double encoding to escape quotes and allow for variable expansion
112
- tasks_array = @tasks.to_json.to_json
113
-
114
- # do we need the bridging template as well?
115
- bridge_section = nil
116
- if @vm.has_key?("bridge_description")
117
- # mac address to use?
118
- new_mac = ""
119
- begin
120
- new_mac = generateMACAddress()
121
- end while all_macs.include? new_mac
122
-
123
- sources = {
124
- :machine_mac => new_mac,
125
- :bridged_eth_description => @vm["bridge_description"]
126
- }
127
- bridge_section = Erbalize.erbalize_hash(bridge_template, sources)
128
- end
129
-
130
- # do we need the host only template as well?
131
- hostonly_section = nil
132
- if @vm["private_network"] == true
133
- sources = {
134
- :machine_name => "zergling_#{index}",
135
- :last_octet => ip_octet_offset + 4, # TODO: this is probably specific to virtualbox networking
136
- }
137
- hostonly_section = Erbalize.erbalize_hash(hostonly_template, sources)
138
- end
139
-
140
- # blah
141
- folder_definitions = nil
142
- if @synced_folders != nil
143
- folder_definitions = ""
144
- @synced_folders.each { |folder|
145
- other_options = ""
146
- if folder.has_key?("options")
147
- folder["options"].each { |option|
148
- option.each do |key, value|
149
- if value.is_a?(String)
150
- other_options += ", :#{key} => \"#{value}\""
151
- else
152
- other_options += ", :#{key} => #{value}"
153
- end
154
- end
155
- }
156
- end
157
-
158
- folder_definition = "zergling_#{index}.vm.synced_folder \"#{folder['host_path']}\", \"#{folder['guest_path']}\""
159
- folder_definition = "#{folder_definition}#{other_options}" unless other_options.empty?()
160
- folder_definitions += "\t\t#{folder_definition}\n"
161
- }
162
- end
163
-
164
- sources = {
165
- :machine_name => "zergling_#{index}",
166
- :bridge_specifics => bridge_section,
167
- :hostonly_specifics => hostonly_section,
168
- :tasks_array => tasks_array,
169
- :sync_folders_array => folder_definitions
170
- }.delete_if { |k, v| v.nil? }
171
-
172
- machine_section = Erbalize.erbalize_hash(machine_template, sources)
173
- all_machines += "\n#{machine_section}"
174
- end
175
-
176
- sources = {
177
- :provider_section => provider_parent_string,
178
- :basebox_path => @vm["basebox"],
179
- :box_name => "zergling_#{@name}_#{@vm["driver"]["providertype"]}",
180
- :vm_defines => all_machines
181
- }
182
- full_template = Erbalize.erbalize_hash(main_template, sources)
183
-
184
- # write the file
185
- puts ("Writing #{File.join("#{Dir.pwd}", ".hive", "driver", @vm["driver"]["drivertype"], @name, "Vagrantfile")}...")
186
- FileUtils.mkdir_p(File.join("#{Dir.pwd}", ".hive", "driver", @vm["driver"]["drivertype"], @name))
187
- File.open(File.join("#{Dir.pwd}", ".hive", "driver", @vm["driver"]["drivertype"], @name, "Vagrantfile"), 'w') { |file| file.write(full_template) }
188
- end
189
- end
190
- end