Class: VagrantPlugins::Cloudstack::Action::ReadSSHInfo

Inherits:
ReadTransportInfo show all
Defined in:
lib/vagrant-cloudstack/action/read_ssh_info.rb

Overview

This action reads the SSH info for the machine and puts it into the ‘:machine_ssh_info` key in the environment.

Instance Method Summary collapse

Methods inherited from ReadTransportInfo

#find_server, #retrieve_public_ip_port

Constructor Details

#initialize(app, env) ⇒ ReadSSHInfo

Returns a new instance of ReadSSHInfo.



10
11
12
13
14
15
# File 'lib/vagrant-cloudstack/action/read_ssh_info.rb', line 10

def initialize(app, env)
  @app    = app
  @logger = Log4r::Logger.new("vagrant_cloudstack::action::read_ssh_info")

  @public_port_fieldname = 'pf_public_port'
end

Instance Method Details

#call(env) ⇒ Object



17
18
19
20
21
# File 'lib/vagrant-cloudstack/action/read_ssh_info.rb', line 17

def call(env)
  env[:machine_ssh_info] = read_ssh_info(env[:cloudstack_compute], env[:machine])

  @app.call(env)
end

#fetch_nic_ip_address(nics, domain_config) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/vagrant-cloudstack/action/read_ssh_info.rb', line 53

def fetch_nic_ip_address(nics, domain_config)
  ssh_nic =
    if !domain_config.ssh_network_id.nil?
      nics.find { |nic| nic["networkid"] == domain_config.ssh_network_id }
    elsif !domain_config.ssh_network_name.nil?
      nics.find { |nic| nic["networkname"] == domain_config.ssh_network_name }
    else
      # When without neither ssh_network_id and ssh_network_name, use 1st nic
      nics[0]
    end

  ssh_nic ||= nics[0]
  ssh_nic["ipaddress"]
end

#read_ssh_info(cloudstack, machine) ⇒ Object



23
24
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
# File 'lib/vagrant-cloudstack/action/read_ssh_info.rb', line 23

def read_ssh_info(cloudstack, machine)
  return nil if (server = find_server(cloudstack, machine)).nil?

  # Get the Port forwarding config
  domain        = machine.provider_config.domain_id
  domain_config = machine.provider_config.get_domain_config(domain)

  pf_ip_address, pf_public_port = retrieve_public_ip_port(cloudstack, domain_config, machine)

  if domain_config.keypair.nil? && domain_config.ssh_key.nil?
    sshkeyfile_file = machine.data_dir.join('sshkeyfile')
    if sshkeyfile_file.file?
      domain_config.ssh_key = sshkeyfile_file.to_s
    end
  end

  nic_ip_address = fetch_nic_ip_address(server.nics, domain_config)

  transport_info = {
               :host => pf_ip_address || nic_ip_address,
               :port => pf_public_port
             }
  transport_info = transport_info.merge({
    :private_key_path => domain_config.ssh_key,
    :password         => nil
  }) unless domain_config.ssh_key.nil?
  transport_info = transport_info.merge({ :username => domain_config.ssh_user }) unless domain_config.ssh_user.nil?
  transport_info
end