25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
# File 'lib/vagrant-vcloudair/action/forward_ports.rb', line 25
def forward_ports
ports = []
edge_ports = []
cfg = @env[:machine].provider_config
cnx = cfg.vcloudair_cnx.driver
vapp_id = @env[:machine].get_vapp_id
vm_name = @env[:machine].name
@logger.debug('Getting VM info...')
vm = cnx.get_vapp(vapp_id)
vm_info = vm[:vms_hash][vm_name.to_sym]
@env[:forwarded_ports].each do |fp|
@env[:ui].info(I18n.t('vagrant_vcloudair.edge.port_forwarding',
guest_port: fp.guest_port,
host_port: fp.host_port))
ports << {
:guestip => fp.guest_ip,
:nat_internal_port => fp.guest_port,
:hostip => fp.host_ip,
:nat_external_port => fp.host_port,
:name => fp.id,
:nat_protocol => fp.protocol.upcase,
:vapp_scoped_local_id => vm_info[:vapp_scoped_local_id]
}
end
unless ports.empty?
@logger.debug("Port object to be passed: #{ports.inspect}")
@logger.debug("Current network id #{cfg.vdc_network_id}")
add_ports = cnx.add_vapp_port_forwarding_rules(
vapp_id,
'Vagrant-vApp-Net',
{
:fence_mode => 'natRouted',
:parent_network => cfg.vdc_network_id,
:nat_policy_type => 'allowTraffic',
:nat_rules => ports
}
)
wait = cnx.wait_task_completion(add_ports)
unless wait[:errormsg].nil?
fail Errors::ComposeVAppError, :message => wait[:errormsg]
end
if cfg.vdc_edge_gateway_ip && \
cfg.vdc_edge_gateway && \
cfg.network_bridge.nil?
vapp_edge_ip = cnx.get_vapp_edge_public_ip(vapp_id)
@logger.debug('Getting edge gateway port forwarding rules...')
edge_gateway_rules = cnx.get_edge_gateway_rules(cfg.vdc_edge_gateway,
cfg.vdc_id)
vapp_edge_dnat_rules = edge_gateway_rules.select {|r| (r[:rule_type] == 'DNAT' &&
r[:translated_ip] == vapp_edge_ip)}
vapp_edge_ports_in_use = vapp_edge_dnat_rules.map{|r| r[:original_port].to_i}.to_set
ports.each do |port|
if port[:vapp_scoped_local_id] == vm_info[:vapp_scoped_local_id] &&
!vapp_edge_ports_in_use.include?(port[:nat_external_port])
@env[:ui].info(I18n.t(
'vagrant_vcloudair.edge.nat_rules_creation',
vdc_edge_gateway: cfg.vdc_edge_gateway,
vapp_edge_ip: vapp_edge_ip,
port: port[:nat_external_port]))
edge_ports << port[:nat_external_port]
end
end
unless edge_ports.empty?
add_ports = cnx.add_edge_gateway_rules(
cfg.vdc_edge_gateway,
cfg.vdc_id,
cfg.vdc_edge_gateway_ip,
vapp_id,
edge_ports
)
wait = cnx.wait_task_completion(add_ports)
fail Errors::ComposeVAppError, :message => wait[:errormsg] unless wait[:errormsg].nil?
end
end
end
end
|