17
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
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
|
# File 'lib/vagrant-niftycloud/action/run_instance.rb', line 17
def call(env)
env[:metrics] ||= {}
zone = env[:machine].provider_config.zone
zone_config = env[:machine].provider_config.get_zone_config(zone)
instance_id = zone_config.instance_id.nil? ? get_instance_id(5) : zone_config.instance_id
image_id = zone_config.image_id
zone = zone_config.zone
instance_type = zone_config.instance_type
key_name = zone_config.key_name,
firewall = zone_config.firewall,
user_data = zone_config.user_data,
password = zone_config.password
env[:ui].info(I18n.t("vagrant_niftycloud.launching_instance"))
env[:ui].info(" -- Server Type: #{instance_type}")
env[:ui].info(" -- ImageId: #{image_id}")
env[:ui].info(" -- Zone: #{zone}") if zone
env[:ui].info(" -- Key Name: #{key_name}") if key_name
env[:ui].info(" -- User Data: yes") if user_data
env[:ui].info(" -- Firewall: #{firewall.inspect}") if !firewall.empty?
options = {
:instance_id => instance_id,
:availability_zone => zone,
:instance_type => instance_type,
:image_id => image_id,
:key_name => zone_config.key_name,
:user_data => user_data,
:base64_encoded => true,
:password => password,
:accounting_type => 2, :disable_api_termination => false }
if !firewall.empty?
options[:security_group] = firewall
end
begin
server = env[:niftycloud_compute].create(options)
rescue NIFTY::ConfigurationError => e
raise Errors::NiftyCloudConfigurationError,
:message => e.message
rescue NIFTY::ArgumentError => e
raise Errors::NiftyCloudArgumentError,
:message => e.message
rescue NIFTY::ResponseFormatError => e
raise Errors::NiftyCloudResponseFormatError,
:message => e.message
rescue NIFTY::ResponseError => e
raise Errors::NiftyCloudResponseError,
:code => e.error_code,
:message => e.error_message
end
env[:machine].id = instance_id
tries = zone_config.instance_ready_timeout / 5
count = 0
retryable(:on => Errors::InstanceReadyTimeout, :tries => tries) do
env[:ui].info(I18n.t("vagrant_niftycloud.waiting_for_ready"))
while server.instanceState.name != 'running'
next if env[:interrupted]
count += 1
sleep 5
server = env[:niftycloud_compute].get(env[:machine])
env[:ui].info(I18n.t("vagrant_niftycloud.processing"))
if count > tries
terminate(env)
raise Errors::InstanceReadyTimeout, timeout: zone_config.instance_ready_timeout
end
end
end
terminate(env) if env[:interrupted]
@app.call(env)
end
|