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
|
# File 'lib/vagrant-packet/action/run_instance.rb', line 26
def call(env)
env[:metrics] ||= {}
machine = env[:machine]
env[:ui].info(I18n.t('vagrant_packet.launching_instance'))
env[:ui].info(" -- Project: #{machine.provider_config.project_id}") unless ENV['PACKET_PROJECT_ID']
env[:ui].info(" -- Facility: #{machine.provider_config.facility}") unless ENV['PACKET_FACILITY']
env[:ui].info(" -- OS: #{machine.provider_config.operating_system}")
env[:ui].info(" -- Machine: #{machine.provider_config.plan}")
options = {
project_id: machine.provider_config.project_id,
hostname: machine.provider_config.hostname,
plan: machine.provider_config.plan,
facility: machine.provider_config.facility,
operating_system: machine.provider_config.operating_system,
description: machine.provider_config.description,
billing_cycle: machine.provider_config.billing_cycle,
always_pxe: machine.provider_config.always_pxe,
ipxe_script_url: machine.provider_config.ipxe_script_url,
userdata: machine.provider_config.userdata,
locked: machine.provider_config.locked,
hardware_reservation_id: machine.provider_config.hardware_reservation_id,
spot_instance: machine.provider_config.spot_instance,
spot_price_max: machine.provider_config.spot_price_max,
termination_time: machine.provider_config.termination_time,
tags: machine.provider_config.tags,
project_ssh_keys: machine.provider_config.project_ssh_keys,
user_ssh_keys: machine.provider_config.user_ssh_keys,
features: machine.provider_config.features
}
begin
server = env[:packet_compute].devices.create(options)
rescue *FOG_ERRORS => e
raise Errors::FogError, message: e.message
end
env[:machine].id = server.id
env[:metrics]['instance_ready_time'] = Util::Timer.time do
tries = machine.provider_config.instance_ready_timeout / 2
env[:ui].info(I18n.t('vagrant_packet.waiting_for_ready'))
begin
retryable(on: Fog::Errors::TimeoutError, tries: tries) do
next if env[:interrupted]
server.wait_for(2, machine.provider_config.instance_check_interval) { ready? }
end
rescue Fog::Errors::TimeoutError
terminate(env)
raise(Errors::InstanceReadyTimeout, timeout: machine.provider_config.instance_ready_timeout)
end
end
@logger.info("Time to instance ready: #{env[:metrics]['instance_ready_time']}")
unless env[:interrupted]
env[:metrics]['instance_ssh_time'] = Util::Timer.time do
env[:ui].info(I18n.t('vagrant_packet.waiting_for_ssh'))
network_ready_retries = 0
network_ready_retries_max = 10
loop do
break if env[:interrupted]
begin
break if env[:machine].communicate.ready?
rescue Exception => e if network_ready_retries < network_ready_retries_max network_ready_retries += 1
@logger.warn(I18n.t('vagrant_packet.waiting_for_ssh, retrying'))
else
raise e
end
end
sleep 2
end
end
@logger.info("Time till SSH ready: #{env[:metrics]['instance_ssh_time']}")
env[:ui].info(I18n.t('vagrant_packet.ready'))
end
terminate(env) if env[:interrupted]
@app.call(env)
end
|