Class: VagrantPlugins::Openstack::Action::CreateServer

Inherits:
Object
  • Object
show all
Includes:
Vagrant::Util::Retryable
Defined in:
lib/vagrant-openstack-provider/action/create_server.rb

Instance Method Summary collapse

Constructor Details

#initialize(app, _env) ⇒ CreateServer

Returns a new instance of CreateServer.



13
14
15
16
# File 'lib/vagrant-openstack-provider/action/create_server.rb', line 13

def initialize(app, _env)
  @app = app
  @logger = Log4r::Logger.new('vagrant_openstack::action::create_server')
end

Instance Method Details

#call(env) ⇒ Object



18
19
20
21
22
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
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
# File 'lib/vagrant-openstack-provider/action/create_server.rb', line 18

def call(env)
  config = env[:machine].provider_config
  nova = env[:openstack_client].nova

  flavor = resolve_flavor(env)
  image = resolve_image(env)
  networks = resolve_networks(env)
  server_name = config.server_name || env[:machine].name

  env[:ui].info(I18n.t('vagrant_openstack.launching_server'))
  env[:ui].info(" -- Tenant         : #{config.tenant_name}")
  env[:ui].info(" -- Name           : #{server_name}")
  env[:ui].info(" -- Flavor         : #{flavor.name}")
  env[:ui].info(" -- FlavorRef      : #{flavor.id}")
  env[:ui].info(" -- Image          : #{image.name}")
  env[:ui].info(" -- ImageRef       : #{image.id}")
  env[:ui].info(" -- KeyPair        : #{config.keypair_name}")
  unless networks.empty?
    if networks.size == 1
      env[:ui].info(" -- Network        : #{config.networks[0]}")
    else
      env[:ui].info(" -- Networks       : #{config.networks}")
    end
  end

  server_id = nova.create_server(env, server_name, image.id, flavor.id, networks, config.keypair_name)

  # Store the ID right away so we can track it
  env[:machine].id = server_id

  # Wait for the server to finish building
  env[:ui].info(I18n.t('vagrant_openstack.waiting_for_build'))
  timeout(200) do
    while nova.get_server_details(env, server_id)['status'] != 'ACTIVE'
      sleep 3
      @logger.debug('Waiting for server to be ACTIVE')
    end
  end

  if config.floating_ip
    env[:ui].info("Using floating IP #{config.floating_ip}")
    nova.add_floating_ip(env, server_id, config.floating_ip)
  end

  unless env[:interrupted]
    # Clear the line one more time so the progress is removed
    env[:ui].clear_line

    # Wait for SSH to become available
    host = env[:machine].provider_config.floating_ip
    ssh_timeout = env[:machine].provider_config.ssh_timeout
    unless port_open?(env, host, 22, ssh_timeout)
      env[:ui].error(I18n.t('vagrant_openstack.timeout'))
      fail Errors::SshUnavailable, host: host, timeout: ssh_timeout
    end

    env[:ui].info(I18n.t('vagrant_openstack.ready'))
  end

  @app.call(env)
end