lib/vagrant-vcloud/action/forward_ports.rb in vagrant-vcloud-0.4.4 vs lib/vagrant-vcloud/action/forward_ports.rb in vagrant-vcloud-0.4.6

- old
+ new

@@ -12,20 +12,20 @@ def call(env) @env = env # Get the ports we are forwarding env[:forwarded_ports] ||= compile_forwarded_ports( - env[:machine].config + env[:machine] ) forward_ports @app.call(env) end def forward_ports - ports = [] + ports = {} edge_ports = [] cfg = @env[:machine].provider_config cnx = cfg.vcloud_cnx.driver vapp_id = @env[:machine].get_vapp_id @@ -39,51 +39,59 @@ # cfg.vdc_network_id = cfg.org[:networks][cfg.vdc_network_name] @logger.debug('Getting VM info...') vm = cnx.get_vapp(vapp_id) vm_info = vm[:vms_hash][vm_name.to_sym] + network_name = '' @env[:forwarded_ports].each do |fp| @env[:ui].info( "Forwarding Ports: VM port #{fp.guest_port} -> " + "vShield Edge port #{fp.host_port}" ) # Add the options to the ports array to send to the driver later - ports << { + ports["#{fp.network_name}#{fp.edge_network_name}"] = { rules: [] } if !ports["#{fp.network_name}#{fp.edge_network_name}"] + ports["#{fp.network_name}#{fp.edge_network_name}"][:network_name] = fp.network_name + ports["#{fp.network_name}#{fp.edge_network_name}"][:parent_network] = fp.edge_network_id + ports["#{fp.network_name}#{fp.edge_network_name}"][:edge_network_name] = fp.edge_network_name + ports["#{fp.network_name}#{fp.edge_network_name}"][:rules] << { :guestip => fp.guest_ip, :nat_internal_port => fp.guest_port, :hostip => fp.host_ip, :nat_external_port => fp.host_port, :name => fp.id, + :nat_vmnic_id => fp.vmnic_id, :nat_protocol => fp.protocol.upcase, :vapp_scoped_local_id => vm_info[:vapp_scoped_local_id] } 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}") - @logger.debug("Current network id #{cfg.vdc_network_id}") ### Here we apply the nat_rules to the vApp we just built - 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 - } - ) + ports.values.each do |port| + add_ports = cnx.add_vapp_port_forwarding_rules( + vapp_id, + port[:network_name], + port[:edge_network_name], + { + :fence_mode => 'natRouted', + :parent_network => port[:parent_network], + :nat_policy_type => 'allowTraffic', + :nat_rules => port[:rules] + } + ) - 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 if cfg.vdc_edge_gateway_ip && \ cfg.vdc_edge_gateway && \ @@ -95,18 +103,20 @@ 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( - "Creating NAT rules on [#{cfg.vdc_edge_gateway}] " + - "for IP [#{vapp_edge_ip}] port #{port[:nat_external_port]}." - ) + ports.values.each do |port| + port[:rules].each do |rule| + if rule[:vapp_scoped_local_id] == vm_info[:vapp_scoped_local_id] && + !vapp_edge_ports_in_use.include?(rule[:nat_external_port]) + @env[:ui].info( + "Creating NAT rules on [#{cfg.vdc_edge_gateway}] " + + "for IP [#{vapp_edge_ip}] port #{rule[:nat_external_port]}." + ) - edge_ports << port[:nat_external_port] + edge_ports << rule[:nat_external_port] + end end end if !edge_ports.empty? # Add the vShield Edge Gateway rules