vagrant-vcloud 0.4.4 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +100 -38
- data/Rakefile +0 -4
- data/lib/vagrant-vcloud/action.rb +33 -9
- data/lib/vagrant-vcloud/action/build_vapp.rb +163 -56
- data/lib/vagrant-vcloud/action/forward_ports.rb +38 -28
- data/lib/vagrant-vcloud/action/handle_nat_port_collisions.rb +28 -2
- data/lib/vagrant-vcloud/action/inventory_check.rb +20 -14
- data/lib/vagrant-vcloud/action/power_off_vapp.rb +3 -1
- data/lib/vagrant-vcloud/action/power_on.rb +36 -9
- data/lib/vagrant-vcloud/action/read_ssh_info.rb +15 -1
- data/lib/vagrant-vcloud/action/shut_down.rb +33 -0
- data/lib/vagrant-vcloud/config.rb +173 -1
- data/lib/vagrant-vcloud/driver/base.rb +0 -0
- data/lib/vagrant-vcloud/driver/meta.rb +0 -0
- data/lib/vagrant-vcloud/driver/version_5_1.rb +480 -148
- data/lib/vagrant-vcloud/errors.rb +6 -0
- data/lib/vagrant-vcloud/model/forwarded_port.rb +28 -4
- data/lib/vagrant-vcloud/util/compile_forwarded_ports.rb +44 -3
- data/lib/vagrant-vcloud/version.rb +1 -1
- data/locales/en.yml +14 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9c4c78e1a1282b1aac96e39cfcea24b36847340
|
4
|
+
data.tar.gz: afc6fc6fa406254848db0d871b5f014b0d72f193
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d53ac5b55cd8060e0d73c5168d56ca21793cadcef767bdf0abde2ecd25091eec362a0d6eec4500cbff64e0d16ea77391ba9d5e8759c139a708502b86633bb92
|
7
|
+
data.tar.gz: 29fb9185c93f55efdcd1bf787dc3c67e898231370477e0fed5969509598305d1c289186f77de60e24dc808dfd8902464ad868bf536a3a0be946cf96567043bed
|
data/README.md
CHANGED
@@ -1,44 +1,84 @@
|
|
1
|
-
[Vagrant](http://www.vagrantup.com) provider for VMware vCloud Director® [![Gem Version](https://badge.fury.io/rb/vagrant-vcloud.svg)](http://badge.fury.io/rb/vagrant-vcloud) [![Code Climate](https://codeclimate.com/github/frapposelli/vagrant-vcloud/badges/gpa.svg)](https://codeclimate.com/github/frapposelli/vagrant-vcloud)
|
2
|
-
|
1
|
+
[Vagrant](http://www.vagrantup.com) provider for VMware vCloud Director® [![Gem Version](https://badge.fury.io/rb/vagrant-vcloud.svg)](http://badge.fury.io/rb/vagrant-vcloud) [![Code Climate](https://codeclimate.com/github/frapposelli/vagrant-vcloud/badges/gpa.svg)](https://codeclimate.com/github/frapposelli/vagrant-vcloud) [![Dependency Status](https://gemnasium.com/frapposelli/vagrant-vcloud.svg)](https://gemnasium.com/frapposelli/vagrant-vcloud) [![Join the chat at https://gitter.im/frapposelli/vagrant-vcloud](https://badges.gitter.im/frapposelli/vagrant-vcloud.svg)](https://gitter.im/frapposelli/vagrant-vcloud?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
2
|
+
========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
|
3
3
|
|
4
4
|
Please note that this software is still Alpha/Beta quality and is not recommended for production usage.
|
5
5
|
|
6
6
|
We have a wide array of boxes available at [Vagrant Cloud](https://vagrantcloud.com/gosddc) you can use them directly or you can roll your own as you please, make sure to install VMware tools in it.
|
7
7
|
|
8
|
-
Starting from [version 0.4.2](../../releases/tag/v0.4.2), this plugin supports the universal [
|
8
|
+
Starting from [version 0.4.2](../../releases/tag/v0.4.2), this plugin supports the universal [`vmware_ovf` box format](https://github.com/gosddc/packer-post-processor-vagrant-vmware-ovf/wiki/vmware_ovf-Box-Format), that is 100% portable between [vagrant-vcloud](https://github.com/frapposelli/vagrant-vcloud), [vagrant-vcenter](https://github.com/gosddc/vagrant-vcenter) and [vagrant-vcloudair](https://github.com/gosddc/vagrant-vcloudair), no more double boxes!.
|
9
9
|
|
10
10
|
If you're unsure about what are the correct network settings for your Vagrantfile make sure to check out the [Network Deployment Options](https://github.com/frapposelli/vagrant-vcloud/wiki/Network-Deployment-Options) wiki page.
|
11
11
|
|
12
12
|
Check the full releases changelog [here](../../releases)
|
13
13
|
|
14
14
|
Install
|
15
|
-
|
15
|
+
-------
|
16
16
|
|
17
|
-
Latest version can be
|
17
|
+
Latest version can be installed by running the following command:
|
18
18
|
|
19
|
-
|
19
|
+
`vagrant plugin install vagrant-vcloud`
|
20
20
|
|
21
21
|
Vagrant will download all the required gems during the installation process.
|
22
22
|
|
23
|
-
After the install has completed a
|
23
|
+
After the install has completed a `vagrant up --provider=vcloud` will trigger the newly installed provider.
|
24
24
|
|
25
25
|
Upgrade
|
26
|
-
|
26
|
+
-------
|
27
27
|
|
28
28
|
If you already have vagrant-vcloud installed you can update to the latest version available by issuing:
|
29
29
|
|
30
|
-
|
30
|
+
`vagrant plugin update vagrant-vcloud`
|
31
31
|
|
32
32
|
Vagrant will take care of the upgrade process.
|
33
33
|
|
34
34
|
Configuration
|
35
35
|
-------------
|
36
36
|
|
37
|
-
Here's a sample Multi-VM Vagrantfile, please note that
|
37
|
+
Here's a sample Multi-VM Vagrantfile, please note that `vcloud.vdc_edge_gateway` and `vcloud.vdc_edge_gateway_ip` are required when you cannot access `vcloud.vdc_network_name` directly and there's an Organization Edge between your workstation and the vCloud Network.
|
38
38
|
|
39
39
|
```ruby
|
40
|
+
vapp = {
|
41
|
+
name: 'My vApp name',
|
42
|
+
org_name: 'OrganizationName',
|
43
|
+
orgvdc_name: 'vDC_Name',
|
44
|
+
orgvdccatalog_name: 'Vagrant',
|
45
|
+
metadata: [ [ 'key', 'value' ] ],
|
46
|
+
advanced_networking: true,
|
47
|
+
networks: {
|
48
|
+
org: [ 'Org_VDC_Network' ],
|
49
|
+
vapp: [
|
50
|
+
{
|
51
|
+
name: 'MyNetwork',
|
52
|
+
ip_subnet: '10.10.10.10/255.255.255.0'
|
53
|
+
}
|
54
|
+
]
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
40
58
|
nodes = [
|
41
|
-
{
|
59
|
+
{
|
60
|
+
hostname: 'web-vm',
|
61
|
+
box: 'gosddc/precise32',
|
62
|
+
memory: 512,
|
63
|
+
cpus: 1,
|
64
|
+
nested_hypervisor: false,
|
65
|
+
add_hdds: [ 1024 ],
|
66
|
+
power_on: true,
|
67
|
+
ssh_enable: true,
|
68
|
+
sync_enable: true,
|
69
|
+
metadata: [ [ 'key', 'value' ] ],
|
70
|
+
nics: [
|
71
|
+
type: :vmxnet3,
|
72
|
+
connected: true,
|
73
|
+
network: "vApp netowrk",
|
74
|
+
primary: true,
|
75
|
+
ip_mode: "static",
|
76
|
+
ip: "10.10.10.1",
|
77
|
+
mac: "00:50:56:00:00:01"
|
78
|
+
],
|
79
|
+
enable_guest_customization: true,
|
80
|
+
guest_customization_script: 'touch /sample.file'
|
81
|
+
},
|
42
82
|
{ hostname: 'ssh-vm', box: 'gosddc/precise32' },
|
43
83
|
{ hostname: 'sql-vm', box: 'gosddc/precise32' },
|
44
84
|
{ hostname: 'app-vm', box: 'gosddc/precise32' }
|
@@ -48,22 +88,30 @@ Vagrant.configure('2') do |config|
|
|
48
88
|
|
49
89
|
# vCloud Director provider settings
|
50
90
|
config.vm.provider :vcloud do |vcloud|
|
51
|
-
vcloud.vapp_prefix = 'multibox-sample'
|
52
91
|
|
53
92
|
vcloud.hostname = 'https://my.cloudprovider.com'
|
54
93
|
vcloud.username = 'MyUserName'
|
55
94
|
vcloud.password = 'MySup3rS3cr3tPassw0rd!'
|
56
95
|
|
57
|
-
vcloud.
|
58
|
-
vcloud.vdc_name = 'vDC_Name'
|
59
|
-
|
60
|
-
vcloud.catalog_name = 'Vagrant'
|
61
|
-
vcloud.ip_subnet = '172.16.32.125/255.255.255.240'
|
62
|
-
|
63
|
-
vcloud.vdc_network_name = 'MyNetwork'
|
96
|
+
vcloud.vapp_prefix = 'multibox-sample'
|
64
97
|
|
65
|
-
vcloud.
|
66
|
-
vcloud.
|
98
|
+
vcloud.org_name = vapp[:org_name]
|
99
|
+
vcloud.vdc_name = vapp[:orgvdc_name]
|
100
|
+
vcloud.catalog_name = vapp[:orgvdccatalog_name]
|
101
|
+
|
102
|
+
vcloud.vapp_name = vapp[:name]
|
103
|
+
vcloud.metadata_vapp = vapp[:metadata]
|
104
|
+
vcloud.auto_yes_for_upload = vapp[:auto_yes_for_upload]
|
105
|
+
|
106
|
+
vcloud.advanced_network = vapp[:advanced_networking]
|
107
|
+
if vapp[:advanced_networking]
|
108
|
+
vcloud.networks = vapp[:networks]
|
109
|
+
else
|
110
|
+
vcloud.ip_subnet = '172.16.32.125/255.255.255.240'
|
111
|
+
vcloud.vdc_network_name = 'MyNetwork'
|
112
|
+
vcloud.vdc_edge_gateway = 'MyOrgEdgeGateway'
|
113
|
+
vcloud.vdc_edge_gateway_ip = '10.10.10.10'
|
114
|
+
end
|
67
115
|
end
|
68
116
|
|
69
117
|
nodes.each do |node|
|
@@ -71,10 +119,27 @@ Vagrant.configure('2') do |config|
|
|
71
119
|
node_config.vm.box = node[:box]
|
72
120
|
node_config.vm.hostname = node[:hostname]
|
73
121
|
node_config.vm.box_url = node[:box_url]
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
122
|
+
if vapp[:advanced_networking]
|
123
|
+
node_config.vm.provider :vcloud do |pro|
|
124
|
+
pro.memory = node[:memory]
|
125
|
+
pro.cpus = node[:cpus]
|
126
|
+
pro.add_hdds = node[:add_hdds]
|
127
|
+
pro.nics = node[:nics]
|
128
|
+
pro.ssh_enabled = node[:ssh_enabled]
|
129
|
+
pro.sync_enabled = node[:sync_enabled]
|
130
|
+
pro.power_on = node[:power_on]
|
131
|
+
pro.metadata_vm = node[:metadata]
|
132
|
+
pro.nested_hypervisor = node[:nested_hypervisor]
|
133
|
+
pro.enable_guest_customization = node[:enable_guest_customization]
|
134
|
+
pro.guest_customization_script = node[:guest_customization_script]
|
135
|
+
end
|
136
|
+
node_config.vm.network :public_network
|
137
|
+
else
|
138
|
+
node_config.vm.network :forwarded_port,
|
139
|
+
guest: 80,
|
140
|
+
host: 8080,
|
141
|
+
auto_correct: true
|
142
|
+
end
|
78
143
|
# node_config.vm.provision :puppet do |puppet|
|
79
144
|
# puppet.manifests_path = 'puppet/manifests'
|
80
145
|
# puppet.manifest_file = 'site.pp'
|
@@ -85,22 +150,19 @@ Vagrant.configure('2') do |config|
|
|
85
150
|
end
|
86
151
|
```
|
87
152
|
|
88
|
-
For additional documentation on
|
153
|
+
For additional documentation on network setups with vCloud Director, check the [Network Deployment Options](../../wiki/Network-Deployment-Options) Wiki page
|
89
154
|
|
90
155
|
Contribute
|
91
|
-
|
156
|
+
----------
|
92
157
|
|
93
158
|
What is still missing:
|
94
159
|
|
95
|
-
-
|
96
|
-
-
|
97
|
-
-
|
98
|
-
-
|
99
|
-
-
|
100
|
-
-
|
101
|
-
-
|
102
|
-
|
103
|
-
If you're a developer and want to lend us a hand, head over to our ```develop``` branch and send us PRs!
|
104
|
-
|
160
|
+
- TEST SUITES! (working on that).
|
161
|
+
- Speed, the code is definitely not optimized.
|
162
|
+
- Permission checks, make sure you have at least Catalog Admin privileges if you want to upload boxes to vCloud.
|
163
|
+
- Thorough testing.
|
164
|
+
- Error checking is absymal.
|
165
|
+
- Some spaghetti code here and there.
|
166
|
+
- Bugs, bugs and BUGS!.
|
105
167
|
|
106
|
-
|
168
|
+
If you're a developer and want to lend us a hand, head over to our `develop` branch and send us PRs!
|
data/Rakefile
CHANGED
@@ -20,10 +20,21 @@ module VagrantPlugins
|
|
20
20
|
b2.use HandleNATPortCollisions
|
21
21
|
b2.use ForwardPorts
|
22
22
|
end
|
23
|
+
cfg = env[:machine].provider_config
|
24
|
+
if cfg.power_on.nil? || cfg.power_on == true
|
25
|
+
if cfg.ssh_enabled.nil? || cfg.ssh_enabled == true
|
26
|
+
b2.use WaitForCommunicator, [:starting, :running]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
b2.use Provision
|
30
|
+
if cfg.power_on.nil? || cfg.power_on == true # can't ssh if not on
|
31
|
+
if cfg.ssh_enabled.nil? || cfg.ssh_enabled == true # can't sync if ssh is disabled
|
32
|
+
if cfg.sync_enabled.nil? || cfg.sync_enabled == true
|
33
|
+
b2.use SyncFolders
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
23
37
|
end
|
24
|
-
b.use WaitForCommunicator, [:starting, :running]
|
25
|
-
b.use Provision
|
26
|
-
b.use SyncFolders
|
27
38
|
end
|
28
39
|
end
|
29
40
|
|
@@ -59,7 +70,7 @@ module VagrantPlugins
|
|
59
70
|
end
|
60
71
|
end
|
61
72
|
|
62
|
-
def self.
|
73
|
+
def self.action_poweroff
|
63
74
|
Vagrant::Action::Builder.new.tap do |b|
|
64
75
|
b.use ConfigValidate
|
65
76
|
b.use ConnectVCloud
|
@@ -70,6 +81,17 @@ module VagrantPlugins
|
|
70
81
|
end
|
71
82
|
end
|
72
83
|
|
84
|
+
def self.action_halt
|
85
|
+
Vagrant::Action::Builder.new.tap do |b|
|
86
|
+
b.use ConfigValidate
|
87
|
+
b.use ConnectVCloud
|
88
|
+
b.use Call, IsPaused do |env, b2|
|
89
|
+
b2.use Resume if env[:result]
|
90
|
+
end
|
91
|
+
b.use ShutDown
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
73
95
|
def self.action_suspend
|
74
96
|
Vagrant::Action::Builder.new.tap do |b|
|
75
97
|
b.use ConnectVCloud
|
@@ -105,15 +127,15 @@ module VagrantPlugins
|
|
105
127
|
|
106
128
|
b3.use Call, IsRunning do |env3, b4|
|
107
129
|
# If the VM is running, must power off
|
108
|
-
b4.use
|
130
|
+
b4.use action_poweroff if env3[:result]
|
109
131
|
end
|
110
132
|
b3.use Call, IsLastVM do |env3, b4|
|
111
133
|
if env3[:result]
|
112
134
|
# Check if the network is bridged
|
113
|
-
b4.use Call, IsBridged do |env4, b5|
|
114
|
-
|
115
|
-
|
116
|
-
end
|
135
|
+
# b4.use Call, IsBridged do |env4, b5|
|
136
|
+
# # if it's not, delete port forwardings.
|
137
|
+
# b5.use UnmapPortForwardings unless env4[:bridged_network] || env4[:advanced_network]
|
138
|
+
# end
|
117
139
|
b4.use PowerOffVApp
|
118
140
|
b4.use DestroyVApp
|
119
141
|
else
|
@@ -286,6 +308,8 @@ module VagrantPlugins
|
|
286
308
|
action_root.join('read_state')
|
287
309
|
autoload :Resume,
|
288
310
|
action_root.join('resume')
|
311
|
+
autoload :ShutDown,
|
312
|
+
action_root.join('shut_down')
|
289
313
|
autoload :Suspend,
|
290
314
|
action_root.join('suspend')
|
291
315
|
autoload :SyncFolders,
|
@@ -19,15 +19,14 @@ module VagrantPlugins
|
|
19
19
|
cnx = cfg.vcloud_cnx.driver
|
20
20
|
vm_name = cfg.name ? cfg.name.to_sym : env[:machine].name
|
21
21
|
|
22
|
-
if cfg.ip_dns.nil?
|
23
|
-
dns_address1 = '8.8.8.8'
|
24
|
-
dns_address2 = '8.8.4.4'
|
25
|
-
else
|
26
|
-
dns_address1 = cfg.ip_dns.shift
|
27
|
-
dns_address2 = cfg.ip_dns.shift
|
28
|
-
end
|
29
|
-
|
30
22
|
if !cfg.ip_subnet.nil?
|
23
|
+
if cfg.ip_dns.nil?
|
24
|
+
dns_address1 = '8.8.8.8'
|
25
|
+
dns_address2 = '8.8.4.4'
|
26
|
+
else
|
27
|
+
dns_address1 = cfg.ip_dns.shift
|
28
|
+
dns_address2 = cfg.ip_dns.shift
|
29
|
+
end
|
31
30
|
@logger.debug("Input address: #{cfg.ip_subnet}")
|
32
31
|
|
33
32
|
begin
|
@@ -56,6 +55,14 @@ module VagrantPlugins
|
|
56
55
|
# Reverse back the array.
|
57
56
|
range_addresses.reverse!
|
58
57
|
|
58
|
+
dhcp_enabled = 'false'
|
59
|
+
if !cfg.dhcp_enabled.nil? and cfg.dhcp_enabled == true
|
60
|
+
dhcp_enabled = 'true'
|
61
|
+
range_addresses = cfg.pool_range
|
62
|
+
dhcp_start = cfg.dhcp_range.shift
|
63
|
+
dhcp_end = cfg.dhcp_range.shift
|
64
|
+
end
|
65
|
+
|
59
66
|
@logger.debug("Gateway IP: #{gateway_ip.to_s}")
|
60
67
|
@logger.debug("Netmask: #{cidr.wildcard_mask}")
|
61
68
|
@logger.debug(
|
@@ -73,6 +80,9 @@ module VagrantPlugins
|
|
73
80
|
:ip_allocation_mode => 'POOL',
|
74
81
|
:parent_network => cfg.vdc_network_id,
|
75
82
|
:enable_firewall => 'false',
|
83
|
+
:dhcp_enabled => dhcp_enabled,
|
84
|
+
:dhcp_start => dhcp_start,
|
85
|
+
:dhcp_end => dhcp_end,
|
76
86
|
:dns1 => dns_address1,
|
77
87
|
:dns2 => dns_address2
|
78
88
|
}
|
@@ -88,7 +98,127 @@ module VagrantPlugins
|
|
88
98
|
|
89
99
|
env[:bridged_network] = true
|
90
100
|
|
101
|
+
elsif !cfg.networks.nil?
|
102
|
+
# Advanced network definition
|
103
|
+
env[:advanced_network] = true
|
104
|
+
network_options = []
|
105
|
+
if cfg.networks[:org]
|
106
|
+
cfg.networks[:org].each do |net|
|
107
|
+
net_id = cfg.org[:networks][net]
|
108
|
+
if !net_id
|
109
|
+
# TEMP FIX: permissions issues at the Org Level for vApp authors
|
110
|
+
# to "view" Org vDC Networks but they can see them at the
|
111
|
+
# Organization vDC level (tsugliani)
|
112
|
+
net_id = cfg.vdc[:networks][net]
|
113
|
+
if !net_id
|
114
|
+
raise 'vCloud User credentials has insufficient privileges'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
network_options.push({
|
118
|
+
:name => net,
|
119
|
+
:fence_mode => 'bridged',
|
120
|
+
:ip_allocation_mode => 'POOL',
|
121
|
+
:parent_network => net_id
|
122
|
+
})
|
123
|
+
end
|
124
|
+
end
|
125
|
+
if cfg.networks[:vapp]
|
126
|
+
cfg.networks[:vapp].each_with_index do |net, i|
|
127
|
+
if net[:ip_dns].nil?
|
128
|
+
dns_address1 = '8.8.8.8'
|
129
|
+
dns_address2 = '8.8.4.4'
|
130
|
+
else
|
131
|
+
dns_address1 = net[:ip_dns].shift
|
132
|
+
dns_address2 = net[:ip_dns].shift
|
133
|
+
end
|
134
|
+
@logger.debug("Input address[#{i}]: #{net[:ip_subnet]}")
|
135
|
+
|
136
|
+
begin
|
137
|
+
cidr = NetAddr::CIDR.create(net[:ip_subnet])
|
138
|
+
rescue NetAddr::ValidationError
|
139
|
+
raise Errors::InvalidSubnet, :message => net[:ip_subnet]
|
140
|
+
end
|
141
|
+
|
142
|
+
if cidr.bits > 30
|
143
|
+
@logger.debug('Subnet too small!')
|
144
|
+
raise Errors::SubnetTooSmall, :message => net[:ip_subnet]
|
145
|
+
end
|
146
|
+
|
147
|
+
range_addresses = cidr.range(0)
|
148
|
+
|
149
|
+
@logger.debug("Range[#{i}]: #{range_addresses}")
|
150
|
+
|
151
|
+
# Delete the "network" address from the range.
|
152
|
+
range_addresses.shift
|
153
|
+
# Retrieve the first usable IP, to be used as a gateway.
|
154
|
+
if net[:gateway]
|
155
|
+
gateway_ip = net[:gateway]
|
156
|
+
else
|
157
|
+
gateway_ip = range_addresses.shift
|
158
|
+
end
|
159
|
+
# Reverse the array in place.
|
160
|
+
range_addresses.reverse!
|
161
|
+
# Delete the "broadcast" address from the range.
|
162
|
+
range_addresses.shift
|
163
|
+
# Reverse back the array.
|
164
|
+
range_addresses.reverse!
|
165
|
+
|
166
|
+
dhcp_enabled = 'false'
|
167
|
+
dhcp_start = nil
|
168
|
+
dhcp_end = nil
|
169
|
+
if !net[:dhcp_enabled].nil? and net[:dhcp_enabled] == true
|
170
|
+
dhcp_enabled = 'true'
|
171
|
+
range_addresses = net[:pool_range]
|
172
|
+
dhcp_start = net[:dhcp_range].shift
|
173
|
+
dhcp_end = net[:dhcp_range].shift
|
174
|
+
end
|
175
|
+
|
176
|
+
@logger.debug("Gateway IP[#{i}]: #{gateway_ip.to_s}")
|
177
|
+
@logger.debug("Netmask[#{i}]: #{cidr.wildcard_mask}")
|
178
|
+
@logger.debug("IP Pool[#{i}]: #{range_addresses.first}-#{range_addresses.last}")
|
179
|
+
@logger.debug("DNS1[#{i}]: #{dns_address1} DNS2[#{i}]: #{dns_address2}")
|
180
|
+
n = {
|
181
|
+
:name => net[:name],
|
182
|
+
:gateway => gateway_ip.to_s,
|
183
|
+
:netmask => cidr.wildcard_mask,
|
184
|
+
:start_address => range_addresses.first,
|
185
|
+
:end_address => range_addresses.last,
|
186
|
+
:fence_mode => 'natRouted',
|
187
|
+
:ip_allocation_mode => 'POOL',
|
188
|
+
:enable_firewall => 'false',
|
189
|
+
:dhcp_enabled => dhcp_enabled,
|
190
|
+
:dhcp_start => dhcp_start,
|
191
|
+
:dhcp_end => dhcp_end,
|
192
|
+
:dns1 => dns_address1,
|
193
|
+
:dns2 => dns_address2
|
194
|
+
}
|
195
|
+
if net[:vdc_network_name]
|
196
|
+
net_id = cfg.org[:networks][net[:vdc_network_name]]
|
197
|
+
if !net_id
|
198
|
+
# TEMP FIX: permissions issues at the Org Level for vApp authors
|
199
|
+
# to "view" Org vDC Networks but they can see them at the
|
200
|
+
# Organization vDC level (tsugliani)
|
201
|
+
net_id = cfg.vdc[:networks][net[:vdc_network_name]]
|
202
|
+
if !net_id
|
203
|
+
raise 'vCloud User credentials has insufficient privileges'
|
204
|
+
end
|
205
|
+
end
|
206
|
+
n[:parent_network] = net_id
|
207
|
+
net[:parent_network] = net_id
|
208
|
+
end
|
209
|
+
|
210
|
+
network_options.push(n)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
91
214
|
else
|
215
|
+
if cfg.ip_dns.nil?
|
216
|
+
dns_address1 = '8.8.8.8'
|
217
|
+
dns_address2 = '8.8.4.4'
|
218
|
+
else
|
219
|
+
dns_address1 = cfg.ip_dns.shift
|
220
|
+
dns_address2 = cfg.ip_dns.shift
|
221
|
+
end
|
92
222
|
|
93
223
|
@logger.debug("DNS1: #{dns_address1} DNS2: #{dns_address2}")
|
94
224
|
# No IP subnet specified, reverting to defaults
|
@@ -108,23 +238,31 @@ module VagrantPlugins
|
|
108
238
|
|
109
239
|
end
|
110
240
|
|
241
|
+
network_options = [network_options] if !network_options.kind_of?(Array)
|
242
|
+
|
111
243
|
if env[:machine].get_vapp_id.nil?
|
112
244
|
env[:ui].info('Building vApp...')
|
113
245
|
|
114
|
-
|
115
|
-
|
246
|
+
if cfg.vapp_name
|
247
|
+
vapp_name = cfg.vapp_name
|
248
|
+
else
|
249
|
+
vapp_prefix = cfg.vapp_prefix
|
250
|
+
vapp_prefix = 'Vagrant' if vapp_prefix.nil?
|
251
|
+
vapp_name = "#{vapp_prefix}-#{Etc.getlogin}-#{Socket.gethostname.downcase}-" +
|
252
|
+
"#{SecureRandom.hex(4)}"
|
253
|
+
end
|
116
254
|
|
117
255
|
compose = cnx.compose_vapp_from_vm(
|
118
256
|
cfg.vdc_id,
|
119
|
-
|
120
|
-
"#{SecureRandom.hex(4)}",
|
257
|
+
vapp_name,
|
121
258
|
"vApp created by #{Etc.getlogin} running on " +
|
122
259
|
"#{Socket.gethostname.downcase} using vagrant-vcloud on " +
|
123
260
|
"#{Time.now.strftime("%B %d, %Y")}",
|
124
261
|
{
|
125
262
|
vm_name => cfg.catalog_item[:vms_hash].first.last[:id]
|
126
263
|
},
|
127
|
-
network_options
|
264
|
+
network_options,
|
265
|
+
cfg
|
128
266
|
)
|
129
267
|
@logger.debug('Launch Compose vApp...')
|
130
268
|
# Wait for the task to finish.
|
@@ -146,27 +284,12 @@ module VagrantPlugins
|
|
146
284
|
# FIXME: Add a lot of error handling for each step here !
|
147
285
|
if new_vapp
|
148
286
|
env[:ui].success("vApp #{new_vapp[:name]} successfully created.")
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
@logger.info(
|
156
|
-
"Setting Guest Customization on ID: [#{vm_name}] " +
|
157
|
-
"of vApp [#{new_vapp[:name]}]"
|
158
|
-
)
|
159
|
-
|
160
|
-
set_custom = cnx.set_vm_guest_customization(
|
161
|
-
new_vm_properties[:id],
|
162
|
-
vm_name,
|
163
|
-
{
|
164
|
-
:enabled => true,
|
165
|
-
:admin_passwd_enabled => false
|
166
|
-
}
|
167
|
-
)
|
168
|
-
cnx.wait_task_completion(set_custom)
|
169
|
-
|
287
|
+
# add vapp metadata
|
288
|
+
if !cfg.metadata_vapp.nil?
|
289
|
+
env[:ui].info('Setting vApp metadata...')
|
290
|
+
set_metadata_vapp = cnx.set_vapp_metadata vapp_id, cfg.metadata_vapp
|
291
|
+
cnx.wait_task_completion(set_metadata_vapp)
|
292
|
+
end
|
170
293
|
else
|
171
294
|
env[:ui].error("vApp #{new_vapp[:name]} creation failed!")
|
172
295
|
raise # FIXME: error handling missing.
|
@@ -180,7 +303,8 @@ module VagrantPlugins
|
|
180
303
|
{
|
181
304
|
vm_name => cfg.catalog_item[:vms_hash].first.last[:id]
|
182
305
|
},
|
183
|
-
network_options
|
306
|
+
network_options,
|
307
|
+
cfg
|
184
308
|
)
|
185
309
|
|
186
310
|
@logger.info('Waiting for the recompose task to complete ...')
|
@@ -190,31 +314,14 @@ module VagrantPlugins
|
|
190
314
|
|
191
315
|
new_vapp = cnx.get_vapp(env[:machine].get_vapp_id)
|
192
316
|
# FIXME: Add a lot of error handling for each step here !
|
193
|
-
if new_vapp
|
194
|
-
new_vm_properties = new_vapp[:vms_hash].fetch(vm_name)
|
195
|
-
env[:machine].id = new_vm_properties[:id]
|
196
|
-
|
197
|
-
### SET GUEST CONFIG
|
198
|
-
@logger.info(
|
199
|
-
'Setting Guest Customization on ID: ' +
|
200
|
-
"[#{new_vm_properties[:id]}] of vApp [#{new_vapp[:name]}]"
|
201
|
-
)
|
202
|
-
|
203
|
-
set_custom = cnx.set_vm_guest_customization(
|
204
|
-
new_vm_properties[:id],
|
205
|
-
vm_name,
|
206
|
-
{
|
207
|
-
:enabled => true,
|
208
|
-
:admin_passwd_enabled => false
|
209
|
-
}
|
210
|
-
)
|
211
|
-
cnx.wait_task_completion(set_custom)
|
212
|
-
|
213
|
-
else
|
317
|
+
if !new_vapp
|
214
318
|
env[:ui].error("VM #{vm_name} add to #{new_vapp[:name]} failed!")
|
215
319
|
raise
|
216
320
|
end
|
217
321
|
end
|
322
|
+
# Add the vm id as machine.id
|
323
|
+
new_vm_properties = new_vapp[:vms_hash].fetch(vm_name)
|
324
|
+
env[:machine].id = new_vm_properties[:id]
|
218
325
|
|
219
326
|
@app.call env
|
220
327
|
end
|