vagrant-vcenter 0.0.2.pre.dev
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.rubocop.yml +34 -0
- data/Gemfile +7 -0
- data/LICENSE +20 -0
- data/README.md +5 -0
- data/Rakefile +17 -0
- data/example_box/README.md +13 -0
- data/example_box/Vagrantfile +6 -0
- data/example_box/metadata.json +1 -0
- data/lib/vagrant-vcenter.rb +18 -0
- data/lib/vagrant-vcenter/action.rb +232 -0
- data/lib/vagrant-vcenter/action/announce_ssh_exec.rb +19 -0
- data/lib/vagrant-vcenter/action/build_vm.rb +130 -0
- data/lib/vagrant-vcenter/action/connect_vcenter.rb +37 -0
- data/lib/vagrant-vcenter/action/destroy.rb +29 -0
- data/lib/vagrant-vcenter/action/disconnect_vcenter.rb +29 -0
- data/lib/vagrant-vcenter/action/inventory_check.rb +132 -0
- data/lib/vagrant-vcenter/action/is_created.rb +26 -0
- data/lib/vagrant-vcenter/action/is_paused.rb +23 -0
- data/lib/vagrant-vcenter/action/is_running.rb +23 -0
- data/lib/vagrant-vcenter/action/message_already_running.rb +17 -0
- data/lib/vagrant-vcenter/action/message_cannot_suspend.rb +19 -0
- data/lib/vagrant-vcenter/action/message_not_created.rb +17 -0
- data/lib/vagrant-vcenter/action/message_will_not_destroy.rb +18 -0
- data/lib/vagrant-vcenter/action/power_off.rb +30 -0
- data/lib/vagrant-vcenter/action/power_on.rb +30 -0
- data/lib/vagrant-vcenter/action/read_ssh_info.rb +37 -0
- data/lib/vagrant-vcenter/action/read_state.rb +52 -0
- data/lib/vagrant-vcenter/action/resume.rb +30 -0
- data/lib/vagrant-vcenter/action/suspend.rb +30 -0
- data/lib/vagrant-vcenter/action/sync_folders.rb +135 -0
- data/lib/vagrant-vcenter/config.rb +92 -0
- data/lib/vagrant-vcenter/errors.rb +88 -0
- data/lib/vagrant-vcenter/plugin.rb +67 -0
- data/lib/vagrant-vcenter/provider.rb +46 -0
- data/lib/vagrant-vcenter/version.rb +6 -0
- data/locales/en.yml +50 -0
- data/vagrant-vcenter.gemspec +29 -0
- metadata +194 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c733695318829ceed21eafa83e10faa309ccc6ef
|
4
|
+
data.tar.gz: 95a52dd729748fcdb3ea944f3674361568620d07
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3135b7e6ed6c775bde2f1176c795f9614250497bfe64469309338d94a29341c4395779807ff569d6e0dab0144ba373fd418fb8d23a19c873b1b2c7e32c65ceb5
|
7
|
+
data.tar.gz: db2a1fb9232ee85ec4b315372995861ebc01629efdda358196fdfc2204335db83efc84c50285408b87fa0c084fe3882d63ae92b54b146bb954ea4e8ff31fe04a
|
data/.gitignore
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
MethodLength:
|
2
|
+
CountComments: false # count full line comments?
|
3
|
+
Enabled: false
|
4
|
+
|
5
|
+
MethodName:
|
6
|
+
EnforcedStyle: snake_case
|
7
|
+
|
8
|
+
AccessorMethodName:
|
9
|
+
Description: Check the naming of accessor methods for get_/set_.
|
10
|
+
Enabled: false
|
11
|
+
|
12
|
+
Encoding:
|
13
|
+
Description: 'Use UTF-8 as the source file encoding.'
|
14
|
+
Enabled: true
|
15
|
+
|
16
|
+
HashSyntax:
|
17
|
+
Description: >-
|
18
|
+
Prefer Ruby 1.9 hash syntax { a: 1, b: 2 } over 1.8 syntax
|
19
|
+
{ :a => 1, :b => 2 }.
|
20
|
+
Enabled: false
|
21
|
+
EnforcedStyle: hash_rockets
|
22
|
+
|
23
|
+
LineEndConcatenation:
|
24
|
+
Description: 'Use \\ instead of + to concatenate two string literals at line end.'
|
25
|
+
Enabled: true
|
26
|
+
|
27
|
+
LineLength:
|
28
|
+
Description: 'Limit lines to 79 characters.'
|
29
|
+
Enabled: true
|
30
|
+
Max: 80
|
31
|
+
|
32
|
+
CyclomaticComplexity:
|
33
|
+
Description: 'Avoid complex methods.'
|
34
|
+
Enabled: false
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2013 Fabio Rapposelli
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
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, FITNESS
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
|
5
|
+
# Immediately sync all stdout so that tools like buildbot can
|
6
|
+
# immediately load in the output.
|
7
|
+
$stdout.sync = true
|
8
|
+
$stderr.sync = true
|
9
|
+
|
10
|
+
# Change to the y of this file.
|
11
|
+
Dir.chdir(File.expand_path('../', __FILE__))
|
12
|
+
|
13
|
+
Bundler::GemHelper.install_tasks
|
14
|
+
|
15
|
+
RSpec::Core::RakeTask.new
|
16
|
+
|
17
|
+
task :default => 'spec'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# vagrant-vcenter box specifications [WIP]
|
2
|
+
|
3
|
+
*Note that vagrant-vcenter currently supports only single VM vApp boxes*
|
4
|
+
|
5
|
+
BOX package should contain:
|
6
|
+
|
7
|
+
- `metadata.json` -- Vagrant metadata file
|
8
|
+
- `<boxname>.ovf` -- OVF descriptor of the vApp.
|
9
|
+
- `<boxname>.mf` -- OVF manifest file containing file hashes.
|
10
|
+
- `<boxname>-disk-<#>.vmdk` -- Associated VMDK files.
|
11
|
+
- `Vagrantfile`-- vagrant-vcenter default Vagrantfile
|
12
|
+
|
13
|
+
A [task is open](https://github.com/frapposelli/vagrant-vcenter/issues/12) for creating a veewee plugin to facilitate Box creation
|
@@ -0,0 +1 @@
|
|
1
|
+
{"provider": "vagrant-vcenter"}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'vagrant-vcenter/plugin'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
# Initialize the plugin.
|
6
|
+
module VCenter
|
7
|
+
lib_path = Pathname.new(File.expand_path('../vagrant-vcenter', __FILE__))
|
8
|
+
autoload :Action, lib_path.join('action')
|
9
|
+
autoload :Errors, lib_path.join('errors')
|
10
|
+
|
11
|
+
# This returns the path to the source of this plugin.
|
12
|
+
#
|
13
|
+
# @return [Pathname]
|
14
|
+
def self.source_root
|
15
|
+
@source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,232 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'vagrant/action/builder'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module VCenter
|
6
|
+
# Actions to be performed by the vagrant-vcenter provider.
|
7
|
+
module Action
|
8
|
+
include Vagrant::Action::Builtin
|
9
|
+
|
10
|
+
# Vagrant commands
|
11
|
+
# This action boots the VM, assuming the VM is in a state that requires
|
12
|
+
# a bootup (i.e. not saved).
|
13
|
+
def self.action_boot
|
14
|
+
Vagrant::Action::Builder.new.tap do |b|
|
15
|
+
b.use PowerOn
|
16
|
+
b.use Provision
|
17
|
+
b.use SyncFolders
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.action_reload
|
22
|
+
Vagrant::Action::Builder.new.tap do |b|
|
23
|
+
b.use ConfigValidate
|
24
|
+
b.use Call, IsCreated do |env, b2|
|
25
|
+
unless env[:result]
|
26
|
+
b2.use MessageNotCreated
|
27
|
+
next
|
28
|
+
end
|
29
|
+
b2.use action_halt
|
30
|
+
b2.use action_start
|
31
|
+
b2.use DisconnectvCenter
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# This action starts a VM, assuming it is already imported and exists.
|
37
|
+
# A precondition of this action is that the VM exists.
|
38
|
+
def self.action_start
|
39
|
+
Vagrant::Action::Builder.new.tap do |b|
|
40
|
+
b.use ConfigValidate
|
41
|
+
b.use ConnectvCenter
|
42
|
+
b.use Call, IsRunning do |env, b2|
|
43
|
+
# If the VM is running, then our work here is done, exit
|
44
|
+
if env[:result]
|
45
|
+
b2.use MessageAlreadyRunning
|
46
|
+
next
|
47
|
+
end
|
48
|
+
b2.use Call, IsPaused do |env2, b3|
|
49
|
+
if env2[:result]
|
50
|
+
b3.use Resume
|
51
|
+
next
|
52
|
+
end
|
53
|
+
b3.use action_boot
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.action_halt
|
60
|
+
Vagrant::Action::Builder.new.tap do |b|
|
61
|
+
b.use ConnectvCenter
|
62
|
+
b.use Call, IsPaused do |env, b2|
|
63
|
+
b2.use Resume if env[:result]
|
64
|
+
b2.use PowerOff
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.action_suspend
|
70
|
+
Vagrant::Action::Builder.new.tap do |b|
|
71
|
+
b.use ConnectvCenter
|
72
|
+
b.use Call, IsRunning do |env, b2|
|
73
|
+
# If the VM is stopped, can't suspend
|
74
|
+
if !env[:result]
|
75
|
+
b2.use MessageCannotSuspend
|
76
|
+
else
|
77
|
+
b2.use Suspend
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.action_resume
|
84
|
+
Vagrant::Action::Builder.new.tap do |b|
|
85
|
+
b.use ConnectvCenter
|
86
|
+
b.use Resume
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.action_destroy
|
91
|
+
Vagrant::Action::Builder.new.tap do |b|
|
92
|
+
b.use Call, DestroyConfirm do |env, b2|
|
93
|
+
if env[:result]
|
94
|
+
b2.use ConfigValidate
|
95
|
+
b2.use ConnectvCenter
|
96
|
+
b2.use Call, IsRunning do |env2, b3|
|
97
|
+
# If the VM is running, must power off
|
98
|
+
b3.use action_halt if env2[:result]
|
99
|
+
b3.use Destroy
|
100
|
+
end
|
101
|
+
else
|
102
|
+
b2.use MessageWillNotDestroy
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.action_provision
|
109
|
+
Vagrant::Action::Builder.new.tap do |b|
|
110
|
+
b.use ConfigValidate
|
111
|
+
b.use Call, IsCreated do |env, b2|
|
112
|
+
unless env[:result]
|
113
|
+
b2.use MessageNotCreated
|
114
|
+
next
|
115
|
+
end
|
116
|
+
b2.use Provision
|
117
|
+
b2.use SyncFolders
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# This action is called to read the SSH info of the machine. The
|
123
|
+
# resulting state is expected to be put into the `:machine_ssh_info`
|
124
|
+
# key.
|
125
|
+
def self.action_read_ssh_info
|
126
|
+
Vagrant::Action::Builder.new.tap do |b|
|
127
|
+
b.use ConfigValidate
|
128
|
+
b.use ConnectvCenter
|
129
|
+
b.use ReadSSHInfo
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# This action is called to read the state of the machine. The
|
134
|
+
# resulting state is expected to be put into the `:machine_state_id`
|
135
|
+
# key.
|
136
|
+
def self.action_read_state
|
137
|
+
Vagrant::Action::Builder.new.tap do |b|
|
138
|
+
b.use ConfigValidate
|
139
|
+
b.use ConnectvCenter
|
140
|
+
b.use ReadState
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.action_ssh
|
145
|
+
Vagrant::Action::Builder.new.tap do |b|
|
146
|
+
b.use ConfigValidate
|
147
|
+
b.use Call, IsCreated do |env, b2|
|
148
|
+
unless env[:result]
|
149
|
+
b2.use MessageNotCreated
|
150
|
+
next
|
151
|
+
end
|
152
|
+
b2.use AnnounceSSHExec
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def self.action_ssh_run
|
158
|
+
Vagrant::Action::Builder.new.tap do |b|
|
159
|
+
b.use ConfigValidate
|
160
|
+
b.use Call, IsCreated do |env, b2|
|
161
|
+
unless env[:result]
|
162
|
+
b2.use MessageNotCreated
|
163
|
+
next
|
164
|
+
end
|
165
|
+
b2.use SSHRun
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def self.action_up
|
171
|
+
Vagrant::Action::Builder.new.tap do |b|
|
172
|
+
b.use ConfigValidate
|
173
|
+
b.use Call, IsCreated do |env, b2|
|
174
|
+
b2.use HandleBox unless env[:result]
|
175
|
+
end
|
176
|
+
b.use ConnectvCenter
|
177
|
+
b.use InventoryCheck
|
178
|
+
b.use Call, IsCreated do |env, b2|
|
179
|
+
b2.use BuildVM unless env[:result]
|
180
|
+
end
|
181
|
+
b.use action_start
|
182
|
+
b.use DisconnectvCenter
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
# The autoload farm
|
187
|
+
action_root = Pathname.new(File.expand_path('../action', __FILE__))
|
188
|
+
autoload :AnnounceSSHExec,
|
189
|
+
action_root.join('announce_ssh_exec')
|
190
|
+
autoload :BuildVM,
|
191
|
+
action_root.join('build_vm')
|
192
|
+
autoload :ConnectvCenter,
|
193
|
+
action_root.join('connect_vcenter')
|
194
|
+
autoload :Destroy,
|
195
|
+
action_root.join('destroy')
|
196
|
+
autoload :DisconnectvCenter,
|
197
|
+
action_root.join('disconnect_vcenter')
|
198
|
+
autoload :ForwardPorts,
|
199
|
+
action_root.join('forward_ports')
|
200
|
+
autoload :InventoryCheck,
|
201
|
+
action_root.join('inventory_check')
|
202
|
+
autoload :IsCreated,
|
203
|
+
action_root.join('is_created')
|
204
|
+
autoload :IsPaused,
|
205
|
+
action_root.join('is_paused')
|
206
|
+
autoload :IsRunning,
|
207
|
+
action_root.join('is_running')
|
208
|
+
autoload :MessageAlreadyRunning,
|
209
|
+
action_root.join('message_already_running')
|
210
|
+
autoload :MessageCannotSuspend,
|
211
|
+
action_root.join('message_cannot_suspend')
|
212
|
+
autoload :MessageNotCreated,
|
213
|
+
action_root.join('message_not_created')
|
214
|
+
autoload :MessageWillNotDestroy,
|
215
|
+
action_root.join('message_will_not_destroy')
|
216
|
+
autoload :PowerOff,
|
217
|
+
action_root.join('power_off')
|
218
|
+
autoload :PowerOn,
|
219
|
+
action_root.join('power_on')
|
220
|
+
autoload :ReadSSHInfo,
|
221
|
+
action_root.join('read_ssh_info')
|
222
|
+
autoload :ReadState,
|
223
|
+
action_root.join('read_state')
|
224
|
+
autoload :Resume,
|
225
|
+
action_root.join('resume')
|
226
|
+
autoload :Suspend,
|
227
|
+
action_root.join('suspend')
|
228
|
+
autoload :SyncFolders,
|
229
|
+
action_root.join('sync_folders')
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module VCenter
|
3
|
+
module Action
|
4
|
+
# Extends the Builtin SSHExec and announces the external IP.
|
5
|
+
class AnnounceSSHExec < Vagrant::Action::Builtin::SSHExec
|
6
|
+
def initialize(app, env)
|
7
|
+
@app = app
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
ssh_info = env[:machine].ssh_info
|
12
|
+
env[:ui].success('External IP for ' +
|
13
|
+
"#{env[:machine].name}: #{ssh_info[:host]}")
|
14
|
+
super
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require 'etc'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module VCenter
|
6
|
+
module Action
|
7
|
+
# This class builds the VM to be used by Vagrant.
|
8
|
+
class BuildVM
|
9
|
+
def initialize(app, env)
|
10
|
+
@app = app
|
11
|
+
@logger = Log4r::Logger.new('vagrant_vcenter::action::build_vm')
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
# FIXME: we need to find a way to clean things up when a SIGINT get
|
16
|
+
# called... see env[:interrupted] in the vagrant code
|
17
|
+
|
18
|
+
config = env[:machine].provider_config
|
19
|
+
vm_name = env[:machine].name
|
20
|
+
|
21
|
+
# FIXME: Raise a correct exception
|
22
|
+
dc = config.vcenter_cnx.serviceInstance.find_datacenter(
|
23
|
+
config.datacenter_name) or abort 'datacenter not found'
|
24
|
+
|
25
|
+
if config.template_folder_name.nil?
|
26
|
+
box_to_search = env[:machine].box.name.to_s
|
27
|
+
else
|
28
|
+
box_to_search = config.template_folder_name + '/' +
|
29
|
+
env[:machine].box.name.to_s
|
30
|
+
end
|
31
|
+
|
32
|
+
# FIXME: Raise a correct exception
|
33
|
+
computer = dc.find_compute_resource(
|
34
|
+
config.computer_name) or fail 'Host not found'
|
35
|
+
rp = computer.resourcePool
|
36
|
+
|
37
|
+
# FIXME: Raise a correct exception
|
38
|
+
template = dc.find_vm(
|
39
|
+
box_to_search) or abort 'VM not found'
|
40
|
+
|
41
|
+
if config.linked_clones
|
42
|
+
@logger.debug('DOING LINKED CLONE!')
|
43
|
+
# The API for linked clones is quite strange. We can't create a
|
44
|
+
# linked straight from any VM. The disks of the VM for which we can
|
45
|
+
# create a linked clone need to be read-only and thus VC demands
|
46
|
+
# that the VM we are cloning from uses delta-disks. Only then it
|
47
|
+
# will allow us to share the base disk.
|
48
|
+
#
|
49
|
+
# Thus, this code first create a delta disk on top of the base disk
|
50
|
+
# for the to-be-cloned VM, if delta disks aren't used already.
|
51
|
+
disks = template.config.hardware.device.grep(
|
52
|
+
RbVmomi::VIM::VirtualDisk)
|
53
|
+
disks.select { |x| x.backing.parent.nil? }.each do |disk|
|
54
|
+
spec = {
|
55
|
+
:deviceChange => [
|
56
|
+
{
|
57
|
+
:operation => :remove,
|
58
|
+
:device => disk
|
59
|
+
},
|
60
|
+
{
|
61
|
+
:operation => :add,
|
62
|
+
:fileOperation => :create,
|
63
|
+
:device => disk.dup.tap do |x|
|
64
|
+
x.backing = x.backing.dup
|
65
|
+
x.backing.fileName = "[#{disk.backing.datastore.name}]"
|
66
|
+
x.backing.parent = disk.backing
|
67
|
+
end
|
68
|
+
}
|
69
|
+
]
|
70
|
+
}
|
71
|
+
template.ReconfigVM_Task(:spec => spec).wait_for_completion
|
72
|
+
end
|
73
|
+
|
74
|
+
relocate_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(
|
75
|
+
:diskMoveType => :moveChildMostDiskBacking,
|
76
|
+
:pool => rp)
|
77
|
+
else
|
78
|
+
relocate_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(
|
79
|
+
:pool => rp)
|
80
|
+
end
|
81
|
+
|
82
|
+
@logger.debug("Relocate Spec: #{relocate_spec.pretty_inspect}")
|
83
|
+
|
84
|
+
spec = RbVmomi::VIM.VirtualMachineCloneSpec(
|
85
|
+
:location => relocate_spec,
|
86
|
+
:powerOn => false,
|
87
|
+
:template => false)
|
88
|
+
|
89
|
+
@logger.debug("Spec: #{spec.pretty_inspect}")
|
90
|
+
|
91
|
+
vm_target = "Vagrant-#{Etc.getlogin}-" +
|
92
|
+
"#{vm_name}-#{Socket.gethostname.downcase}-" +
|
93
|
+
"#{SecureRandom.hex(4)}"
|
94
|
+
|
95
|
+
@logger.debug("VM name: #{vm_target}")
|
96
|
+
|
97
|
+
# FIXME: vm.parent brings us to the template folder, fix this with
|
98
|
+
# folder_path.
|
99
|
+
|
100
|
+
root_vm_folder = dc.vmFolder
|
101
|
+
vm_folder = root_vm_folder
|
102
|
+
unless config.folder_name.nil?
|
103
|
+
vm_folder = root_vm_folder.traverse(config.folder_name,
|
104
|
+
RbVmomi::VIM::Folder)
|
105
|
+
end
|
106
|
+
@logger.debug("folder for VM: #{vm_folder}")
|
107
|
+
|
108
|
+
template.CloneVM_Task(
|
109
|
+
:folder => vm_folder,
|
110
|
+
:name => vm_target,
|
111
|
+
:spec => spec).wait_for_completion
|
112
|
+
|
113
|
+
if config.folder_name.nil?
|
114
|
+
vm_to_search = vm_target
|
115
|
+
else
|
116
|
+
vm_to_search = config.folder_name + '/' + vm_target
|
117
|
+
end
|
118
|
+
|
119
|
+
@logger.debug("VM to search: #{vm_to_search}")
|
120
|
+
|
121
|
+
# FIXME: Raise a correct exception
|
122
|
+
env[:machine].id = dc.find_vm(
|
123
|
+
vm_to_search).config.uuid or abort 'VM not found'
|
124
|
+
|
125
|
+
@app.call env
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|