bosh_vcloud_cpi 0.7.8 → 0.7.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cloud/vcloud/cloud.rb +124 -77
- data/lib/cloud/vcloud/vcd_client.rb +7 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 710aa4ae586bb095e7d141d87f370f32aea9b5a3
|
4
|
+
data.tar.gz: 244fc9bb0602ed4cb4de55cfdbccef20b91b1c66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 622c767b56144f930d34a7241cc3f942a52553ef246277b8a9cac0c71dcbb57db0744d63a3bde2a19a13f83be359f0e561c60113d993f4fc10d3ad2d64f9bf38
|
7
|
+
data.tar.gz: 081218358ed1a0ecb744bad2953e67d83515ee8895ae01d2c363d6b68a6e4ac6cf96c5f16efe624608ee4c9e5a2cacf0d7df1a2bbef4f5a99baa238a1db29aa1
|
data/lib/cloud/vcloud/cloud.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'securerandom'
|
2
2
|
require 'logger'
|
3
|
+
require 'common/common'
|
3
4
|
|
4
5
|
require_relative 'errors'
|
5
6
|
require_relative 'vcd_client'
|
@@ -22,8 +23,7 @@ module VCloudCloud
|
|
22
23
|
@entities = @vcd['entities']
|
23
24
|
raise ArgumentError, 'Invalid entities in VCD settings' unless @entities && @entities.is_a?(Hash)
|
24
25
|
|
25
|
-
@
|
26
|
-
@vapp_lock = Mutex.new # lock for recompose vApp and delete vm from vApp
|
26
|
+
@client = VCloudClient.new(@vcd, @logger)
|
27
27
|
end
|
28
28
|
|
29
29
|
def create_stemcell(image, _)
|
@@ -47,6 +47,8 @@ module VCloudCloud
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
def cpi_call_wait_time; 2; end
|
51
|
+
|
50
52
|
def create_vm(agent_id, catalog_vapp_id, resource_pool, networks, disk_locality = nil, environment = nil)
|
51
53
|
(steps "create_vm(#{agent_id}, #{catalog_vapp_id}, #{resource_pool}, ...)" do |s|
|
52
54
|
# disk_locality should be an array of disk ids
|
@@ -61,6 +63,7 @@ module VCloudCloud
|
|
61
63
|
storage_profiles = client.vdc.storage_profiles || []
|
62
64
|
storage_profile = storage_profiles.find { |sp| sp['name'] == @entities['vapp_storage_profile'] }
|
63
65
|
|
66
|
+
|
64
67
|
s.next Steps::Instantiate, catalog_vapp_id, vapp_name, description, disk_locality, storage_profile
|
65
68
|
client.flush_cache # flush cached vdc which contains vapp list
|
66
69
|
vapp = s.state[:vapp]
|
@@ -76,45 +79,59 @@ module VCloudCloud
|
|
76
79
|
# if the target vApp exists, creates a temp vApp, and then recomposes its VM to the target vApp.
|
77
80
|
if requested_name
|
78
81
|
container_vapp = nil
|
79
|
-
vm_href = nil
|
80
|
-
existing_vm_hrefs = []
|
81
82
|
|
82
|
-
|
83
|
-
|
83
|
+
errors = [RuntimeError]
|
84
|
+
Bosh::Common.retryable(sleep: cpi_call_wait_time, tries: 10, on: errors) do
|
84
85
|
begin
|
85
|
-
@logger.debug "Requesting container vApp: #{requested_name}"
|
86
|
-
container_vapp = client.vapp_by_name requested_name
|
87
|
-
rescue ObjectNotFoundError
|
88
|
-
# ignored, keep container_vapp nil
|
89
|
-
@logger.debug "Invalid container vApp: #{requested_name}"
|
90
|
-
end
|
91
|
-
|
92
|
-
if container_vapp
|
93
|
-
existing_vm_hrefs = container_vapp.vms.map { |v| v.href }
|
94
|
-
s.next Steps::Recompose, container_vapp.name, container_vapp, vm
|
95
|
-
client.flush_cache
|
96
|
-
vapp = client.reload vapp
|
97
|
-
client.wait_entity vapp
|
98
86
|
begin
|
99
|
-
|
100
|
-
|
101
|
-
|
87
|
+
@logger.debug "Requesting container vApp: #{requested_name}"
|
88
|
+
container_vapp = client.vapp_by_name requested_name
|
89
|
+
rescue ObjectNotFoundError
|
90
|
+
# ignored, keep container_vapp nil
|
91
|
+
@logger.debug "Invalid container vApp: #{requested_name}"
|
102
92
|
end
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
93
|
+
|
94
|
+
if container_vapp
|
95
|
+
@logger.debug "Enter recompose, container_vapp: #{container_vapp.name}"
|
96
|
+
begin
|
97
|
+
s.next Steps::Recompose, container_vapp.name, container_vapp, vm
|
98
|
+
rescue VCloudCloud::ObjectExistsError => e
|
99
|
+
@logger.debug "VM already exists, skip the error"
|
100
|
+
end
|
101
|
+
else
|
102
|
+
# just rename the vApp
|
103
|
+
container_vapp = vapp
|
104
|
+
s.next Steps::Recompose, requested_name, container_vapp
|
105
|
+
end
|
106
|
+
rescue Exception => e
|
107
|
+
@logger.warn "Caught an exception during create_vm Exception #{e}, Type #{e.class} Message #{e.message}"
|
108
|
+
@logger.warn "Exception trace #{e.backtrace.join('\n')}"
|
109
|
+
raise "re raising exception #{e.message} in create_vm"
|
107
110
|
end
|
111
|
+
end
|
108
112
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
113
|
+
# delete tmp vapp only if the name is different from requested
|
114
|
+
client.flush_cache
|
115
|
+
vapp = client.reload vapp
|
116
|
+
client.wait_entity vapp, true
|
117
|
+
if vapp.name != requested_name
|
118
|
+
begin
|
119
|
+
s.next Steps::Delete, vapp, true
|
120
|
+
rescue Exception => ex
|
121
|
+
@logger.warn "Caught exception when trying to delete tmp vapp #{vapp.name}: #{ex.to_s}"
|
122
|
+
end
|
114
123
|
end
|
115
124
|
|
116
|
-
|
117
|
-
|
125
|
+
# Wait for Delete/Recompose step to finish, retry if fails
|
126
|
+
# reload all the stuff
|
127
|
+
client.flush_cache
|
128
|
+
vapp = client.reload container_vapp
|
129
|
+
client.wait_entity vapp, true
|
130
|
+
|
131
|
+
vms = vapp.vms.select { |v| v.name == vm.name }
|
132
|
+
|
133
|
+
raise "New virtual machine not found in recomposed vApp" if vms.empty?
|
134
|
+
s.state[:vm] = client.resolve_link vms[0].href
|
118
135
|
end
|
119
136
|
|
120
137
|
# create env and generate env ISO image
|
@@ -123,17 +140,22 @@ module VCloudCloud
|
|
123
140
|
|
124
141
|
# TODO refact this
|
125
142
|
if requested_name
|
126
|
-
|
127
|
-
|
128
|
-
|
143
|
+
errors = [RuntimeError]
|
144
|
+
Bosh::Common.retryable(sleep: cpi_call_wait_time, tries: 20, on: errors) do
|
145
|
+
begin
|
146
|
+
save_agent_env s
|
147
|
+
s.next Steps::PowerOn, :vm
|
148
|
+
rescue Exception => e
|
149
|
+
@logger.warn "Caught an exception during create_vm Exception #{e}, Type #{e.class} Message #{e.message}"
|
150
|
+
@logger.warn "Exception trace #{e.backtrace.join('\n')}"
|
151
|
+
raise "re raising exception #{e.message} in create_vm"
|
152
|
+
end
|
129
153
|
end
|
130
154
|
else
|
131
155
|
save_agent_env s
|
132
156
|
s.next Steps::PowerOn, :vm
|
133
157
|
end
|
134
158
|
|
135
|
-
# Update state to point to the correct vapp instead of the newly created temporary vapp for transition
|
136
|
-
# We do this as the final step to avoid problems such as rollback of Steps::Instantiate, which deletes state[:vapp]
|
137
159
|
s.state[:vapp] = vapp
|
138
160
|
s.state
|
139
161
|
end)[:vm].urn
|
@@ -143,21 +165,28 @@ module VCloudCloud
|
|
143
165
|
steps "reboot_vm(#{vm_id})" do |s|
|
144
166
|
vm = s.state[:vm] = client.resolve_entity(vm_id)
|
145
167
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
begin
|
154
|
-
s.next Steps::Reboot, :vm
|
155
|
-
rescue => ex
|
156
|
-
@logger.warn "Caught exception when trying to Reboot vm #{vm_id}: #{ex.to_s}"
|
157
|
-
@logger.debug 'Force a hard-reboot when failed to perform a soft-reboot'
|
158
|
-
s.next Steps::PowerOff, :vm, true
|
168
|
+
errors = [RuntimeError]
|
169
|
+
Bosh::Common.retryable(sleep: cpi_call_wait_time, tries: 20, on: errors) do
|
170
|
+
begin
|
171
|
+
if vm['status'] == VCloudSdk::Xml::RESOURCE_ENTITY_STATUS[:SUSPENDED].to_s
|
172
|
+
s.next Steps::DiscardSuspendedState, :vm
|
173
|
+
s.next Steps::PowerOn, :vm
|
174
|
+
elsif vm['status'] == VCloudSdk::Xml::RESOURCE_ENTITY_STATUS[:POWERED_OFF].to_s
|
159
175
|
s.next Steps::PowerOn, :vm
|
176
|
+
else
|
177
|
+
begin
|
178
|
+
s.next Steps::Reboot, :vm
|
179
|
+
rescue => ex
|
180
|
+
@logger.warn "Caught exception when trying to Reboot vm #{vm_id}: #{ex.to_s}"
|
181
|
+
@logger.debug 'Force a hard-reboot when failed to perform a soft-reboot'
|
182
|
+
s.next Steps::PowerOff, :vm, true
|
183
|
+
s.next Steps::PowerOn, :vm
|
184
|
+
end
|
160
185
|
end
|
186
|
+
rescue Exception => e
|
187
|
+
@logger.warn "Caught an exception during reboot_vm Exception #{e}, Type #{e.class} Message #{e.message}"
|
188
|
+
@logger.warn "Exception trace #{e.backtrace.join('\n')}"
|
189
|
+
raise "re raising exception #{e.message} in reboot_vm"
|
161
190
|
end
|
162
191
|
end
|
163
192
|
end
|
@@ -176,7 +205,9 @@ module VCloudCloud
|
|
176
205
|
steps "delete_vm(#{vm_id})" do |s|
|
177
206
|
vm = s.state[:vm] = client.resolve_entity vm_id
|
178
207
|
|
179
|
-
|
208
|
+
errors = [RuntimeError]
|
209
|
+
Bosh::Common.retryable(sleep: cpi_call_wait_time, tries: 20, on: errors) do
|
210
|
+
begin
|
180
211
|
# poweroff vm before we are able to delete it
|
181
212
|
s.next Steps::PowerOff, :vm, true
|
182
213
|
|
@@ -191,6 +222,11 @@ module VCloudCloud
|
|
191
222
|
s.next Steps::Undeploy, :vm
|
192
223
|
s.next Steps::Delete, s.state[:vm], true
|
193
224
|
end
|
225
|
+
rescue Exception => e
|
226
|
+
@logger.warn "Caught an exception during delete_vm Exception #{e}, Type #{e.class} Message #{e.message}"
|
227
|
+
@logger.warn "Exception trace #{e.backtrace.join('\n')}"
|
228
|
+
raise "re raising exception #{e.message} in delete_vm"
|
229
|
+
end
|
194
230
|
end
|
195
231
|
|
196
232
|
s.next Steps::DeleteCatalogMedia, vm.name
|
@@ -220,17 +256,24 @@ module VCloudCloud
|
|
220
256
|
|
221
257
|
s.state[:disk] = client.resolve_entity disk_id
|
222
258
|
|
223
|
-
|
224
|
-
|
259
|
+
errors = [RuntimeError]
|
260
|
+
Bosh::Common.retryable(sleep: cpi_call_wait_time, tries: 20, on: errors) do
|
261
|
+
begin
|
262
|
+
s.next Steps::AttachDetachDisk, :attach
|
225
263
|
|
226
|
-
|
227
|
-
|
228
|
-
|
264
|
+
# update environment
|
265
|
+
s.state[:env_metadata_key] = @entities['vm_metadata_key']
|
266
|
+
s.next Steps::LoadAgentEnv
|
229
267
|
|
230
|
-
|
231
|
-
|
268
|
+
vm = s.state[:vm] = client.reload vm
|
269
|
+
Steps::CreateOrUpdateAgentEnv.update_persistent_disk s.state[:env], vm, disk_id , previous_disks_list
|
232
270
|
|
233
|
-
|
271
|
+
save_agent_env s
|
272
|
+
rescue Exception => e
|
273
|
+
@logger.warn "Caught an exception during attach_disk Exception #{e}, Type #{e.class} Message #{e.message}"
|
274
|
+
@logger.warn "Exception trace #{e.backtrace.join('\n')}"
|
275
|
+
raise "re raising exception #{e.message} in attach_disk"
|
276
|
+
end
|
234
277
|
end
|
235
278
|
end
|
236
279
|
end
|
@@ -242,21 +285,28 @@ module VCloudCloud
|
|
242
285
|
# if disk is not attached, just ignore
|
243
286
|
next unless vm.find_attached_disk s.state[:disk]
|
244
287
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
env[
|
257
|
-
|
288
|
+
errors = [RuntimeError]
|
289
|
+
Bosh::Common.retryable(sleep: cpi_call_wait_time, tries: 20, on: errors) do
|
290
|
+
begin
|
291
|
+
if vm['status'] == VCloudSdk::Xml::RESOURCE_ENTITY_STATUS[:SUSPENDED].to_s
|
292
|
+
s.next Steps::DiscardSuspendedState, :vm
|
293
|
+
end
|
294
|
+
s.next Steps::AttachDetachDisk, :detach
|
295
|
+
|
296
|
+
# update environment
|
297
|
+
s.state[:env_metadata_key] = @entities['vm_metadata_key']
|
298
|
+
s.next Steps::LoadAgentEnv
|
299
|
+
env = s.state[:env]
|
300
|
+
if env['disks'] && env['disks']['persistent'].is_a?(Hash)
|
301
|
+
env['disks']['persistent'].delete disk_id
|
302
|
+
end
|
258
303
|
|
259
|
-
|
304
|
+
save_agent_env s
|
305
|
+
rescue Exception => e
|
306
|
+
@logger.warn "Caught an exception during detach_disk Exception #{e}, Type #{e.class} Message #{e.message}"
|
307
|
+
@logger.warn "Exception trace #{e.backtrace.join('\n')}"
|
308
|
+
raise "re raising exception #{e.message} in detach_disk"
|
309
|
+
end
|
260
310
|
end
|
261
311
|
end
|
262
312
|
end
|
@@ -276,9 +326,6 @@ module VCloudCloud
|
|
276
326
|
end
|
277
327
|
|
278
328
|
def client
|
279
|
-
@client_lock.synchronize do
|
280
|
-
@client = VCloudClient.new(@vcd, @logger) if @client.nil?
|
281
|
-
end
|
282
329
|
@client
|
283
330
|
end
|
284
331
|
|
@@ -95,8 +95,13 @@ module VCloudCloud
|
|
95
95
|
end
|
96
96
|
|
97
97
|
def vapp_by_name(name)
|
98
|
-
|
98
|
+
# @logger.debug "VAPP_BY_NAME - org.vdc_link: #{org.vdc_link}"
|
99
|
+
vdc_link = org.vdc_link vdc_name
|
100
|
+
raise ObjectNotFoundError, "Invalid virtual datacenter name: #{vdc_name}" unless vdc_link
|
101
|
+
vdc_obj = resolve_link vdc_link
|
102
|
+
node = vdc_obj.get_vapp name
|
99
103
|
raise ObjectNotFoundError, "vApp #{name} does not exist" unless node
|
104
|
+
@logger.debug "VAPP_BY_NAME - get a vapp name"
|
100
105
|
resolve_link node.href
|
101
106
|
end
|
102
107
|
|
@@ -119,7 +124,7 @@ module VCloudCloud
|
|
119
124
|
session
|
120
125
|
|
121
126
|
response = send_request method, path, options
|
122
|
-
(options[:no_wrap] || response.code == 204) ?
|
127
|
+
(options[:no_wrap] || response.code == 204) ? response : wrap_response(response)
|
123
128
|
end
|
124
129
|
|
125
130
|
def upload_stream(url, size, stream, options = {})
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh_vcloud_cpi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- VMware
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bosh_common
|
@@ -124,7 +124,7 @@ dependencies:
|
|
124
124
|
version: '0'
|
125
125
|
description: |-
|
126
126
|
BOSH vCloud CPI
|
127
|
-
|
127
|
+
99eceb
|
128
128
|
email: support@cloudfoundry.com
|
129
129
|
executables: []
|
130
130
|
extensions: []
|