ruby_vcloud_sdk 0.4.8 → 0.5.1
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 +7 -0
- data/README.md +296 -0
- data/lib/ruby_vcloud_sdk.rb +0 -4
- data/lib/ruby_vcloud_sdk/catalog.rb +377 -0
- data/lib/ruby_vcloud_sdk/catalog_item.rb +26 -0
- data/lib/ruby_vcloud_sdk/client.rb +25 -882
- data/lib/ruby_vcloud_sdk/config.rb +1 -7
- data/lib/ruby_vcloud_sdk/connection/connection.rb +114 -54
- data/lib/ruby_vcloud_sdk/cpu.rb +11 -0
- data/lib/ruby_vcloud_sdk/disk.rb +55 -0
- data/lib/ruby_vcloud_sdk/edge_gateway.rb +32 -0
- data/lib/ruby_vcloud_sdk/infrastructure.rb +135 -0
- data/lib/ruby_vcloud_sdk/ip_ranges.rb +95 -0
- data/lib/ruby_vcloud_sdk/memory.rb +11 -0
- data/lib/ruby_vcloud_sdk/network.rb +32 -0
- data/lib/ruby_vcloud_sdk/powerable.rb +78 -0
- data/lib/ruby_vcloud_sdk/resources.rb +13 -0
- data/lib/ruby_vcloud_sdk/session.rb +46 -0
- data/lib/ruby_vcloud_sdk/vapp.rb +122 -0
- data/lib/ruby_vcloud_sdk/vdc.rb +210 -0
- data/lib/ruby_vcloud_sdk/vdc_storage_profile.rb +23 -0
- data/lib/ruby_vcloud_sdk/version.rb +1 -1
- data/lib/ruby_vcloud_sdk/vm.rb +132 -0
- data/lib/ruby_vcloud_sdk/xml/constants.rb +6 -4
- data/lib/ruby_vcloud_sdk/xml/wrapper.rb +109 -30
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes.rb +45 -2
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/admin_catalog.rb +13 -4
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/allocated_ip_addresses.rb +9 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/catalog_item.rb +6 -14
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/disk.rb +24 -14
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/disk_attach_or_detach_params.rb +0 -2
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/disk_create_params.rb +1 -3
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/edge_gateway.rb +13 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/gateway_interface.rb +22 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/hard_disk_item_wrapper.rb +4 -4
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/ip_address.rb +10 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/ip_range.rb +13 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/ip_ranges.rb +9 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/ip_scope.rb +6 -32
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/item.rb +1 -7
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/link.rb +14 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/media.rb +4 -20
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/media_insert_or_eject_params.rb +1 -3
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/network_connection_section.rb +0 -4
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/nic_item_wrapper.rb +0 -2
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/org.rb +44 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/org_vdc_network.rb +11 -3
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/query_result_records.rb +14 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/recompose_vapp_params.rb +42 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/session.rb +5 -5
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/supported_versions.rb +19 -0
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/task.rb +1 -1
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/upload_vapp_template_params.rb +2 -4
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vapp.rb +13 -22
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vapp_template.rb +0 -2
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vcloud.rb +5 -3
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vdc.rb +72 -15
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/virtual_hardware_section.rb +8 -6
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vm.rb +29 -25
- data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vms.rb +12 -0
- data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminCatalog.xml +6 -1
- data/lib/ruby_vcloud_sdk/xml/xml_templates/RecomposeVAppParams.xml +16 -1
- metadata +116 -233
- data/README +0 -1
- data/Rakefile +0 -50
- data/lib/ruby_vcloud_sdk/util.rb +0 -21
- data/spec/assets/admin_org_response.xml +0 -75
- data/spec/assets/catalog_add_item_response.xml +0 -8
- data/spec/assets/catalog_add_vapp_request.xml +0 -5
- data/spec/assets/catalog_item_added_response.xml +0 -19
- data/spec/assets/catalog_response.xml +0 -19
- data/spec/assets/existing_media_busy_response.xml +0 -19
- data/spec/assets/existing_media_catalog_item.xml +0 -8
- data/spec/assets/existing_media_delete_task_done.xml +0 -6
- data/spec/assets/existing_media_done_response.xml +0 -11
- data/spec/assets/existing_vapp_resolver_response.xml +0 -3
- data/spec/assets/existing_vapp_template_catalog_resolver_response.xml +0 -3
- data/spec/assets/existing_vapp_template_instantiate_response.xml +0 -20
- data/spec/assets/existing_vapp_template_instantiate_task_error_response.xml +0 -7
- data/spec/assets/existing_vapp_template_instantiate_task_start_response.xml +0 -7
- data/spec/assets/existing_vapp_template_instantiate_task_success_response.xml +0 -7
- data/spec/assets/existing_vapp_template_item_response.xml +0 -8
- data/spec/assets/existing_vapp_template_ready_response.xml +0 -79
- data/spec/assets/finalize_upload_task_done_response.xml +0 -7
- data/spec/assets/finalize_upload_task_response.xml +0 -7
- data/spec/assets/indy_disk_attach_request.xml +0 -3
- data/spec/assets/indy_disk_attach_task.xml +0 -6
- data/spec/assets/indy_disk_attach_task_error.xml +0 -6
- data/spec/assets/indy_disk_create_error.xml +0 -1
- data/spec/assets/indy_disk_create_request.xml +0 -4
- data/spec/assets/indy_disk_create_response.xml +0 -19
- data/spec/assets/indy_disk_delete_task.xml +0 -6
- data/spec/assets/indy_disk_detach_request.xml +0 -3
- data/spec/assets/indy_disk_detach_task.xml +0 -6
- data/spec/assets/indy_disk_response.xml +0 -11
- data/spec/assets/instantiated_suspended_vapp_response.xml +0 -209
- data/spec/assets/instantiated_vapp_delelete_done_task.xml +0 -5
- data/spec/assets/instantiated_vapp_delelete_running_task.xml +0 -6
- data/spec/assets/instantiated_vapp_network_config_add_network_request.xml +0 -36
- data/spec/assets/instantiated_vapp_network_config_modify_network_task_success.xml +0 -6
- data/spec/assets/instantiated_vapp_network_config_remove_network_request.xml +0 -6
- data/spec/assets/instantiated_vapp_network_config_section_response.xml +0 -17
- data/spec/assets/instantiated_vapp_off_response.xml +0 -206
- data/spec/assets/instantiated_vapp_on_response.xml +0 -205
- data/spec/assets/instantiated_vapp_power_task_running.xml +0 -6
- data/spec/assets/instantiated_vapp_power_task_success.xml +0 -6
- data/spec/assets/instantiated_vapp_response.xml +0 -205
- data/spec/assets/instantiated_vm_change_task_running.xml +0 -6
- data/spec/assets/instantiated_vm_change_task_success.xml +0 -6
- data/spec/assets/instantiated_vm_cpu_response.xml +0 -11
- data/spec/assets/instantiated_vm_insert_media_task_done.xml +0 -6
- data/spec/assets/instantiated_vm_memory_response.xml +0 -11
- data/spec/assets/instantiated_vm_modify_task_running.xml +0 -6
- data/spec/assets/instantiated_vm_modify_task_success.xml +0 -5
- data/spec/assets/instantiated_vm_network_section_response.xml +0 -11
- data/spec/assets/instantiated_vm_response.xml +0 -149
- data/spec/assets/media_add_to_catalog_request.xml +0 -5
- data/spec/assets/media_add_to_catalog_response.xml +0 -8
- data/spec/assets/media_delete_task_done.xml +0 -6
- data/spec/assets/media_upload_pending_response.xml +0 -13
- data/spec/assets/media_upload_request.xml +0 -2
- data/spec/assets/metadata_set_request.xml +0 -3
- data/spec/assets/metadata_set_task_done.xml +0 -6
- data/spec/assets/org_network_response.xml +0 -22
- data/spec/assets/reconfigure_vm_request.xml +0 -133
- data/spec/assets/reconfigure_vm_task.xml +0 -8
- data/spec/assets/session.xml +0 -7
- data/spec/assets/test-config.yml +0 -38
- data/spec/assets/undeploy_params.xml +0 -1
- data/spec/assets/vapp_template_catalog_resolver_response.xml +0 -3
- data/spec/assets/vapp_template_delelete_done_task.xml +0 -5
- data/spec/assets/vapp_template_delelete_running_task.xml +0 -6
- data/spec/assets/vapp_template_instantiate_request.xml +0 -8
- data/spec/assets/vapp_template_instantiate_with_locality_request.xml +0 -14
- data/spec/assets/vapp_template_no_disk_response.xml +0 -27
- data/spec/assets/vapp_template_ready_response.xml +0 -79
- data/spec/assets/vapp_template_upload_complete.xml +0 -28
- data/spec/assets/vapp_template_upload_failed.xml +0 -28
- data/spec/assets/vapp_template_upload_request.xml +0 -4
- data/spec/assets/vapp_template_upload_response.xml +0 -25
- data/spec/assets/vcloud_response.xml +0 -56
- data/spec/assets/vdc_response.xml +0 -57
- data/spec/spec_helper.rb +0 -107
- data/spec/unit/client_response.rb +0 -700
- data/spec/unit/client_spec.rb +0 -1152
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module VCloudSdk
|
|
2
|
+
|
|
3
|
+
class VdcStorageProfile
|
|
4
|
+
attr_reader :name
|
|
5
|
+
|
|
6
|
+
def initialize(storage_profile_xml_obj)
|
|
7
|
+
@storage_profile_xml_obj = storage_profile_xml_obj
|
|
8
|
+
@name = @storage_profile_xml_obj[:name]
|
|
9
|
+
@storage_used_mb = @storage_profile_xml_obj[:storageUsedMB].to_i
|
|
10
|
+
@storage_limit_mb = @storage_profile_xml_obj[:storageLimitMB].to_i
|
|
11
|
+
@vdc_name = @storage_profile_xml_obj[:vdcName]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Return storageLimitMB - storageUsedMB
|
|
15
|
+
# Return -1 if 'storageLimitMB' is 0
|
|
16
|
+
def available_storage
|
|
17
|
+
return -1 if @storage_limit_mb == 0
|
|
18
|
+
|
|
19
|
+
@storage_limit_mb - @storage_used_mb
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
require "forwardable"
|
|
2
|
+
require_relative "infrastructure"
|
|
3
|
+
require_relative "powerable"
|
|
4
|
+
|
|
5
|
+
module VCloudSdk
|
|
6
|
+
class VM
|
|
7
|
+
include Infrastructure
|
|
8
|
+
include Powerable
|
|
9
|
+
|
|
10
|
+
extend Forwardable
|
|
11
|
+
def_delegator :entity_xml, :name
|
|
12
|
+
|
|
13
|
+
def initialize(session, link)
|
|
14
|
+
@session = session
|
|
15
|
+
@link = link
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def href
|
|
19
|
+
@link
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def independent_disks
|
|
23
|
+
hardware_section = entity_xml.hardware_section
|
|
24
|
+
disks = []
|
|
25
|
+
hardware_section.hard_disks.each do |disk|
|
|
26
|
+
disk_link = disk.host_resource.attribute("disk")
|
|
27
|
+
unless disk_link.nil?
|
|
28
|
+
disks << VCloudSdk::Disk.new(@session, disk_link.to_s)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
disks
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def list_disks
|
|
35
|
+
entity_xml.hardware_section.hard_disks.map do |disk|
|
|
36
|
+
disk_link = disk.host_resource.attribute("disk")
|
|
37
|
+
if disk_link.nil?
|
|
38
|
+
disk.element_name
|
|
39
|
+
else
|
|
40
|
+
"#{disk.element_name} (#{VCloudSdk::Disk.new(@session, disk_link.to_s).name})"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def attach_disk(disk)
|
|
46
|
+
fail CloudError,
|
|
47
|
+
"Disk '#{disk.name}' of link #{disk.href} is attached to VM '#{disk.vm.name}'" if disk.attached?
|
|
48
|
+
|
|
49
|
+
task = connection.post(entity_xml.attach_disk_link.href,
|
|
50
|
+
disk_attach_or_detach_params(disk),
|
|
51
|
+
Xml::MEDIA_TYPE[:DISK_ATTACH_DETACH_PARAMS])
|
|
52
|
+
task = monitor_task(task)
|
|
53
|
+
|
|
54
|
+
Config.logger.info "Disk '#{disk.name}' is attached to VM '#{name}'"
|
|
55
|
+
task
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def detach_disk(disk)
|
|
59
|
+
parent_vapp = vapp
|
|
60
|
+
if parent_vapp.status == "SUSPENDED"
|
|
61
|
+
fail VmSuspendedError,
|
|
62
|
+
"vApp #{parent_vapp.name} suspended, discard state before detaching disk."
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
unless (vm = disk.vm).href == href
|
|
66
|
+
fail CloudError,
|
|
67
|
+
"Disk '#{disk.name}' is attached to other VM - name: '#{vm.name}', link '#{vm.href}'"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
task = connection.post(entity_xml.detach_disk_link.href,
|
|
71
|
+
disk_attach_or_detach_params(disk),
|
|
72
|
+
Xml::MEDIA_TYPE[:DISK_ATTACH_DETACH_PARAMS])
|
|
73
|
+
task = monitor_task(task)
|
|
74
|
+
|
|
75
|
+
Config.logger.info "Disk '#{disk.name}' is detached from VM '#{name}'"
|
|
76
|
+
task
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def insert_media(catalog_name, media_file_name)
|
|
80
|
+
catalog = find_catalog_by_name(catalog_name)
|
|
81
|
+
media = catalog.find_item(media_file_name, Xml::MEDIA_TYPE[:MEDIA])
|
|
82
|
+
|
|
83
|
+
vm = entity_xml
|
|
84
|
+
media_xml = connection.get(media.href)
|
|
85
|
+
Config.logger.info("Inserting media #{media_xml.name} into VM #{vm.name}")
|
|
86
|
+
|
|
87
|
+
wait_for_running_tasks(media_xml, "Media '#{media_xml.name}'")
|
|
88
|
+
|
|
89
|
+
task = connection.post(vm.insert_media_link.href,
|
|
90
|
+
media_insert_or_eject_params(media),
|
|
91
|
+
Xml::MEDIA_TYPE[:MEDIA_INSERT_EJECT_PARAMS])
|
|
92
|
+
monitor_task(task)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def eject_media(catalog_name, media_file_name)
|
|
96
|
+
catalog = find_catalog_by_name(catalog_name)
|
|
97
|
+
media = catalog.find_item(media_file_name, Xml::MEDIA_TYPE[:MEDIA])
|
|
98
|
+
|
|
99
|
+
vm = entity_xml
|
|
100
|
+
media_xml = connection.get(media.href)
|
|
101
|
+
Config.logger.info("Ejecting media #{media_xml.name} from VM #{vm.name}")
|
|
102
|
+
|
|
103
|
+
wait_for_running_tasks(media_xml, "Media '#{media_xml.name}'")
|
|
104
|
+
|
|
105
|
+
task = connection.post(vm.eject_media_link.href,
|
|
106
|
+
media_insert_or_eject_params(media),
|
|
107
|
+
Xml::MEDIA_TYPE[:MEDIA_INSERT_EJECT_PARAMS])
|
|
108
|
+
monitor_task(task)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
private
|
|
112
|
+
|
|
113
|
+
def disk_attach_or_detach_params(disk)
|
|
114
|
+
Xml::WrapperFactory
|
|
115
|
+
.create_instance("DiskAttachOrDetachParams")
|
|
116
|
+
.tap do |params|
|
|
117
|
+
params.disk_href = disk.href
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def vapp
|
|
122
|
+
vapp_link = entity_xml.vapp_link
|
|
123
|
+
VCloudSdk::VApp.new(@session, vapp_link.href)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def media_insert_or_eject_params(media)
|
|
127
|
+
Xml::WrapperFactory.create_instance("MediaInsertOrEjectParams").tap do |params|
|
|
128
|
+
params.media_href = media.href
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -24,7 +24,8 @@ module VCloudSdk
|
|
|
24
24
|
:ADDRESS_ON_PARENT => "AddressOnParent",
|
|
25
25
|
:ADDRESS => "Address",
|
|
26
26
|
:CONNECTION => "Connection",
|
|
27
|
-
:PARENT => "Parent"
|
|
27
|
+
:PARENT => "Parent",
|
|
28
|
+
:ELEMENT_NAME => "ElementName",
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
RESOURCE_SUB_TYPE = {
|
|
@@ -174,7 +175,6 @@ module VCloudSdk
|
|
|
174
175
|
|
|
175
176
|
ADMIN_MEDIA_TYPE = {
|
|
176
177
|
:ADMIN_MEDIA_TYPE_PREFIX => "application/vnd.vmware.admin.",
|
|
177
|
-
:VCLOUD => "application/vnd.vmware.admin.vcloud+xml",
|
|
178
178
|
:PROVIDER_VDC => "application/vnd.vmware.admin.providervdc+xml",
|
|
179
179
|
:ADMIN_VDC => "application/vnd.vmware.admin.vdc+xml",
|
|
180
180
|
:VDC => "application/vnd.vmware.vcloud.vdc+xml",
|
|
@@ -185,14 +185,13 @@ module VCloudSdk
|
|
|
185
185
|
:SYSTEM_ADMIN_ORGANIZATION =>
|
|
186
186
|
"application/vnd.vmware.admin.systemOrganization+xml",
|
|
187
187
|
:ADMIN_ORGANIZATION => "application/vnd.vmware.admin.organization+xml",
|
|
188
|
-
:ORGANIZATION => "application/vnd.vmware.vcloud.org+xml",
|
|
189
188
|
:TASKS_LIST => "application/vnd.vmware.vcloud.tasksList+xml",
|
|
190
189
|
:USER => "application/vnd.vmware.admin.user+xml",
|
|
191
190
|
:GROUP => "application/vnd.vmware.admin.group+xml",
|
|
192
191
|
:ROLE => "application/vnd.vmware.admin.role+xml",
|
|
193
192
|
:RIGHT => "application/vnd.vmware.admin.right+xml",
|
|
194
193
|
:ADMIN_CATALOG => "application/vnd.vmware.admin.catalog+xml",
|
|
195
|
-
:CATALOG => "application/vnd.vmware.
|
|
194
|
+
:CATALOG => "application/vnd.vmware.admin.catalog+xml",
|
|
196
195
|
:ADMIN_CATALOG_ITEM => "application/vnd.vmware.admin.catalogItem+xml",
|
|
197
196
|
:CATALOG_ITEM => "application/vnd.vmware.vcloud.catalogItem+xml",
|
|
198
197
|
:ADMIN_NETWORK => "application/vnd.vmware.admin.network+xml",
|
|
@@ -215,6 +214,7 @@ module VCloudSdk
|
|
|
215
214
|
}
|
|
216
215
|
|
|
217
216
|
XML_TYPE = {
|
|
217
|
+
:ADD => "add",
|
|
218
218
|
:ADMINALLOCATEDEXTIPRECORD => "AdminAllocatedExtIpRecord",
|
|
219
219
|
:ADMINCATALOG => "AdminCatalog",
|
|
220
220
|
:ADMINCATALOGITEMRECORD => "AdminCatalogItemRecord",
|
|
@@ -265,6 +265,7 @@ module VCloudSdk
|
|
|
265
265
|
:DEPLOYVAPPPARAMS => "DeployVAppParams",
|
|
266
266
|
:DHCPSERVICE => "DhcpService",
|
|
267
267
|
:DVSWITCHRECORD => "DvSwitchRecord",
|
|
268
|
+
:EDIT => "edit",
|
|
268
269
|
:ENTITY => "Entity",
|
|
269
270
|
:ERROR => "Error",
|
|
270
271
|
:EVENTRECORD => "EventRecord",
|
|
@@ -341,6 +342,7 @@ module VCloudSdk
|
|
|
341
342
|
:REFERENCE => "Reference",
|
|
342
343
|
:REFERENCES => "References",
|
|
343
344
|
:RELOCATEPARAMS => "RelocateParams",
|
|
345
|
+
:REMOVE => "remove",
|
|
344
346
|
:RESOURCEENTITY => "ResourceEntity",
|
|
345
347
|
:RESOURCEPOOLRECORD => "ResourcePoolRecord",
|
|
346
348
|
:RIGHT => "Right",
|
|
@@ -2,7 +2,6 @@ require "nokogiri"
|
|
|
2
2
|
|
|
3
3
|
module VCloudSdk
|
|
4
4
|
module Xml
|
|
5
|
-
|
|
6
5
|
class WrapperFactory
|
|
7
6
|
@@xml_dictionary = {}
|
|
8
7
|
class << self
|
|
@@ -20,8 +19,11 @@ module VCloudSdk
|
|
|
20
19
|
end
|
|
21
20
|
|
|
22
21
|
def wrap_nodes(nodes, ns, namespace_defintions)
|
|
23
|
-
nodes.
|
|
24
|
-
|
|
22
|
+
nodes.map do |node|
|
|
23
|
+
WrapperFactory.wrap_node(node,
|
|
24
|
+
ns,
|
|
25
|
+
namespace_defintions)
|
|
26
|
+
end
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
# TODO: We might run into a bug later if there are ever XML node types
|
|
@@ -38,11 +40,11 @@ module VCloudSdk
|
|
|
38
40
|
def create_instance(type_name, ns = nil, namespace_defintions = nil,
|
|
39
41
|
*args)
|
|
40
42
|
xml = @@xml_dictionary[type_name]
|
|
41
|
-
if
|
|
43
|
+
if xml
|
|
42
44
|
wrap_document(xml, ns, namespace_defintions, *args)
|
|
43
45
|
else
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
fail CpiError,
|
|
47
|
+
"XML type #{type_name} not found in xml_templates dir."
|
|
46
48
|
end
|
|
47
49
|
end
|
|
48
50
|
|
|
@@ -73,7 +75,7 @@ module VCloudSdk
|
|
|
73
75
|
|
|
74
76
|
# Use (server) supplied prefixes defaulting to the preset ones for
|
|
75
77
|
# those not specified.
|
|
76
|
-
@doc_namespaces = ns_definitions.nil? ?
|
|
78
|
+
@doc_namespaces = ns_definitions.nil? ? [] :
|
|
77
79
|
Array.new(ns_definitions)
|
|
78
80
|
if @root.namespace_definitions
|
|
79
81
|
@doc_namespaces.concat(@root.namespace_definitions)
|
|
@@ -85,17 +87,30 @@ module VCloudSdk
|
|
|
85
87
|
end
|
|
86
88
|
|
|
87
89
|
def xpath(*args)
|
|
88
|
-
WrapperFactory
|
|
90
|
+
WrapperFactory.wrap_nodes(@root.xpath(*args), @ns, @doc_namespaces)
|
|
89
91
|
end
|
|
90
92
|
|
|
91
93
|
def href
|
|
92
94
|
@root["href"]
|
|
93
95
|
end
|
|
94
96
|
|
|
97
|
+
def href=(href)
|
|
98
|
+
@root["href"] = href
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def href_id
|
|
102
|
+
# Sample href: "https://10.146.21.135/api/org/a3783d64-0b9b-42d6-93cf-23bb08ec5520"
|
|
103
|
+
URI.parse(href).path.split('/')[-1]
|
|
104
|
+
end
|
|
105
|
+
|
|
95
106
|
def name
|
|
96
107
|
@root["name"]
|
|
97
108
|
end
|
|
98
109
|
|
|
110
|
+
def name=(name)
|
|
111
|
+
@root["name"] = name
|
|
112
|
+
end
|
|
113
|
+
|
|
99
114
|
def urn
|
|
100
115
|
@root["id"]
|
|
101
116
|
end
|
|
@@ -104,13 +119,52 @@ module VCloudSdk
|
|
|
104
119
|
@root["type"]
|
|
105
120
|
end
|
|
106
121
|
|
|
122
|
+
def type=(type)
|
|
123
|
+
@root["type"] = type
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def remove_link
|
|
127
|
+
get_nodes(XML_TYPE[:LINK],
|
|
128
|
+
{ rel: XML_TYPE[:REMOVE] },
|
|
129
|
+
true).first
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def edit_link
|
|
133
|
+
get_nodes(XML_TYPE[:LINK],
|
|
134
|
+
{ rel: XML_TYPE[:EDIT] },
|
|
135
|
+
true).first
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def power_on_link
|
|
139
|
+
get_nodes(XML_TYPE[:LINK],
|
|
140
|
+
{ rel: "power:powerOn"},
|
|
141
|
+
true).first
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def power_off_link
|
|
145
|
+
get_nodes(XML_TYPE[:LINK],
|
|
146
|
+
{ rel: "power:powerOff"},
|
|
147
|
+
true).first
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def undeploy_link
|
|
151
|
+
get_nodes(XML_TYPE[:LINK],
|
|
152
|
+
{ rel: "undeploy" },
|
|
153
|
+
true).first
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def running_tasks
|
|
157
|
+
get_nodes(XML_TYPE[:TASK],
|
|
158
|
+
{ status: TASK_STATUS[:RUNNING] })
|
|
159
|
+
end
|
|
160
|
+
|
|
107
161
|
def create_xpath_query(type_name, attrs = nil, only_immediate = false,
|
|
108
162
|
namespace = VCLOUD_NAMESPACE)
|
|
109
163
|
qualified_name = create_qualified_name(type_name, namespace)
|
|
110
164
|
depth_prefix = only_immediate ? nil : ".//"
|
|
111
165
|
if attrs && attrs.length > 0
|
|
112
166
|
attrs_list = []
|
|
113
|
-
attrs.each do |k,v|
|
|
167
|
+
attrs.each do |k, v|
|
|
114
168
|
attrs_list.push(%Q[@#{k}="#{v}"])
|
|
115
169
|
end
|
|
116
170
|
|
|
@@ -129,7 +183,7 @@ module VCloudSdk
|
|
|
129
183
|
@doc_namespaces.each do |ns|
|
|
130
184
|
if ns.href == href
|
|
131
185
|
if ns.prefix.nil?
|
|
132
|
-
ns_wanted_no_prefix = ns
|
|
186
|
+
ns_wanted_no_prefix = ns
|
|
133
187
|
else
|
|
134
188
|
namespace_wanted = ns
|
|
135
189
|
break
|
|
@@ -137,7 +191,8 @@ module VCloudSdk
|
|
|
137
191
|
end
|
|
138
192
|
end
|
|
139
193
|
namespace_wanted = ns_wanted_no_prefix unless namespace_wanted
|
|
140
|
-
|
|
194
|
+
fail CpiError,
|
|
195
|
+
"Namespace #{href} not found." unless namespace_wanted
|
|
141
196
|
ns_prefix = namespace_wanted.prefix.nil? ? "xmlns" :
|
|
142
197
|
namespace_wanted.prefix
|
|
143
198
|
"#{ns_prefix}:#{name}"
|
|
@@ -155,6 +210,11 @@ module VCloudSdk
|
|
|
155
210
|
@root[attr]
|
|
156
211
|
end
|
|
157
212
|
|
|
213
|
+
# get the attribute regardless what namespace the attribute has
|
|
214
|
+
def attribute(name)
|
|
215
|
+
@root.attribute(name)
|
|
216
|
+
end
|
|
217
|
+
|
|
158
218
|
def []=(attr, value)
|
|
159
219
|
@root[attr] = value
|
|
160
220
|
end
|
|
@@ -172,37 +232,38 @@ module VCloudSdk
|
|
|
172
232
|
end
|
|
173
233
|
|
|
174
234
|
def to_s
|
|
175
|
-
add_namespaces
|
|
176
|
-
|
|
235
|
+
add_namespaces
|
|
236
|
+
.to_xml
|
|
237
|
+
.each_line
|
|
238
|
+
.reduce("") do |xml, line|
|
|
239
|
+
xml.concat(line.sub(/^\s+$/, ""))
|
|
240
|
+
end
|
|
177
241
|
end
|
|
178
242
|
|
|
179
|
-
def add_child(
|
|
180
|
-
|
|
243
|
+
def add_child(
|
|
244
|
+
child,
|
|
245
|
+
namespace_prefix = nil,
|
|
246
|
+
namespace_href = nil,
|
|
247
|
+
parent = @root)
|
|
181
248
|
if child.is_a? Wrapper
|
|
182
249
|
@root.add_child(child.node)
|
|
183
250
|
elsif child.is_a? String
|
|
184
251
|
node = Nokogiri::XML::Node.new(child, parent)
|
|
185
|
-
|
|
186
|
-
raise CpiError,
|
|
187
|
-
"Namespace prefix must both be nil or defined together."
|
|
188
|
-
end
|
|
189
|
-
# This is a little more cumbersome but Nokogiri has problems
|
|
190
|
-
# figuring out the right namespace prefix otherwise
|
|
191
|
-
if namespace_prefix
|
|
192
|
-
ns = node.add_namespace_definition(namespace_prefix,
|
|
193
|
-
namespace_href)
|
|
194
|
-
node.namespace = ns
|
|
195
|
-
end
|
|
252
|
+
set_namespace(node, namespace_prefix, namespace_href)
|
|
196
253
|
parent.add_child(node)
|
|
197
254
|
else
|
|
198
|
-
|
|
255
|
+
fail CpiError, "Cannot add child. Unknown object passed in."
|
|
199
256
|
end
|
|
200
257
|
end
|
|
201
258
|
|
|
202
259
|
# Creates a child node but does not add it to the document. Used when
|
|
203
260
|
# a new child node has to be in a specific location or order.
|
|
204
|
-
def create_child(tag
|
|
205
|
-
|
|
261
|
+
def create_child(tag,
|
|
262
|
+
namespace_prefix = nil,
|
|
263
|
+
namespace_href = nil)
|
|
264
|
+
node = Nokogiri::XML::Node.new(tag, @root)
|
|
265
|
+
set_namespace(node, namespace_prefix, namespace_href)
|
|
266
|
+
node
|
|
206
267
|
end
|
|
207
268
|
|
|
208
269
|
protected
|
|
@@ -236,7 +297,25 @@ module VCloudSdk
|
|
|
236
297
|
clone.namespace = default_ns
|
|
237
298
|
clone
|
|
238
299
|
end
|
|
239
|
-
end
|
|
240
300
|
|
|
301
|
+
def set_namespace(node, namespace_prefix, namespace_href)
|
|
302
|
+
if namespace_prefix.nil? && namespace_href.nil?
|
|
303
|
+
return
|
|
304
|
+
elsif namespace_prefix.nil? || namespace_href.nil?
|
|
305
|
+
fail CpiError,
|
|
306
|
+
"Namespace prefix must both be nil or defined together."
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
if !node.namespace.nil? &&
|
|
310
|
+
node.namespace.prefix == namespace_prefix &&
|
|
311
|
+
node.namespace.href == namespace_href
|
|
312
|
+
return
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
ns = node.add_namespace_definition(namespace_prefix,
|
|
316
|
+
namespace_href)
|
|
317
|
+
node.namespace = ns
|
|
318
|
+
end
|
|
319
|
+
end
|
|
241
320
|
end
|
|
242
321
|
end
|