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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
# File 'lib/vagrant-google/action/run_instance.rb', line 36
def call(env) env[:metrics] ||= {}
zone = env[:machine].provider_config.zone
zone_config = env[:machine].provider_config.get_zone_config(zone)
image = zone_config.image
instance_group = zone_config.instance_group
name = zone_config.name
machine_type = zone_config.machine_type
disk_size = zone_config.disk_size
disk_name = zone_config.disk_name
disk_type = zone_config.disk_type
network = zone_config.network
metadata = zone_config.metadata
tags = zone_config.tags
can_ip_forward = zone_config.can_ip_forward
external_ip = zone_config.external_ip
preemptible = zone_config.preemptible
auto_restart = zone_config.auto_restart
on_host_maintenance = zone_config.on_host_maintenance
autodelete_disk = zone_config.autodelete_disk
service_accounts = zone_config.service_accounts
env[:ui].info(I18n.t("vagrant_google.launching_instance"))
env[:ui].info(" -- Name: #{name}")
env[:ui].info(" -- Type: #{machine_type}")
env[:ui].info(" -- Disk type: #{disk_type}")
env[:ui].info(" -- Disk size: #{disk_size} GB")
env[:ui].info(" -- Disk name: #{disk_name}")
env[:ui].info(" -- Image: #{image}")
env[:ui].info(" -- Instance Group: #{instance_group}")
env[:ui].info(" -- Zone: #{zone}") if zone
env[:ui].info(" -- Network: #{network}") if network
env[:ui].info(" -- Metadata: '#{metadata}'")
env[:ui].info(" -- Tags: '#{tags}'")
env[:ui].info(" -- IP Forward: #{can_ip_forward}")
env[:ui].info(" -- External IP: #{external_ip}")
env[:ui].info(" -- Preemptible: #{preemptible}")
env[:ui].info(" -- Auto Restart: #{auto_restart}")
env[:ui].info(" -- On Maintenance: #{on_host_maintenance}")
env[:ui].info(" -- Autodelete Disk: #{autodelete_disk}")
env[:ui].info(" -- Scopes: #{service_accounts}")
begin
request_start_time = Time.now.to_i
external_ip = get_external_ip(env, external_ip) if external_ip
disk_type = get_disk_type(env, disk_type, zone)
disk_created_by_vagrant = false
if disk_name.nil?
disk = env[:google_compute].disks.create(
name: name,
size_gb: disk_size,
type: disk_type,
zone_name: zone,
source_image: image
)
disk_created_by_vagrant = true
disk.wait_for { disk.ready? }
else
disk = env[:google_compute].disks.get(disk_name, zone)
if disk.nil?
disk = env[:google_compute].disks.create(
name: disk_name,
size_gb: disk_size,
type: disk_type,
zone_name: zone,
source_image: image
)
disk.wait_for { disk.ready? }
disk_created_by_vagrant = true
end
end
defaults = {
:name => name,
:zone_name => zone,
:machine_type => machine_type,
:disk_size => disk_size,
:disk_type => disk_type,
:image => image,
:network => network,
:metadata => metadata,
:tags => tags,
:can_ip_forward => can_ip_forward,
:external_ip => external_ip,
:preemptible => preemptible,
:auto_restart => auto_restart,
:on_host_maintenance => on_host_maintenance,
:disks => [disk.get_as_boot_disk(true, autodelete_disk)],
:service_accounts => service_accounts
}
server = env[:google_compute].servers.create(defaults)
@logger.info("Machine '#{zone}:#{name}' created.")
rescue *FOG_ERRORS => e
cleanup_disk(disk.name, env) if disk && disk_created_by_vagrant
raise Errors::FogError, :message => e.message
end
env[:machine].id = server.name
server.reload
env[:ui].info(I18n.t("vagrant_google.waiting_for_ready"))
begin
server.wait_for { ready? }
env[:metrics]["instance_ready_time"] = Time.now.to_i - request_start_time
@logger.info("Time for instance ready: #{env[:metrics]["instance_ready_time"]}")
env[:ui].info(I18n.t("vagrant_google.ready"))
rescue
env[:interrupted] = true
end
unless env[:terminated]
env[:metrics]["instance_ssh_time"] = Util::Timer.time do
env[:ui].info(I18n.t("vagrant_google.waiting_for_ssh"))
while true
break if env[:interrupted]
break if env[:machine].communicate.ready?
sleep 2
end
end
@logger.info("Time for SSH ready: #{env[:metrics]["instance_ssh_time"]}")
env[:ui].info(I18n.t("vagrant_google.ready_ssh"))
end
terminate(env) if env[:interrupted]
@app.call(env)
end
|