fog-vcloud-director 0.1.10 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rubocop.yml +4 -240
- data/.rubocop_local.yml +1 -0
- data/.travis.yml +5 -10
- data/README.md +3 -0
- data/docs/examples-vm-reconfigure.md +39 -0
- data/docs/vm-to-reconfigure.xml +373 -0
- data/fog-vcloud-director.gemspec +4 -1
- data/lib/fog/vcloud_director.rb +14 -1
- data/lib/fog/vcloud_director/compute.rb +34 -8
- data/lib/fog/vcloud_director/core.rb +0 -3
- data/lib/fog/vcloud_director/generators/compute/org_vdc_network.rb +1 -1
- data/lib/fog/vcloud_director/generators/compute/reconfigure_vm.rb +110 -0
- data/lib/fog/vcloud_director/generators/compute/vapp.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/catalog.rb +0 -2
- data/lib/fog/vcloud_director/models/compute/catalog_item.rb +0 -2
- data/lib/fog/vcloud_director/models/compute/catalog_items.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/catalogs.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/custom_field.rb +0 -2
- data/lib/fog/vcloud_director/models/compute/disk.rb +1 -2
- data/lib/fog/vcloud_director/models/compute/disks.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/media.rb +0 -2
- data/lib/fog/vcloud_director/models/compute/medias.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/network.rb +0 -2
- data/lib/fog/vcloud_director/models/compute/networks.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/organization.rb +0 -2
- data/lib/fog/vcloud_director/models/compute/organizations.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/tag.rb +1 -2
- data/lib/fog/vcloud_director/models/compute/tags.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/task.rb +0 -2
- data/lib/fog/vcloud_director/models/compute/tasks.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/template_vm.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/template_vms.rb +2 -3
- data/lib/fog/vcloud_director/models/compute/vapp.rb +25 -8
- data/lib/fog/vcloud_director/models/compute/vapp_template.rb +0 -2
- data/lib/fog/vcloud_director/models/compute/vapp_templates.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/vapps.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/vdc.rb +0 -2
- data/lib/fog/vcloud_director/models/compute/vdcs.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/vm.rb +10 -30
- data/lib/fog/vcloud_director/models/compute/vm_customization.rb +0 -2
- data/lib/fog/vcloud_director/models/compute/vm_customizations.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/vm_network.rb +0 -2
- data/lib/fog/vcloud_director/models/compute/vm_networks.rb +0 -1
- data/lib/fog/vcloud_director/models/compute/vms.rb +1 -2
- data/lib/fog/vcloud_director/parsers/compute/vapp.rb +93 -0
- data/lib/fog/vcloud_director/parsers/compute/vm.rb +3 -62
- data/lib/fog/vcloud_director/parsers/compute/vm_parser_helper.rb +47 -0
- data/lib/fog/vcloud_director/parsers/compute/vms.rb +2 -23
- data/lib/fog/vcloud_director/query.rb +0 -1
- data/lib/fog/vcloud_director/requests/compute/delete_vapp.rb +1 -1
- data/lib/fog/vcloud_director/requests/compute/get_lease_settings_section_vapp.rb +1 -1
- data/lib/fog/vcloud_director/requests/compute/get_template_vm.rb +1 -47
- data/lib/fog/vcloud_director/requests/compute/get_template_vms.rb +0 -13
- data/lib/fog/vcloud_director/requests/compute/get_vapp.rb +4 -3
- data/lib/fog/vcloud_director/requests/compute/get_vapp_metadata.rb +1 -1
- data/lib/fog/vcloud_director/requests/compute/get_vapp_owner.rb +1 -1
- data/lib/fog/vcloud_director/requests/compute/get_vm.rb +0 -46
- data/lib/fog/vcloud_director/requests/compute/instantiate_vapp_template.rb +1 -1
- data/lib/fog/vcloud_director/requests/compute/post_power_on_vapp.rb +2 -2
- data/lib/fog/vcloud_director/requests/compute/post_reconfigure_vm.rb +4 -84
- data/lib/fog/vcloud_director/requests/compute/post_update_vapp_metadata.rb +1 -1
- data/lib/fog/vcloud_director/requests/compute/put_cpu.rb +1 -1
- data/lib/fog/vcloud_director/requests/compute/put_memory.rb +1 -1
- data/lib/fog/vcloud_director/requests/compute/put_metadata_value.rb +1 -1
- data/lib/fog/vcloud_director/requests/compute/put_network_connection_system_section_vapp.rb +1 -1
- data/lib/fog/vcloud_director/requests/compute/put_vm.rb +1 -1
- data/lib/fog/vcloud_director/version.rb +1 -1
- data/spec/common_assertions.rb +42 -0
- data/spec/fixtures/vm.xml +419 -0
- data/spec/secrets.yaml.templ +3 -0
- data/spec/spec_helper.rb +5 -5
- data/spec/vcloud_director/generators/compute/compose_common_spec.rb +1 -6
- data/spec/vcloud_director/generators/compute/compose_vapp_spec.rb +67 -0
- data/spec/vcloud_director/generators/compute/create_snapshot_spec.rb +4 -0
- data/spec/vcloud_director/generators/compute/customization_spec.rb +4 -0
- data/spec/vcloud_director/generators/compute/disks_spec.rb +4 -0
- data/spec/vcloud_director/generators/compute/edge_gateway_service_configuration_spec.rb +4 -0
- data/spec/vcloud_director/generators/compute/instantiate_vapp_template_params_spec.rb +1 -4
- data/spec/vcloud_director/generators/compute/metadata_spec.rb +4 -0
- data/spec/vcloud_director/generators/compute/org_vdc_network_spec.rb +4 -0
- data/spec/vcloud_director/generators/compute/recompose_vapp_spec.rb +4 -0
- data/spec/vcloud_director/generators/compute/reconfigure_vm_spec.rb +117 -0
- data/spec/vcloud_director/generators/compute/vapp_spec.rb +4 -0
- data/spec/vcloud_director/generators/compute/vm_network_spec.rb +4 -0
- data/spec/vcloud_director/generators/compute/vm_spec.rb +4 -0
- data/spec/vcloud_director/models/compute/basic_spec.rb +44 -0
- data/spec/vcloud_director/models/compute/vapps_spec.rb +104 -0
- data/spec/vcloud_director/models/compute/vms_spec.rb +54 -0
- data/spec/vcloud_director/parsers/compute/disks_spec.rb +4 -0
- data/spec/vcloud_director/parsers/compute/metadata_spec.rb +4 -0
- data/spec/vcloud_director/parsers/compute/network_spec.rb +4 -0
- data/spec/vcloud_director/parsers/compute/vm_customization_spec.rb +4 -0
- data/spec/vcloud_director/parsers/compute/vm_network_spec.rb +4 -0
- data/spec/vcloud_director/parsers/compute/vm_parser_helper_spec.rb +4 -0
- data/spec/vcloud_director/parsers/compute/vm_spec.rb +4 -0
- data/spec/vcloud_director/parsers/compute/vms_by_metadata_spec.rb +4 -0
- data/spec/vcloud_director/parsers/compute/vms_spec.rb +4 -0
- data/spec/vcloud_director/requests/compute/basic_spec.rb +212 -0
- data/spec/vcloud_director/requests/compute/get_vapp_spec.rb +11 -0
- data/spec/vcloud_director/requests/compute/get_vdc_spec.rb +10 -0
- data/spec/vcloud_director/requests/compute/instantiate_vapp_template_spec.rb +1 -3
- data/spec/vcloud_director/requests/compute/post_reconfigure_vm_spec.rb +26 -0
- data/spec/vcr_cassettes/authentication.yml +48 -0
- data/spec/vcr_cassettes/get_vapp.yml +937 -0
- data/spec/vcr_cassettes/get_vapps-expired.yml +918 -0
- data/spec/vcr_cassettes/get_vapps-novms.yml +215 -0
- data/spec/vcr_cassettes/get_vapps.yml +118 -0
- data/spec/vcr_cassettes/get_vdc.yml +118 -0
- data/spec/vcr_cassettes/get_vm.yml +398 -0
- data/spec/vcr_cassettes/post_reconfigure_vm-virtual_hardware.yml +445 -0
- data/spec/vcr_spec_helper.rb +34 -0
- data/tasks/test.rake +3 -10
- metadata +129 -5
- data/lib/fog/vcloud_director/requests/compute/get_vms.rb +0 -41
- data/spec/vcloud_director/spec_helper.rb +0 -13
data/fog-vcloud-director.gemspec
CHANGED
@@ -26,6 +26,9 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency "rake"
|
27
27
|
spec.add_development_dependency "shindo"
|
28
28
|
spec.add_development_dependency "minitest"
|
29
|
+
spec.add_development_dependency "mocha"
|
29
30
|
spec.add_development_dependency "vcr"
|
30
|
-
spec.add_development_dependency "
|
31
|
+
spec.add_development_dependency "webmock"
|
32
|
+
spec.add_development_dependency "rubocop", "~>0.52.1"
|
33
|
+
spec.add_development_dependency "pronto-rubocop"
|
31
34
|
end
|
data/lib/fog/vcloud_director.rb
CHANGED
@@ -1,2 +1,15 @@
|
|
1
|
-
require '
|
1
|
+
require 'pp'
|
2
2
|
require 'securerandom'
|
3
|
+
|
4
|
+
require 'fog/core'
|
5
|
+
require 'fog/core/model'
|
6
|
+
require 'fog/core/collection'
|
7
|
+
require 'fog/xml'
|
8
|
+
require 'fog/vcloud_director/core'
|
9
|
+
require 'fog/vcloud_director/query'
|
10
|
+
require 'fog/vcloud_director/compute'
|
11
|
+
|
12
|
+
Dir[File.join(File.dirname(__FILE__), 'vcloud_director', 'generators', '**', '*.rb')].each {|file| require file }
|
13
|
+
Dir[File.join(File.dirname(__FILE__), 'vcloud_director', 'models', '**', '*.rb')].each {|file| require file }
|
14
|
+
Dir[File.join(File.dirname(__FILE__), 'vcloud_director', 'parsers', '**', '*.rb')].each {|file| require file }
|
15
|
+
Dir[File.join(File.dirname(__FILE__), 'vcloud_director', 'requests', '**', '*.rb')].each {|file| require file }
|
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'fog/vcloud_director/core'
|
2
|
-
require 'fog/vcloud_director/query'
|
3
|
-
|
4
1
|
class VcloudDirectorParser < Fog::Parsers::Base
|
5
2
|
def extract_attributes(attributes_xml)
|
6
3
|
attributes = {}
|
@@ -44,6 +41,8 @@ module Fog
|
|
44
41
|
class DuplicateName < Fog::VcloudDirector::Errors::DuplicateName; end
|
45
42
|
class TaskError < Fog::VcloudDirector::Errors::TaskError; end
|
46
43
|
|
44
|
+
class PreProcessingError < Fog::Errors::Error; end
|
45
|
+
|
47
46
|
requires :vcloud_director_username, :vcloud_director_password, :vcloud_director_host
|
48
47
|
recognizes :vcloud_director_api_version, :vcloud_director_show_progress, :path, :vcloud_token, :port
|
49
48
|
|
@@ -196,7 +195,6 @@ module Fog
|
|
196
195
|
request :get_vm_disks
|
197
196
|
request :get_vm_network
|
198
197
|
request :get_vm_pending_question
|
199
|
-
request :get_vms
|
200
198
|
request :get_vms_by_metadata
|
201
199
|
request :get_vms_disk_attached_to
|
202
200
|
request :get_vms_in_lease_from_query
|
@@ -322,19 +320,33 @@ module Fog
|
|
322
320
|
end
|
323
321
|
|
324
322
|
def get_by_name(item_name)
|
325
|
-
item_found =
|
323
|
+
item_found = _item_list.find { |item| item[:name] == item_name }
|
326
324
|
return nil unless item_found
|
327
325
|
get(item_found[:id])
|
328
326
|
end
|
329
327
|
|
330
328
|
def index
|
331
|
-
load(
|
329
|
+
load(_item_list)
|
332
330
|
end
|
333
331
|
|
334
332
|
def get_everyone
|
335
|
-
items =
|
333
|
+
items = _item_list.map { |item| get_by_id(item[:id]) }
|
336
334
|
load(items)
|
337
335
|
end
|
336
|
+
|
337
|
+
# Use pre-fetched list of items. Particularly useful when parent's XML already contains enough information
|
338
|
+
# about child entities, hence we can parse them on parent already to reduce API requests. Some examples:
|
339
|
+
# - vApp XML contains all the information about each of its child VMs, so we can pre-fetch `vapp.vms`
|
340
|
+
# - VM XML contains all the information about customization, so we can pre-fecth `vm.guest_customization`
|
341
|
+
# - VM XML contains all the information about disks, so we can pre-fetch `vm.disks`
|
342
|
+
def with_item_list(hashes)
|
343
|
+
@items = Array(hashes)
|
344
|
+
self
|
345
|
+
end
|
346
|
+
|
347
|
+
def _item_list
|
348
|
+
@items || item_list || []
|
349
|
+
end
|
338
350
|
end
|
339
351
|
|
340
352
|
class Real
|
@@ -394,9 +406,23 @@ module Fog
|
|
394
406
|
response.body[:href].split('/').last # returns the vapp_id if it was instantiated successfully.
|
395
407
|
end
|
396
408
|
|
409
|
+
# Perform HTTP request against vCloud API.
|
410
|
+
#
|
411
|
+
# @param [Hash] params request parameters.
|
412
|
+
# - params[:parser] SAX parser class, SAX parser instance or string. String can be one of:
|
413
|
+
# - 'plaintext': returns unparsed text in response.body
|
414
|
+
# - 'xml': returns Nokogiri::XML instance in response.body
|
415
|
+
# @return [Excon::Response]
|
397
416
|
def request(params)
|
398
417
|
begin
|
399
|
-
|
418
|
+
parser_type = params[:parser]
|
419
|
+
params[:parser] = nil if parser_type.instance_of?(String)
|
420
|
+
params[:parser] = parser_type.new if parser_type.respond_to?(:new)
|
421
|
+
|
422
|
+
resp = do_request(params)
|
423
|
+
|
424
|
+
resp.body = Nokogiri::XML(resp.body) if parser_type == 'xml'
|
425
|
+
resp
|
400
426
|
rescue EOFError
|
401
427
|
# This error can occur if Vcloud receives a request from a network
|
402
428
|
# it deems to be unauthorized; no HTTP response is sent, but the
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'fog/vcloud_director/generators/compute/compose_common'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Generators
|
5
|
+
module Compute
|
6
|
+
module VcloudDirector
|
7
|
+
class ReconfigureVm
|
8
|
+
extend ComposeCommon
|
9
|
+
|
10
|
+
class << self
|
11
|
+
# Generates VM reconfiguration XML.
|
12
|
+
#
|
13
|
+
# @param [Nokogiri::Xml] current DOM representing current VM configuration.
|
14
|
+
# @param [Hash] options desired configuration. Please see examples-vm-reconfigure.md for details.
|
15
|
+
#
|
16
|
+
# @return [String] xml string, a modification of `current` input, with desired configurations applied.
|
17
|
+
def generate_xml(current, options)
|
18
|
+
current.root['name'] = options[:name] if options[:name]
|
19
|
+
current.at('Description').content = options[:description] if options[:description]
|
20
|
+
if options[:hardware]
|
21
|
+
update_virtual_hardware_section(current, options[:hardware])
|
22
|
+
else
|
23
|
+
# Remove entire VirtualHardwareSection if no hardware is modified.
|
24
|
+
# https://pubs.vmware.com/vcd-80/index.jsp#com.vmware.vcloud.api.sp.doc_90/GUID-4759B018-86C2-4C91-8176-3EC73CD7122B.html
|
25
|
+
current.at('//ovf:VirtualHardwareSection').remove
|
26
|
+
end
|
27
|
+
current.to_xml
|
28
|
+
end
|
29
|
+
|
30
|
+
# Apply desired hardware modifications to the original xml.
|
31
|
+
def update_virtual_hardware_section(xml, hardware)
|
32
|
+
update_virtual_hardware_section_item_mem(xml, **hardware[:memory]) if hardware[:memory]
|
33
|
+
update_virtual_hardware_section_item_cpu(xml, **hardware[:cpu]) if hardware[:cpu]
|
34
|
+
array_wrap(hardware[:disk]).reject { |d| d[:id].nil? || d[:capacity_mb] == -1 }.each { |disk| update_virtual_hardware_section_item_hdd(xml, **disk) }
|
35
|
+
array_wrap(hardware[:disk]).select { |d| d[:id].nil? }.each { |disk| add_virtual_hardware_section_item_hdd(xml, **disk) }
|
36
|
+
array_wrap(hardware[:disk]).select { |d| d[:capacity_mb] == -1 }.each { |disk| remove_virtual_hardware_section_item_hdd(xml, id: disk[:id]) }
|
37
|
+
end
|
38
|
+
|
39
|
+
def update_virtual_hardware_section_item_cpu(xml, num_cores: nil, cores_per_socket: nil, reservation: nil, limit: nil, weight: nil)
|
40
|
+
update_virtual_hardware_section_item(xml, :type => 3) do |item|
|
41
|
+
item.at('./rasd:VirtualQuantity').content = num_cores if num_cores
|
42
|
+
item.at('./rasd:Reservation').content = reservation if reservation
|
43
|
+
item.at('./rasd:Limit').content = limit if limit
|
44
|
+
item.at('./rasd:Weight').content = weight if weight
|
45
|
+
item.at('./vmw:CoresPerSocket').content = cores_per_socket if cores_per_socket
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def update_virtual_hardware_section_item_mem(xml, quantity_mb: nil, reservation: nil, limit: nil, weight: nil)
|
50
|
+
update_virtual_hardware_section_item(xml, :type => 4) do |item|
|
51
|
+
item.at('./rasd:VirtualQuantity').content = quantity_mb if quantity_mb
|
52
|
+
item.at('./rasd:Reservation').content = reservation if reservation
|
53
|
+
item.at('./rasd:Limit').content = limit if limit
|
54
|
+
item.at('./rasd:Weight').content = weight if weight
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def update_virtual_hardware_section_item_hdd(xml, id:, capacity_mb: nil, address: nil, type: nil, subtype: nil)
|
59
|
+
hdd_exists = update_virtual_hardware_section_item(xml, :type => 17, :id => id) do |item|
|
60
|
+
item.at('./rasd:AddressOnParent').content = address if address
|
61
|
+
item.at('./rasd:HostResource')['ns13:capacity'] = capacity_mb if capacity_mb
|
62
|
+
item.at('./rasd:HostResource')['ns13:busType'] = type if type
|
63
|
+
item.at('./rasd:HostResource')['ns13:busSubType'] = subtype if subtype
|
64
|
+
end
|
65
|
+
raise Fog::Compute::VcloudDirector::PreProcessingError.new("Error resizing disk: disk with id '#{id}' does not exist.") unless hdd_exists
|
66
|
+
end
|
67
|
+
|
68
|
+
def remove_virtual_hardware_section_item_hdd(xml, id:)
|
69
|
+
remove_virtual_hardware_section_item(xml, :type => 17, :id => id)
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_virtual_hardware_section_item_hdd(xml, **disk)
|
73
|
+
disk[:id] = rand(10_000..100_000)
|
74
|
+
add_virtual_hardware_section_item(xml) do |section|
|
75
|
+
virtual_hardware_section_item_hdd(section, **disk)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def add_virtual_hardware_section_item(xml)
|
80
|
+
virtual_hardware = xml.at('//ovf:VirtualHardwareSection')
|
81
|
+
virtual_hardware.add_namespace_definition('vcloud', 'http://www.vmware.com/vcloud/v1.5')
|
82
|
+
Nokogiri::XML::Builder.with(virtual_hardware) do |section|
|
83
|
+
yield section
|
84
|
+
end
|
85
|
+
# Move the new item to satisfy vCloud's sorting requirements.
|
86
|
+
item = virtual_hardware.at('./ovf:Item[last()]').remove
|
87
|
+
virtual_hardware.at('./ovf:Item[last()]').after(item)
|
88
|
+
end
|
89
|
+
|
90
|
+
def update_virtual_hardware_section_item(xml, type:, id: nil)
|
91
|
+
condition = "rasd:ResourceType = '#{type}'"
|
92
|
+
condition += " and rasd:InstanceID = '#{id}'" if id
|
93
|
+
if (item = xml.at("//ovf:VirtualHardwareSection/ovf:Item[#{condition}]"))
|
94
|
+
yield item
|
95
|
+
true
|
96
|
+
else
|
97
|
+
false
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def remove_virtual_hardware_section_item(xml, type:, id:)
|
102
|
+
item = xml.at("//ovf:VirtualHardwareSection/ovf:Item[rasd:ResourceType = '#{type}' and rasd:InstanceID = '#{id}']")
|
103
|
+
item.remove if item
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'fog/core/model'
|
2
|
-
|
3
1
|
module Fog
|
4
2
|
module Compute
|
5
3
|
class VcloudDirector
|
@@ -17,6 +15,7 @@ module Fog
|
|
17
15
|
attribute :bus_sub_type
|
18
16
|
attribute :bus_type
|
19
17
|
|
18
|
+
remove_method :capacity=
|
20
19
|
# TODO Virtual machine disk sizes may only be increased, not decreased.
|
21
20
|
def capacity=(new_capacity)
|
22
21
|
has_changed = ( capacity != new_capacity.to_i )
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'fog/core/model'
|
2
|
-
|
3
1
|
module Fog
|
4
2
|
module Compute
|
5
3
|
class VcloudDirector
|
@@ -7,6 +5,7 @@ module Fog
|
|
7
5
|
identity :id
|
8
6
|
attribute :value
|
9
7
|
|
8
|
+
remove_method :value=
|
10
9
|
def value=(new_value)
|
11
10
|
has_changed = ( value != new_value )
|
12
11
|
not_first_set = !value.nil?
|
@@ -1,5 +1,4 @@
|
|
1
|
-
require 'fog/
|
2
|
-
require 'fog/vcloud_director/models/compute/vm'
|
1
|
+
require 'fog/vcloud_director/models/compute/template_vm'
|
3
2
|
|
4
3
|
module Fog
|
5
4
|
module Compute
|
@@ -13,7 +12,7 @@ module Fog
|
|
13
12
|
attribute :vapp_template
|
14
13
|
|
15
14
|
|
16
|
-
def
|
15
|
+
def get_single_template_vm(vm_id)
|
17
16
|
item = service.get_template_vm(vm_id).body
|
18
17
|
return nil unless item
|
19
18
|
new(item[:vm])
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'fog/core/model'
|
2
|
-
|
3
1
|
module Fog
|
4
2
|
module Compute
|
5
3
|
class VcloudDirector
|
@@ -12,13 +10,32 @@ module Fog
|
|
12
10
|
attribute :description, :aliases => :Description
|
13
11
|
attribute :deployed, :type => :boolean
|
14
12
|
attribute :status
|
15
|
-
attribute :lease_settings
|
16
|
-
attribute :network_section
|
17
|
-
attribute :network_config
|
18
|
-
attribute :owner
|
19
|
-
attribute :
|
13
|
+
attribute :lease_settings
|
14
|
+
attribute :network_section
|
15
|
+
attribute :network_config
|
16
|
+
attribute :owner
|
17
|
+
attribute :maintenance, :type => :boolean
|
18
|
+
|
19
|
+
def initialize(*args, **kwargs)
|
20
|
+
# Memorize VMs because their full XML description was already included in the vApp XML description.
|
21
|
+
# Instead simple Array we rather store as Collection in order to provide common interface e.g.
|
22
|
+
# vapp.vms.all
|
23
|
+
# vapp.vms.get_by_name
|
24
|
+
if (vms = kwargs.delete(:vms))
|
25
|
+
@vms = Fog::Compute::VcloudDirector::Vms.new(
|
26
|
+
:vapp => self,
|
27
|
+
:service => kwargs[:service]
|
28
|
+
).with_item_list(Array(vms))
|
29
|
+
end
|
30
|
+
|
31
|
+
super(*args, **kwargs)
|
32
|
+
end
|
33
|
+
|
34
|
+
def vms(force: false)
|
35
|
+
# Return memorized Collection that we parsed based on vApp XML description. This way we prevent
|
36
|
+
# additional API request to be made for each VM in a vApp.
|
37
|
+
return @vms unless @vms.nil? || force
|
20
38
|
|
21
|
-
def vms
|
22
39
|
requires :id
|
23
40
|
service.vms(:vapp => self)
|
24
41
|
end
|