lib/vagrant-vcloud/action/forward_ports.rb in vagrant-vcloud-0.3.3 vs lib/vagrant-vcloud/action/forward_ports.rb in vagrant-vcloud-0.4.0
- old
+ new
@@ -57,12 +57,10 @@
:nat_external_port => fp.host_port,
:name => fp.id,
:nat_protocol => fp.protocol.upcase,
:vapp_scoped_local_id => vm_info[:vapp_scoped_local_id]
}
-
- edge_ports << fp.host_port
end
if !ports.empty?
# We only need to forward ports if there are any to forward
@logger.debug("Port object to be passed: #{ports.inspect}")
@@ -89,30 +87,44 @@
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
- edge_ports.each do |port|
- @env[:ui].info(
- "Creating NAT rules on [#{cfg.vdc_edge_gateway}] " +
- "for IP [#{cfg.vdc_edge_gateway_ip}] port #{port}."
- )
+ 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(
+ "Creating NAT rules on [#{cfg.vdc_edge_gateway}] " +
+ "for IP [#{vapp_edge_ip}] port #{port[:nat_external_port]}."
+ )
+
+ edge_ports << port[:nat_external_port]
+ end
end
- # Add the vShield Edge Gateway rules
- add_ports = cnx.add_edge_gateway_rules(
- cfg.vdc_edge_gateway,
- cfg.vdc_id,
- cfg.vdc_edge_gateway_ip,
- vapp_id,
- edge_ports
- )
+ if !edge_ports.empty?
+ # Add the vShield Edge Gateway rules
+ 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)
+ wait = cnx.wait_task_completion(add_ports)
- if !wait[:errormsg].nil?
- raise Errors::ComposeVAppError, :message => wait[:errormsg]
+ if !wait[:errormsg].nil?
+ raise Errors::ComposeVAppError, :message => wait[:errormsg]
+ end
end
end
end
end