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
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rbvmomi'
|
2
|
+
require 'log4r'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module VCenter
|
6
|
+
module Action
|
7
|
+
# This class connects the vagrant-vcenter provider to vCenter.
|
8
|
+
class ConnectvCenter
|
9
|
+
def initialize(app, env)
|
10
|
+
@app = app
|
11
|
+
@logger = Log4r::Logger.new(
|
12
|
+
'vagrant_vcenter::action::connect_vCenter')
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
config = env[:machine].provider_config
|
17
|
+
# Avoid recreating a new session each time.
|
18
|
+
unless config.vcenter_cnx
|
19
|
+
@logger.info('Connecting to vCenter...')
|
20
|
+
|
21
|
+
@logger.debug("config.hostname: #{config.hostname}")
|
22
|
+
@logger.debug("config.username: #{config.username}")
|
23
|
+
@logger.debug("config.password: #{config.password}")
|
24
|
+
|
25
|
+
# FIXME: fix the insecure flag, catch the exception
|
26
|
+
config.vcenter_cnx = RbVmomi::VIM.connect(
|
27
|
+
host: config.hostname,
|
28
|
+
user: config.username,
|
29
|
+
password: config.password,
|
30
|
+
insecure: true)
|
31
|
+
end
|
32
|
+
@app.call env
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'i18n'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module VCenter
|
5
|
+
module Action
|
6
|
+
# This class destroy the VM created by the Vagrant provider.
|
7
|
+
class Destroy
|
8
|
+
def initialize(app, env)
|
9
|
+
@app = app
|
10
|
+
@logger = Log4r::Logger.new('vagrant_vcenter::action::destroy')
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
config = env[:machine].provider_config
|
15
|
+
# FIXME: Raise a correct exception
|
16
|
+
dc = config.vcenter_cnx.serviceInstance.find_datacenter(
|
17
|
+
config.datacenter_name) or abort 'datacenter not found'
|
18
|
+
root_vm_folder = dc.vmFolder
|
19
|
+
vm = root_vm_folder.findByUuid(env[:machine].id)
|
20
|
+
|
21
|
+
# Poweron VM
|
22
|
+
env[:ui].info('Destroying VM...')
|
23
|
+
vm.Destroy_Task.wait_for_completion
|
24
|
+
env[:machine].id = nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module VCenter
|
3
|
+
module Action
|
4
|
+
# This class disconnects the vagrant-vcenter provider from vCenter.
|
5
|
+
class DisconnectvCenter
|
6
|
+
def initialize(app, env)
|
7
|
+
@app = app
|
8
|
+
@logger = Log4r::Logger.new(
|
9
|
+
'vagrant_vcenter::action::disconnect_vcenter')
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
@logger.info('Disconnecting from vCenter ...')
|
14
|
+
|
15
|
+
config = env[:machine].provider_config
|
16
|
+
|
17
|
+
if !config.vcenter_cnx
|
18
|
+
@logger.info('Session not open, impossible to disconnect')
|
19
|
+
else
|
20
|
+
config.vcenter_cnx.close
|
21
|
+
@logger.info('Succesfully disconnected from vCenter...')
|
22
|
+
end
|
23
|
+
|
24
|
+
@app.call env
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'etc'
|
2
|
+
require 'log4r'
|
3
|
+
require 'rbvmomi'
|
4
|
+
require 'rbvmomi/utils/deploy'
|
5
|
+
require 'rbvmomi/utils/admission_control'
|
6
|
+
require 'yaml'
|
7
|
+
|
8
|
+
module VagrantPlugins
|
9
|
+
module VCenter
|
10
|
+
module Action
|
11
|
+
# This Class inspect the vCenter inventory for templates and uploads it
|
12
|
+
# if needed.
|
13
|
+
class InventoryCheck
|
14
|
+
def initialize(app, env)
|
15
|
+
@app = app
|
16
|
+
@logger = Log4r::Logger.new(
|
17
|
+
'vagrant_vcenter::action::inventory_check')
|
18
|
+
end
|
19
|
+
|
20
|
+
def call(env)
|
21
|
+
vcenter_check_inventory(env)
|
22
|
+
@app.call env
|
23
|
+
end
|
24
|
+
|
25
|
+
def vcenter_upload_box(env)
|
26
|
+
config = env[:machine].provider_config
|
27
|
+
|
28
|
+
box_dir = env[:machine].box.directory.to_s
|
29
|
+
box_file = env[:machine].box.name.to_s
|
30
|
+
|
31
|
+
box_ovf = "file://#{box_dir}/#{box_file}.ovf"
|
32
|
+
|
33
|
+
# Still relying on ruby-progressbar because report_progress basically
|
34
|
+
# sucks.
|
35
|
+
|
36
|
+
@logger.debug("OVF File: #{box_ovf}")
|
37
|
+
|
38
|
+
env[:ui].info("Adding [#{env[:machine].box.name.to_s}]")
|
39
|
+
|
40
|
+
# FIXME: Raise a correct exception
|
41
|
+
dc = config.vcenter_cnx.serviceInstance.find_datacenter(
|
42
|
+
config.datacenter_name) or fail 'datacenter not found'
|
43
|
+
|
44
|
+
root_vm_folder = dc.vmFolder
|
45
|
+
vm_folder = root_vm_folder
|
46
|
+
if config.template_folder_name.nil?
|
47
|
+
vm_folder = root_vm_folder.traverse(config.template_folder_name,
|
48
|
+
RbVmomi::VIM::Folder)
|
49
|
+
end
|
50
|
+
template_folder = root_vm_folder.traverse!(
|
51
|
+
config.template_folder_name,
|
52
|
+
RbVmomi::VIM::Folder)
|
53
|
+
|
54
|
+
template_name = box_file
|
55
|
+
|
56
|
+
# FIXME: Raise a correct exception
|
57
|
+
datastore = dc.find_datastore(
|
58
|
+
config.datastore_name) or fail 'datastore not found'
|
59
|
+
# FIXME: Raise a correct exception
|
60
|
+
computer = dc.find_compute_resource(
|
61
|
+
config.computer_name) or fail 'Host not found'
|
62
|
+
|
63
|
+
network = computer.network.find { |x| x.name == config.network_name }
|
64
|
+
|
65
|
+
deployer = CachedOvfDeployer.new(
|
66
|
+
config.vcenter_cnx,
|
67
|
+
network,
|
68
|
+
computer,
|
69
|
+
template_folder,
|
70
|
+
vm_folder,
|
71
|
+
datastore
|
72
|
+
)
|
73
|
+
|
74
|
+
deployer_opts = {
|
75
|
+
:run_without_interruptions => true,
|
76
|
+
:simple_vm_name => true
|
77
|
+
}
|
78
|
+
|
79
|
+
deployer.upload_ovf_as_template(
|
80
|
+
box_ovf,
|
81
|
+
template_name,
|
82
|
+
deployer_opts)
|
83
|
+
# FIXME: Progressbar??
|
84
|
+
end
|
85
|
+
|
86
|
+
def vcenter_check_inventory(env)
|
87
|
+
# Will check each mandatory config value against the vcenter
|
88
|
+
# Instance and will setup the global environment config values
|
89
|
+
config = env[:machine].provider_config
|
90
|
+
# FIXME: Raise a correct exception
|
91
|
+
dc = config.vcenter_cnx.serviceInstance.find_datacenter(
|
92
|
+
config.datacenter_name) or fail 'datacenter not found'
|
93
|
+
|
94
|
+
if config.template_folder_name.nil?
|
95
|
+
box_to_search = env[:machine].box.name.to_s
|
96
|
+
else
|
97
|
+
box_to_search = config.template_folder_name +
|
98
|
+
'/' + env[:machine].box.name.to_s
|
99
|
+
end
|
100
|
+
|
101
|
+
@logger.debug("This is the box we're looking for: #{box_to_search}")
|
102
|
+
|
103
|
+
config.template_id = dc.find_vm(box_to_search)
|
104
|
+
|
105
|
+
if config.template_id.nil?
|
106
|
+
env[:ui].warn("Template [#{env[:machine].box.name.to_s}] " +
|
107
|
+
'does not exist!')
|
108
|
+
|
109
|
+
user_input = env[:ui].ask(
|
110
|
+
"Would you like to upload the [#{env[:machine].box.name.to_s}]" +
|
111
|
+
" box?\nChoice (yes/no): "
|
112
|
+
)
|
113
|
+
|
114
|
+
if user_input.downcase == 'yes' || user_input.downcase == 'y'
|
115
|
+
env[:ui].info("Uploading [#{env[:machine].box.name.to_s}]...")
|
116
|
+
vcenter_upload_box(env)
|
117
|
+
else
|
118
|
+
env[:ui].error('Template not uploaded, exiting...')
|
119
|
+
|
120
|
+
# FIXME: wrong error message
|
121
|
+
fail VagrantPlugins::VCenter::Errors::VCenterError,
|
122
|
+
:message => 'Catalog not available, exiting...'
|
123
|
+
|
124
|
+
end
|
125
|
+
else
|
126
|
+
@logger.debug("Template found at #{box_to_search}")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module VCenter
|
3
|
+
module Action
|
4
|
+
# This class verifies if the VM has been created.
|
5
|
+
class IsCreated
|
6
|
+
def initialize(app, env)
|
7
|
+
@app = app
|
8
|
+
@logger = Log4r::Logger.new('vagrant_vcenter::action::is_created')
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
vm_id = env[:machine].id
|
13
|
+
if vm_id
|
14
|
+
@logger.info("VM has been created and ID is: [#{vm_id}]")
|
15
|
+
env[:result] = true
|
16
|
+
else
|
17
|
+
@logger.warn('VM has not been created')
|
18
|
+
env[:result] = false
|
19
|
+
end
|
20
|
+
|
21
|
+
@app.call env
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'i18n'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module VCenter
|
5
|
+
module Action
|
6
|
+
# This class sets the state to suspended if the VM is suspended.
|
7
|
+
class IsPaused
|
8
|
+
def initialize(app, env)
|
9
|
+
@app = app
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
# Set the result to be true if the machine is suspended.
|
14
|
+
env[:result] = env[:machine].state.id == :suspended
|
15
|
+
|
16
|
+
# Call the next if we have one (but we shouldn't, since this
|
17
|
+
# middleware is built to run with the Call-type middlewares)
|
18
|
+
@app.call(env)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'i18n'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module VCenter
|
5
|
+
module Action
|
6
|
+
# This class sets the state to running if the VM is running.
|
7
|
+
class IsRunning
|
8
|
+
def initialize(app, env)
|
9
|
+
@app = app
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
# Set the result to be true if the machine is running.
|
14
|
+
env[:result] = env[:machine].state.id == :running
|
15
|
+
|
16
|
+
# Call the next if we have one (but we shouldn't, since this
|
17
|
+
# middleware is built to run with the Call-type middlewares)
|
18
|
+
@app.call(env)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module VCenter
|
3
|
+
module Action
|
4
|
+
# Prints out a message that the VM is already running.
|
5
|
+
class MessageAlreadyRunning
|
6
|
+
def initialize(app, env)
|
7
|
+
@app = app
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
env[:ui].info(I18n.t('vagrant_vcenter.power.vm_already_running'))
|
12
|
+
@app.call(env)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module VCenter
|
3
|
+
module Action
|
4
|
+
# Prints out a message that the VM is already halted and cannot be
|
5
|
+
# suspended
|
6
|
+
class MessageCannotSuspend
|
7
|
+
def initialize(app, env)
|
8
|
+
@app = app
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
env[:ui].info(I18n.t(
|
13
|
+
'vagrant_vcenter.power.vm_halted_cannot_suspend'))
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module VCenter
|
3
|
+
module Action
|
4
|
+
# Prints out a message that the VM has not yet been created.
|
5
|
+
class MessageNotCreated
|
6
|
+
def initialize(app, env)
|
7
|
+
@app = app
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
env[:ui].info(I18n.t('vagrant_vcenter.power.vm_not_created'))
|
12
|
+
@app.call(env)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module VCenter
|
3
|
+
module Action
|
4
|
+
# Prints out a message that the VM will not be destroyed.
|
5
|
+
class MessageWillNotDestroy
|
6
|
+
def initialize(app, env)
|
7
|
+
@app = app
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
env[:ui].info(I18n.t('vagrant_vcenter.power.will_not_destroy',
|
12
|
+
name: env[:machine].name))
|
13
|
+
@app.call(env)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'i18n'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module VCenter
|
5
|
+
module Action
|
6
|
+
# This class powers off the VM that the Vagrant provider is managing.
|
7
|
+
class PowerOff
|
8
|
+
def initialize(app, env)
|
9
|
+
@app = app
|
10
|
+
@logger = Log4r::Logger.new('vagrant_vcenter::action::poweroff')
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
config = env[:machine].provider_config
|
15
|
+
# FIXME: Raise a correct exception
|
16
|
+
dc = config.vcenter_cnx.serviceInstance.find_datacenter(
|
17
|
+
config.datacenter_name) or abort 'datacenter not found'
|
18
|
+
root_vm_folder = dc.vmFolder
|
19
|
+
vm = root_vm_folder.findByUuid(env[:machine].id)
|
20
|
+
|
21
|
+
# Poweroff VM
|
22
|
+
env[:ui].info('Powering off VM...')
|
23
|
+
vm.PowerOffVM_Task.wait_for_completion
|
24
|
+
|
25
|
+
@app.call env
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'i18n'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module VCenter
|
5
|
+
module Action
|
6
|
+
# This class powers on the VM that the Vagrant provider is managing.
|
7
|
+
class PowerOn
|
8
|
+
def initialize(app, env)
|
9
|
+
@app = app
|
10
|
+
@logger = Log4r::Logger.new('vagrant_vcenter::action::power_on')
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
config = env[:machine].provider_config
|
15
|
+
# FIXME: Raise a correct exception
|
16
|
+
dc = config.vcenter_cnx.serviceInstance.find_datacenter(
|
17
|
+
config.datacenter_name) or abort 'datacenter not found'
|
18
|
+
root_vm_folder = dc.vmFolder
|
19
|
+
vm = root_vm_folder.findByUuid(env[:machine].id)
|
20
|
+
|
21
|
+
# Poweron VM
|
22
|
+
env[:ui].info('Powering on VM...')
|
23
|
+
vm.PowerOnVM_Task.wait_for_completion
|
24
|
+
sleep(3) until env[:machine].communicate.ready?
|
25
|
+
@app.call env
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|