bosh_vcloud_cpi 0.4.9 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (276) hide show
  1. data/README.md +69 -0
  2. data/lib/cloud/vcloud/cache.rb +20 -0
  3. data/lib/cloud/vcloud/cloud.rb +253 -535
  4. data/lib/cloud/vcloud/errors.rb +9 -0
  5. data/lib/cloud/vcloud/file_uploader.rb +39 -0
  6. data/lib/cloud/vcloud/steps/add_catalog_item.rb +28 -0
  7. data/lib/cloud/vcloud/steps/add_networks.rb +40 -0
  8. data/lib/cloud/vcloud/steps/attach_detach_disk.rb +15 -0
  9. data/lib/cloud/vcloud/steps/create_disk.rb +29 -0
  10. data/lib/cloud/vcloud/steps/create_media.rb +41 -0
  11. data/lib/cloud/vcloud/steps/create_template.rb +27 -0
  12. data/lib/cloud/vcloud/steps/create_update_agent_env.rb +66 -0
  13. data/lib/cloud/vcloud/steps/delete.rb +12 -0
  14. data/lib/cloud/vcloud/steps/delete_catalog_media.rb +23 -0
  15. data/lib/cloud/vcloud/steps/delete_unused_networks.rb +20 -0
  16. data/lib/cloud/vcloud/steps/discard_suspended_state.rb +15 -0
  17. data/lib/cloud/vcloud/steps/eject_catalog_media.rb +29 -0
  18. data/lib/cloud/vcloud/steps/insert_catalog_media.rb +26 -0
  19. data/lib/cloud/vcloud/steps/instantiate.rb +59 -0
  20. data/lib/cloud/vcloud/steps/load_agent_env.rb +14 -0
  21. data/lib/cloud/vcloud/steps/poweroff.rb +21 -0
  22. data/lib/cloud/vcloud/steps/poweron.rb +17 -0
  23. data/lib/cloud/vcloud/steps/reboot.rb +13 -0
  24. data/lib/cloud/vcloud/steps/recompose.rb +19 -0
  25. data/lib/cloud/vcloud/steps/reconfigure_vm.rb +35 -0
  26. data/lib/cloud/vcloud/steps/save_agent_env.rb +43 -0
  27. data/lib/cloud/vcloud/steps/stemcell_info.rb +20 -0
  28. data/lib/cloud/vcloud/steps/undeploy.rb +19 -0
  29. data/lib/cloud/vcloud/steps/upload_media_files.rb +18 -0
  30. data/lib/cloud/vcloud/steps/upload_template_files.rb +29 -0
  31. data/lib/cloud/vcloud/steps.rb +100 -0
  32. data/lib/cloud/vcloud/vcd_client.rb +284 -0
  33. data/lib/cloud/vcloud/version.rb +1 -1
  34. data/lib/cloud/vcloud/xml/constants.rb +428 -0
  35. data/lib/cloud/vcloud/xml/wrapper.rb +292 -0
  36. data/lib/cloud/vcloud/xml/wrapper_classes/admin_catalog.rb +20 -0
  37. data/lib/cloud/vcloud/xml/wrapper_classes/admin_org.rb +15 -0
  38. data/lib/cloud/vcloud/xml/wrapper_classes/catalog.rb +20 -0
  39. data/lib/cloud/vcloud/xml/wrapper_classes/catalog_item.rb +27 -0
  40. data/lib/cloud/vcloud/xml/wrapper_classes/disk.rb +42 -0
  41. data/lib/cloud/vcloud/xml/wrapper_classes/disk_attach_or_detach_params.rb +12 -0
  42. data/lib/cloud/vcloud/xml/wrapper_classes/disk_create_params.rb +47 -0
  43. data/lib/cloud/vcloud/xml/wrapper_classes/entity.rb +11 -0
  44. data/lib/cloud/vcloud/xml/wrapper_classes/file.rb +11 -0
  45. data/lib/cloud/vcloud/xml/wrapper_classes/hard_disk_item_wrapper.rb +56 -0
  46. data/lib/cloud/vcloud/xml/wrapper_classes/instantiate_vapp_template_params.rb +71 -0
  47. data/lib/cloud/vcloud/xml/wrapper_classes/ip_scope.rb +55 -0
  48. data/lib/cloud/vcloud/xml/wrapper_classes/item.rb +32 -0
  49. data/lib/cloud/vcloud/xml/wrapper_classes/link_wrapper.rb +39 -0
  50. data/lib/cloud/vcloud/xml/wrapper_classes/media.rb +57 -0
  51. data/lib/cloud/vcloud/xml/wrapper_classes/media_insert_or_eject_params.rb +17 -0
  52. data/lib/cloud/vcloud/xml/wrapper_classes/metadata_value.rb +15 -0
  53. data/lib/cloud/vcloud/xml/wrapper_classes/network.rb +15 -0
  54. data/lib/cloud/vcloud/xml/wrapper_classes/network_config.rb +27 -0
  55. data/lib/cloud/vcloud/xml/wrapper_classes/network_config_section.rb +25 -0
  56. data/lib/cloud/vcloud/xml/wrapper_classes/network_connection.rb +71 -0
  57. data/lib/cloud/vcloud/xml/wrapper_classes/network_connection_section.rb +67 -0
  58. data/lib/cloud/vcloud/xml/wrapper_classes/nic_item_wrapper.rb +89 -0
  59. data/lib/cloud/vcloud/xml/wrapper_classes/org.rb +21 -0
  60. data/lib/cloud/vcloud/xml/wrapper_classes/org_network.rb +19 -0
  61. data/lib/cloud/vcloud/xml/wrapper_classes/org_vdc_network.rb +11 -0
  62. data/lib/cloud/vcloud/xml/wrapper_classes/recompose_vapp_wrapper.rb +51 -0
  63. data/lib/cloud/vcloud/xml/wrapper_classes/session.rb +24 -0
  64. data/lib/cloud/vcloud/xml/wrapper_classes/supported_versions.rb +19 -0
  65. data/lib/cloud/vcloud/xml/wrapper_classes/task.rb +32 -0
  66. data/lib/cloud/vcloud/xml/wrapper_classes/upload_vapp_template_params.rb +11 -0
  67. data/lib/cloud/vcloud/xml/wrapper_classes/vapp.rb +77 -0
  68. data/lib/cloud/vcloud/xml/wrapper_classes/vapp_template.rb +17 -0
  69. data/lib/cloud/vcloud/xml/wrapper_classes/vcloud.rb +15 -0
  70. data/lib/cloud/vcloud/xml/wrapper_classes/vdc.rb +59 -0
  71. data/lib/cloud/vcloud/xml/wrapper_classes/vdc_storage_profile.rb +15 -0
  72. data/lib/cloud/vcloud/xml/wrapper_classes/virtual_hardware_section.rb +68 -0
  73. data/lib/cloud/vcloud/xml/wrapper_classes/vm.rb +212 -0
  74. data/lib/cloud/vcloud/xml/xml_templates/AdminAllocatedExtIpRecord.xml +1 -0
  75. data/lib/cloud/vcloud/xml/xml_templates/AdminCatalog.xml +1 -0
  76. data/lib/cloud/vcloud/xml/xml_templates/AdminCatalogItemRecord.xml +1 -0
  77. data/lib/cloud/vcloud/xml/xml_templates/AdminCatalogRecord.xml +1 -0
  78. data/lib/cloud/vcloud/xml/xml_templates/AdminGroupRecord.xml +1 -0
  79. data/lib/cloud/vcloud/xml/xml_templates/AdminMediaRecord.xml +1 -0
  80. data/lib/cloud/vcloud/xml/xml_templates/AdminOrg.xml +1 -0
  81. data/lib/cloud/vcloud/xml/xml_templates/AdminOrgNetworkRecord.xml +1 -0
  82. data/lib/cloud/vcloud/xml/xml_templates/AdminShadowVmRecord.xml +1 -0
  83. data/lib/cloud/vcloud/xml/xml_templates/AdminTaskRecord.xml +1 -0
  84. data/lib/cloud/vcloud/xml/xml_templates/AdminUserRecord.xml +1 -0
  85. data/lib/cloud/vcloud/xml/xml_templates/AdminVAppNetworkRecord.xml +1 -0
  86. data/lib/cloud/vcloud/xml/xml_templates/AdminVAppRecord.xml +1 -0
  87. data/lib/cloud/vcloud/xml/xml_templates/AdminVAppReference.xml +1 -0
  88. data/lib/cloud/vcloud/xml/xml_templates/AdminVAppReferences.xml +1 -0
  89. data/lib/cloud/vcloud/xml/xml_templates/AdminVAppTemplateRecord.xml +1 -0
  90. data/lib/cloud/vcloud/xml/xml_templates/AdminVdc.xml +1 -0
  91. data/lib/cloud/vcloud/xml/xml_templates/AdminVdcRecord.xml +1 -0
  92. data/lib/cloud/vcloud/xml/xml_templates/AdminVdcReference.xml +1 -0
  93. data/lib/cloud/vcloud/xml/xml_templates/AdminVdcReferences.xml +1 -0
  94. data/lib/cloud/vcloud/xml/xml_templates/AdminVmRecord.xml +1 -0
  95. data/lib/cloud/vcloud/xml/xml_templates/AllEULAsAccepted.xml +1 -0
  96. data/lib/cloud/vcloud/xml/xml_templates/AllocatedExtIpRecord.xml +1 -0
  97. data/lib/cloud/vcloud/xml/xml_templates/BlockingTaskRecord.xml +1 -0
  98. data/lib/cloud/vcloud/xml/xml_templates/BlockingTaskReference.xml +1 -0
  99. data/lib/cloud/vcloud/xml/xml_templates/BlockingTaskReferences.xml +1 -0
  100. data/lib/cloud/vcloud/xml/xml_templates/CaptureVAppParams.xml +1 -0
  101. data/lib/cloud/vcloud/xml/xml_templates/Catalog.xml +1 -0
  102. data/lib/cloud/vcloud/xml/xml_templates/CatalogItem.xml +1 -0
  103. data/lib/cloud/vcloud/xml/xml_templates/CatalogItemRecord.xml +1 -0
  104. data/lib/cloud/vcloud/xml/xml_templates/CatalogItemReference.xml +1 -0
  105. data/lib/cloud/vcloud/xml/xml_templates/CatalogItemReferences.xml +1 -0
  106. data/lib/cloud/vcloud/xml/xml_templates/CatalogRecord.xml +1 -0
  107. data/lib/cloud/vcloud/xml/xml_templates/CatalogReference.xml +1 -0
  108. data/lib/cloud/vcloud/xml/xml_templates/CatalogReferences.xml +1 -0
  109. data/lib/cloud/vcloud/xml/xml_templates/CellRecord.xml +1 -0
  110. data/lib/cloud/vcloud/xml/xml_templates/CloneMediaParams.xml +1 -0
  111. data/lib/cloud/vcloud/xml/xml_templates/CloneVAppParams.xml +1 -0
  112. data/lib/cloud/vcloud/xml/xml_templates/CloneVAppTemplateParams.xml +1 -0
  113. data/lib/cloud/vcloud/xml/xml_templates/ComposeVAppParams.xml +17 -0
  114. data/lib/cloud/vcloud/xml/xml_templates/ControlAccessParams.xml +1 -0
  115. data/lib/cloud/vcloud/xml/xml_templates/CustomizationSection.xml +1 -0
  116. data/lib/cloud/vcloud/xml/xml_templates/DatastoreProviderVdcRelationRecord.xml +1 -0
  117. data/lib/cloud/vcloud/xml/xml_templates/DatastoreRecord.xml +1 -0
  118. data/lib/cloud/vcloud/xml/xml_templates/DatastoreReference.xml +1 -0
  119. data/lib/cloud/vcloud/xml/xml_templates/DatastoreReferences.xml +1 -0
  120. data/lib/cloud/vcloud/xml/xml_templates/DeployVAppParams.xml +1 -0
  121. data/lib/cloud/vcloud/xml/xml_templates/DhcpService.xml +1 -0
  122. data/lib/cloud/vcloud/xml/xml_templates/DiskAttachOrDetachParams.xml +5 -0
  123. data/lib/cloud/vcloud/xml/xml_templates/DiskCreateParams.xml +9 -0
  124. data/lib/cloud/vcloud/xml/xml_templates/DvSwitchRecord.xml +1 -0
  125. data/lib/cloud/vcloud/xml/xml_templates/Entity.xml +1 -0
  126. data/lib/cloud/vcloud/xml/xml_templates/Error.xml +1 -0
  127. data/lib/cloud/vcloud/xml/xml_templates/EventRecord.xml +1 -0
  128. data/lib/cloud/vcloud/xml/xml_templates/ExternalNetwork.xml +1 -0
  129. data/lib/cloud/vcloud/xml/xml_templates/File.xml +1 -0
  130. data/lib/cloud/vcloud/xml/xml_templates/FirewallService.xml +1 -0
  131. data/lib/cloud/vcloud/xml/xml_templates/GeneralOrgSettings.xml +1 -0
  132. data/lib/cloud/vcloud/xml/xml_templates/Group.xml +1 -0
  133. data/lib/cloud/vcloud/xml/xml_templates/GroupRecord.xml +1 -0
  134. data/lib/cloud/vcloud/xml/xml_templates/GroupReference.xml +1 -0
  135. data/lib/cloud/vcloud/xml/xml_templates/GroupReferences.xml +1 -0
  136. data/lib/cloud/vcloud/xml/xml_templates/GuestCustomizationSection.xml +1 -0
  137. data/lib/cloud/vcloud/xml/xml_templates/HostRecord.xml +1 -0
  138. data/lib/cloud/vcloud/xml/xml_templates/HostReference.xml +1 -0
  139. data/lib/cloud/vcloud/xml/xml_templates/HostReferences.xml +1 -0
  140. data/lib/cloud/vcloud/xml/xml_templates/InstantiateOvfParams.xml +1 -0
  141. data/lib/cloud/vcloud/xml/xml_templates/InstantiateVAppTemplateParams.xml +1 -0
  142. data/lib/cloud/vcloud/xml/xml_templates/IpScope.xml +12 -0
  143. data/lib/cloud/vcloud/xml/xml_templates/IpsecVpnLocalPeer.xml +1 -0
  144. data/lib/cloud/vcloud/xml/xml_templates/IpsecVpnPeer.xml +1 -0
  145. data/lib/cloud/vcloud/xml/xml_templates/IpsecVpnRemotePeer.xml +1 -0
  146. data/lib/cloud/vcloud/xml/xml_templates/IpsecVpnService.xml +1 -0
  147. data/lib/cloud/vcloud/xml/xml_templates/IpsecVpnThirdPartyPeer.xml +1 -0
  148. data/lib/cloud/vcloud/xml/xml_templates/Item.xml +3 -0
  149. data/lib/cloud/vcloud/xml/xml_templates/ItemVcd.xml +5 -0
  150. data/lib/cloud/vcloud/xml/xml_templates/LeaseSettingsSection.xml +1 -0
  151. data/lib/cloud/vcloud/xml/xml_templates/Link.xml +1 -0
  152. data/lib/cloud/vcloud/xml/xml_templates/Media.xml +5 -0
  153. data/lib/cloud/vcloud/xml/xml_templates/MediaInsertOrEjectParams.xml +4 -0
  154. data/lib/cloud/vcloud/xml/xml_templates/MediaRecord.xml +1 -0
  155. data/lib/cloud/vcloud/xml/xml_templates/MediaReference.xml +1 -0
  156. data/lib/cloud/vcloud/xml/xml_templates/MediaReferences.xml +1 -0
  157. data/lib/cloud/vcloud/xml/xml_templates/Metadata.xml +5 -0
  158. data/lib/cloud/vcloud/xml/xml_templates/MetadataEntry.xml +7 -0
  159. data/lib/cloud/vcloud/xml/xml_templates/MetadataValue.xml +8 -0
  160. data/lib/cloud/vcloud/xml/xml_templates/NatService.xml +1 -0
  161. data/lib/cloud/vcloud/xml/xml_templates/Network.xml +4 -0
  162. data/lib/cloud/vcloud/xml/xml_templates/NetworkAssignment.xml +1 -0
  163. data/lib/cloud/vcloud/xml/xml_templates/NetworkConfig.xml +21 -0
  164. data/lib/cloud/vcloud/xml/xml_templates/NetworkConfigSection.xml +1 -0
  165. data/lib/cloud/vcloud/xml/xml_templates/NetworkConnection.xml +11 -0
  166. data/lib/cloud/vcloud/xml/xml_templates/NetworkConnectionSection.xml +1 -0
  167. data/lib/cloud/vcloud/xml/xml_templates/NetworkPoolRecord.xml +1 -0
  168. data/lib/cloud/vcloud/xml/xml_templates/NetworkPoolReference.xml +1 -0
  169. data/lib/cloud/vcloud/xml/xml_templates/NetworkPoolReferences.xml +1 -0
  170. data/lib/cloud/vcloud/xml/xml_templates/NetworkRecord.xml +1 -0
  171. data/lib/cloud/vcloud/xml/xml_templates/NetworkReference.xml +1 -0
  172. data/lib/cloud/vcloud/xml/xml_templates/NetworkReferences.xml +1 -0
  173. data/lib/cloud/vcloud/xml/xml_templates/NetworkService.xml +1 -0
  174. data/lib/cloud/vcloud/xml/xml_templates/Org.xml +1 -0
  175. data/lib/cloud/vcloud/xml/xml_templates/OrgEmailSettings.xml +1 -0
  176. data/lib/cloud/vcloud/xml/xml_templates/OrgList.xml +1 -0
  177. data/lib/cloud/vcloud/xml/xml_templates/OrgNetwork.xml +1 -0
  178. data/lib/cloud/vcloud/xml/xml_templates/OrgNetworkRecord.xml +1 -0
  179. data/lib/cloud/vcloud/xml/xml_templates/OrgNetworkReference.xml +1 -0
  180. data/lib/cloud/vcloud/xml/xml_templates/OrgNetworkReferences.xml +1 -0
  181. data/lib/cloud/vcloud/xml/xml_templates/OrgPasswordPolicySettings.xml +1 -0
  182. data/lib/cloud/vcloud/xml/xml_templates/OrgRecord.xml +1 -0
  183. data/lib/cloud/vcloud/xml/xml_templates/OrgReference.xml +1 -0
  184. data/lib/cloud/vcloud/xml/xml_templates/OrgReferences.xml +1 -0
  185. data/lib/cloud/vcloud/xml/xml_templates/OrgSettings.xml +1 -0
  186. data/lib/cloud/vcloud/xml/xml_templates/OrgVAppTemplateLeaseSettings.xml +1 -0
  187. data/lib/cloud/vcloud/xml/xml_templates/OrgVdcNetwork.xml +1 -0
  188. data/lib/cloud/vcloud/xml/xml_templates/OrgVdcRecord.xml +1 -0
  189. data/lib/cloud/vcloud/xml/xml_templates/OrgVdcReference.xml +1 -0
  190. data/lib/cloud/vcloud/xml/xml_templates/OrgVdcReferences.xml +1 -0
  191. data/lib/cloud/vcloud/xml/xml_templates/OrgVdcResourcePoolRelationRecord.xml +1 -0
  192. data/lib/cloud/vcloud/xml/xml_templates/Owner.xml +1 -0
  193. data/lib/cloud/vcloud/xml/xml_templates/PortgroupRecord.xml +1 -0
  194. data/lib/cloud/vcloud/xml/xml_templates/ProductSectionList.xml +1 -0
  195. data/lib/cloud/vcloud/xml/xml_templates/ProviderVdc.xml +1 -0
  196. data/lib/cloud/vcloud/xml/xml_templates/ProviderVdcResourcePoolRelationRecord.xml +1 -0
  197. data/lib/cloud/vcloud/xml/xml_templates/PublishCatalogParams.xml +1 -0
  198. data/lib/cloud/vcloud/xml/xml_templates/QueryList.xml +1 -0
  199. data/lib/cloud/vcloud/xml/xml_templates/QueryResultRecords.xml +1 -0
  200. data/lib/cloud/vcloud/xml/xml_templates/RasdItemsList.xml +1 -0
  201. data/lib/cloud/vcloud/xml/xml_templates/RecomposeVAppParams.xml +17 -0
  202. data/lib/cloud/vcloud/xml/xml_templates/Record.xml +1 -0
  203. data/lib/cloud/vcloud/xml/xml_templates/Reference.xml +1 -0
  204. data/lib/cloud/vcloud/xml/xml_templates/References.xml +1 -0
  205. data/lib/cloud/vcloud/xml/xml_templates/RelocateParams.xml +1 -0
  206. data/lib/cloud/vcloud/xml/xml_templates/ResourceEntity.xml +1 -0
  207. data/lib/cloud/vcloud/xml/xml_templates/ResourcePoolRecord.xml +1 -0
  208. data/lib/cloud/vcloud/xml/xml_templates/Right.xml +1 -0
  209. data/lib/cloud/vcloud/xml/xml_templates/RightRecord.xml +1 -0
  210. data/lib/cloud/vcloud/xml/xml_templates/RightReference.xml +1 -0
  211. data/lib/cloud/vcloud/xml/xml_templates/RightReferences.xml +1 -0
  212. data/lib/cloud/vcloud/xml/xml_templates/Role.xml +1 -0
  213. data/lib/cloud/vcloud/xml/xml_templates/RoleRecord.xml +1 -0
  214. data/lib/cloud/vcloud/xml/xml_templates/RoleReference.xml +1 -0
  215. data/lib/cloud/vcloud/xml/xml_templates/RoleReferences.xml +1 -0
  216. data/lib/cloud/vcloud/xml/xml_templates/RuntimeInfoSection.xml +1 -0
  217. data/lib/cloud/vcloud/xml/xml_templates/ScreenTicket.xml +1 -0
  218. data/lib/cloud/vcloud/xml/xml_templates/Session.xml +1 -0
  219. data/lib/cloud/vcloud/xml/xml_templates/ShadowVMReferences.xml +1 -0
  220. data/lib/cloud/vcloud/xml/xml_templates/StaticRoutingService.xml +1 -0
  221. data/lib/cloud/vcloud/xml/xml_templates/StrandedUserRecord.xml +1 -0
  222. data/lib/cloud/vcloud/xml/xml_templates/Task.xml +0 -0
  223. data/lib/cloud/vcloud/xml/xml_templates/TaskRecord.xml +1 -0
  224. data/lib/cloud/vcloud/xml/xml_templates/TaskReference.xml +1 -0
  225. data/lib/cloud/vcloud/xml/xml_templates/TaskReferences.xml +1 -0
  226. data/lib/cloud/vcloud/xml/xml_templates/TasksList.xml +1 -0
  227. data/lib/cloud/vcloud/xml/xml_templates/UndeployVAppParams.xml +1 -0
  228. data/lib/cloud/vcloud/xml/xml_templates/UploadVAppTemplateParams.xml +1 -0
  229. data/lib/cloud/vcloud/xml/xml_templates/User.xml +1 -0
  230. data/lib/cloud/vcloud/xml/xml_templates/UserRecord.xml +1 -0
  231. data/lib/cloud/vcloud/xml/xml_templates/UserReference.xml +1 -0
  232. data/lib/cloud/vcloud/xml/xml_templates/UserReferences.xml +1 -0
  233. data/lib/cloud/vcloud/xml/xml_templates/VApp.xml +1 -0
  234. data/lib/cloud/vcloud/xml/xml_templates/VAppLeaseSettings.xml +1 -0
  235. data/lib/cloud/vcloud/xml/xml_templates/VAppNetwork.xml +1 -0
  236. data/lib/cloud/vcloud/xml/xml_templates/VAppNetworkRecord.xml +1 -0
  237. data/lib/cloud/vcloud/xml/xml_templates/VAppNetworkReference.xml +1 -0
  238. data/lib/cloud/vcloud/xml/xml_templates/VAppNetworkReferences.xml +1 -0
  239. data/lib/cloud/vcloud/xml/xml_templates/VAppOrgNetworkRelationRecord.xml +1 -0
  240. data/lib/cloud/vcloud/xml/xml_templates/VAppOrgNetworkRelationReference.xml +1 -0
  241. data/lib/cloud/vcloud/xml/xml_templates/VAppOrgNetworkRelationReferences.xml +1 -0
  242. data/lib/cloud/vcloud/xml/xml_templates/VAppRecord.xml +1 -0
  243. data/lib/cloud/vcloud/xml/xml_templates/VAppReference.xml +1 -0
  244. data/lib/cloud/vcloud/xml/xml_templates/VAppReferences.xml +1 -0
  245. data/lib/cloud/vcloud/xml/xml_templates/VAppTemplate.xml +1 -0
  246. data/lib/cloud/vcloud/xml/xml_templates/VAppTemplateRecord.xml +1 -0
  247. data/lib/cloud/vcloud/xml/xml_templates/VAppTemplateReference.xml +1 -0
  248. data/lib/cloud/vcloud/xml/xml_templates/VAppTemplateReferences.xml +1 -0
  249. data/lib/cloud/vcloud/xml/xml_templates/VCloud.xml +1 -0
  250. data/lib/cloud/vcloud/xml/xml_templates/VMRecord.xml +1 -0
  251. data/lib/cloud/vcloud/xml/xml_templates/VMReference.xml +1 -0
  252. data/lib/cloud/vcloud/xml/xml_templates/VMReferences.xml +1 -0
  253. data/lib/cloud/vcloud/xml/xml_templates/VMWProviderVdcRecord.xml +1 -0
  254. data/lib/cloud/vcloud/xml/xml_templates/VMWProviderVdcReference.xml +1 -0
  255. data/lib/cloud/vcloud/xml/xml_templates/VMWProviderVdcReferences.xml +1 -0
  256. data/lib/cloud/vcloud/xml/xml_templates/Vdc.xml +1 -0
  257. data/lib/cloud/vcloud/xml/xml_templates/VdcReferences.xml +1 -0
  258. data/lib/cloud/vcloud/xml/xml_templates/VdcStorageProfile.xml +1 -0
  259. data/lib/cloud/vcloud/xml/xml_templates/VirtualCenterRecord.xml +1 -0
  260. data/lib/cloud/vcloud/xml/xml_templates/VirtualCenterReference.xml +1 -0
  261. data/lib/cloud/vcloud/xml/xml_templates/VirtualCenterReferences.xml +1 -0
  262. data/lib/cloud/vcloud/xml/xml_templates/Vm.xml +1 -0
  263. data/lib/cloud/vcloud/xml/xml_templates/VmPendingQuestion.xml +1 -0
  264. data/lib/cloud/vcloud/xml/xml_templates/VmQuestionAnswer.xml +1 -0
  265. data/lib/cloud/vcloud/xml/xml_templates/generate_dictionary.rb +8 -0
  266. data/lib/cloud/vcloud.rb +3 -7
  267. metadata +384 -88
  268. data/README +0 -26
  269. data/Rakefile +0 -50
  270. data/lib/cloud/vcloud/const.rb +0 -27
  271. data/lib/cloud/vcloud/util.rb +0 -23
  272. data/spec/assets/test-deployment-manifest.yml +0 -183
  273. data/spec/assets/test-director-config.yml +0 -73
  274. data/spec/assets/valid_stemcell.tgz +0 -0
  275. data/spec/spec_helper.rb +0 -135
  276. data/spec/unit/cloud_spec.rb +0 -506
@@ -0,0 +1,20 @@
1
+ module VCloudCloud
2
+ module Steps
3
+ class StemcellInfo < Step
4
+ def perform(image, &block)
5
+ tmpdir = state[:stemcell_dir] = Dir.mktmpdir
6
+ # examine files in the tarball
7
+ `tar -C #{tmpdir} -xzf #{File.absolute_path(image)}`
8
+ raise 'Invalid stemcell image' unless $?.success?
9
+ files = Dir.glob File.join(tmpdir, '*.ovf')
10
+ # stemcell should only include one .ovf file
11
+ raise "Invalid stemcell image: having #{files.length} .ovf files" if files.length != 1
12
+ state[:stemcell_ovf] = File.basename files[0]
13
+ end
14
+
15
+ def cleanup
16
+ FileUtils.remove_entry_secure state[:stemcell_dir] if state[:stemcell_dir]
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ module VCloudCloud
2
+ module Steps
3
+ # Undeployment means deallocation of all resources for a vApp/VM like CPU and memory from a vDC resource pool.
4
+ # Undeploying a vApp automatically undeploys all of the virtual machines it contains.
5
+ # https://www.vmware.com/support/vcd/doc/rest-api-doc-1.5-html/operations/POST-UndeployVApp.html
6
+ class Undeploy < Step
7
+ def perform(ref, &block)
8
+ entity = client.reload state[ref]
9
+ if entity['deployed'] == 'true'
10
+ link = entity.undeploy_link
11
+ raise "#{entity.name} can't be undeployed" unless link
12
+ params = VCloudSdk::Xml::WrapperFactory.create_instance 'UndeployVAppParams'
13
+ client.invoke_and_wait :post, link, :payload => params
14
+ state[ref] = client.reload entity
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module VCloudCloud
2
+ module Steps
3
+ class UploadMediaFiles < Step
4
+ def perform(iso, &block)
5
+ # get the file to upload
6
+ media_file = File.new iso, 'rb'
7
+
8
+ # upload the file
9
+ media = state[:media]
10
+ incomplete_file = media.incomplete_files.pop
11
+ client.upload_stream incomplete_file.upload_link.href, media_file.stat.size, media_file
12
+
13
+ # reload the media file
14
+ state[:media] = client.reload media
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ module VCloudCloud
2
+ module Steps
3
+ class UploadTemplateFiles < Step
4
+ def perform(&block)
5
+ template = client.reload state[:vapp_template]
6
+ # After uploading a file, we should reload the template object for incomplete_files list
7
+ # until all files are uploaded.
8
+ while template.files && !template.files.empty?
9
+ template.incomplete_files.each do |file|
10
+ if file.name.end_with?('.ovf')
11
+ content = File.new(File.join(state[:stemcell_dir], state[:stemcell_ovf])).read
12
+ client.invoke :put, file.upload_link.href,
13
+ :payload => content,
14
+ :headers => { :content_type => VCloudSdk::Xml::MEDIA_TYPE[:OVF] },
15
+ :no_wrap => true
16
+ else
17
+ f = File.new File.join(state[:stemcell_dir], file.name)
18
+ @logger.debug "UPLOAD #{f.path}: #{f.size}"
19
+ client.upload_stream file.upload_link.href, f.size, f
20
+ end
21
+ end
22
+
23
+ template = client.reload template
24
+ end
25
+ state[:vapp_template] = client.wait_entity template
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,100 @@
1
+ require 'common/thread_formatter' # for with_thread_name
2
+
3
+ module VCloudCloud
4
+ # Abstract Step
5
+ class Step
6
+ attr_reader :state, :client
7
+
8
+ def initialize(state, client)
9
+ @client = client
10
+ @logger = client.logger
11
+ @state = state
12
+ end
13
+
14
+ def rollback
15
+ end
16
+
17
+ def cleanup
18
+ end
19
+ end
20
+
21
+ # Transactional step execution engine
22
+ class Transaction
23
+ attr_reader :name, :state, :client
24
+
25
+ def initialize(name, client)
26
+ @name = name
27
+ @client = client
28
+ @logger = client.logger
29
+ @state = {}
30
+ @steps = []
31
+ end
32
+
33
+ def next(step_class, *args, &block)
34
+ step = step_class.new @state, @client
35
+ @steps << step
36
+ @logger.debug "STEP #{step_class.to_s}"
37
+ step.perform *args, &block
38
+ end
39
+
40
+ def perform(options = {}, &block)
41
+ with_thread_name @name do
42
+ # Perform all steps guarded by exception handler
43
+ begin
44
+ block.call self
45
+ rescue => ex
46
+ @logger.error "FAIL #{@name} #{ex}"
47
+ reverse_steps :rollback
48
+ raise ex unless options[:no_throws]
49
+ @state[:error] = ex
50
+ ensure
51
+ reverse_steps :cleanup
52
+ end
53
+ end
54
+ @state
55
+ end
56
+
57
+ def self.perform(name, client = nil, options = {}, &block)
58
+ new(name, client).perform options, &block
59
+ end
60
+
61
+ private
62
+
63
+ def reverse_steps(method)
64
+ @steps.reverse_each do |step|
65
+ begin
66
+ @logger.debug "REV #{method.to_s.upcase} #{step.class.to_s}"
67
+ step.send method
68
+ rescue => ex
69
+ @logger.error(ex) if @logger
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ require_relative 'steps/stemcell_info'
77
+ require_relative 'steps/create_template'
78
+ require_relative 'steps/create_media'
79
+ require_relative 'steps/upload_template_files'
80
+ require_relative 'steps/add_catalog_item'
81
+ require_relative 'steps/instantiate'
82
+ require_relative 'steps/recompose'
83
+ require_relative 'steps/delete'
84
+ require_relative 'steps/undeploy'
85
+ require_relative 'steps/add_networks'
86
+ require_relative 'steps/delete_unused_networks'
87
+ require_relative 'steps/reconfigure_vm'
88
+ require_relative 'steps/create_update_agent_env'
89
+ require_relative 'steps/load_agent_env'
90
+ require_relative 'steps/save_agent_env'
91
+ require_relative 'steps/eject_catalog_media'
92
+ require_relative 'steps/delete_catalog_media'
93
+ require_relative 'steps/upload_media_files'
94
+ require_relative 'steps/insert_catalog_media'
95
+ require_relative 'steps/poweron'
96
+ require_relative 'steps/poweroff'
97
+ require_relative 'steps/discard_suspended_state'
98
+ require_relative 'steps/reboot'
99
+ require_relative 'steps/create_disk'
100
+ require_relative 'steps/attach_detach_disk'
@@ -0,0 +1,284 @@
1
+ require 'base64'
2
+ require 'uri'
3
+ require 'rest_client'
4
+
5
+ require_relative 'cache'
6
+ require_relative 'file_uploader'
7
+ require_relative 'xml/constants'
8
+ require_relative 'xml/wrapper'
9
+
10
+ module VCloudCloud
11
+ class VCloudClient
12
+ attr_reader :logger
13
+
14
+ VCLOUD_VERSION_NUMBER = '5.1'
15
+
16
+ def initialize(vcd_settings, logger)
17
+ @logger = logger
18
+ @url = vcd_settings['url']
19
+ @user = vcd_settings['user']
20
+ @pass = vcd_settings['password']
21
+ @entities = vcd_settings['entities']
22
+
23
+ control = @entities['control'] || {}
24
+ @wait_max = control['wait_max'] || WAIT_MAX
25
+ @wait_delay = control['wait_delay'] || WAIT_DELAY
26
+ @retry_max = control['retry_max'] || RETRY_MAX
27
+ @retry_delay = control['retry_delay'] || RETRY_DELAY
28
+ @cookie_timeout = control['cookie_timeout'] || COOKIE_TIMEOUT
29
+
30
+ @cache = Cache.new
31
+ end
32
+
33
+ def org_name
34
+ @entities['organization']
35
+ end
36
+
37
+ def vdc_name
38
+ @entities['virtual_datacenter']
39
+ end
40
+
41
+ def vapp_catalog_name
42
+ @entities['vapp_catalog']
43
+ end
44
+
45
+ def media_catalog_name
46
+ @entities['media_catalog']
47
+ end
48
+
49
+ def org
50
+ @cache.get :org do
51
+ session
52
+ resolve_link @org_link
53
+ end
54
+ end
55
+
56
+ def vdc
57
+ @cache.get :vdc do
58
+ vdc_link = org.vdc_link vdc_name
59
+ raise ObjectNotFoundError, "Invalid virtual datacenter name: #{vdc_name}" unless vdc_link
60
+ resolve_link vdc_link
61
+ end
62
+ end
63
+
64
+ # catalog should be either :vapp or :media
65
+ def catalog(catalog_type)
66
+ catalog_link = org.catalog_link @entities["#{catalog_type.to_s}_catalog"]
67
+ raise ObjectNotFoundError, "Invalid catalog type: #{catalog_type}" unless catalog_link
68
+ resolve_link catalog_link
69
+ end
70
+
71
+ # TODO we can discard type parameter since name should be
72
+ # the unique identifier of a item in one catalog.
73
+ def catalog_item(catalog_type, name, type)
74
+ cat = catalog catalog_type
75
+ items = cat.catalog_items name
76
+ result = nil
77
+ items.any? do |item|
78
+ object = resolve_link item
79
+ result = object if object.entity['type'] == type
80
+ result
81
+ end if items
82
+ result
83
+ end
84
+
85
+ def media(name)
86
+ catalog_media = catalog_item :media, name, VCloudSdk::Xml::MEDIA_TYPE[:MEDIA]
87
+ raise ObjectNotFoundError, "Invalid catalog media: #{name}" unless catalog_media
88
+ media = resolve_link catalog_media.entity
89
+ [media, catalog_media]
90
+ end
91
+
92
+ def vapp_by_name(name)
93
+ node = vdc.get_vapp name
94
+ raise ObjectNotFoundError, "vApp #{name} does not exist" unless node
95
+ resolve_link node.href
96
+ end
97
+
98
+ def resolve_link(link)
99
+ invoke :get, link
100
+ end
101
+
102
+ def resolve_entity(id)
103
+ session
104
+ entity = invoke :get, "#{@entity_resolver_link.href}#{id}"
105
+ raise ObjectNotFoundError, "Invalid entity urn: #{id}" unless entity
106
+ resolve_link entity.link
107
+ end
108
+
109
+ def reload(object)
110
+ resolve_link object.href
111
+ end
112
+
113
+ def invoke(method, path, options = {})
114
+ session
115
+
116
+ response = send_request method, path, options
117
+ (options[:no_wrap] || response.code == 204) ? nil : wrap_response(response)
118
+ end
119
+
120
+ def upload_stream(url, size, stream, options = {})
121
+ session
122
+ FileUploader.upload url, size, stream, options.merge({ :cookie => @cookie, :authorization => @auth_token })
123
+ end
124
+
125
+ def invoke_and_wait(*args)
126
+ wait_task invoke(*args)
127
+ end
128
+
129
+ def wait_task(task, accept_failure = false)
130
+ timed_loop do
131
+ task = reload task
132
+ status = task.status.downcase
133
+ @logger.debug "WAIT TASK #{task.urn} #{task.operation} #{status}"
134
+ return task if status == VCloudSdk::Xml::TASK_STATUS[:SUCCESS]
135
+ if [:ABORTED, :ERROR, :CANCELED].any? { |s| status == VCloudSdk::Xml::TASK_STATUS[s] }
136
+ return task if accept_failure
137
+ raise "Task #{task.urn} #{task.operation} completed unsuccessfully"
138
+ end
139
+ end
140
+ task
141
+ end
142
+
143
+ def wait_entity(entity, accept_failure = false)
144
+ entity.running_tasks.each do |task|
145
+ wait_task task, accept_failure
146
+ end if entity.running_tasks && !entity.running_tasks.empty?
147
+
148
+ entity = reload entity
149
+
150
+ # verify all tasks succeeded
151
+ unless accept_failure || entity.tasks.nil? || entity.tasks.empty?
152
+ failed_tasks = entity.tasks.find_all { |task| task.status.downcase != VCloudSdk::Xml::TASK_STATUS[:SUCCESS] }
153
+ unless failed_tasks.empty?
154
+ @logger.error "Failed tasks: #{failed_tasks}"
155
+ raise "Some tasks failed"
156
+ end
157
+ end
158
+
159
+ entity
160
+ end
161
+
162
+ def timed_loop(raise_exception = true)
163
+ start_time = Time.now
164
+ while Time.now - start_time < @wait_max
165
+ yield
166
+ sleep @wait_delay
167
+ end
168
+ raise TimeoutError if raise_exception
169
+ end
170
+
171
+ def flush_cache
172
+ @cache.clear
173
+ end
174
+
175
+ private
176
+
177
+ WAIT_MAX = 300 # maximum wait seconds for a single task
178
+ WAIT_DELAY = 5 # delay in seconds for pooling next task status
179
+ COOKIE_TIMEOUT = 600 # default timeout in seconds, if not specified in configuration file, after which session must be re-created
180
+ RETRY_MAX = 3 # maximum attempts
181
+ RETRY_DELAY = 100 # delay of first retry, the next is * 2
182
+
183
+ def cookie_available?
184
+ @cookie && Time.now < @cookie_expiration
185
+ end
186
+
187
+ def login_url
188
+ return @login_url if @login_url
189
+ default_login_url = '/api/sessions'
190
+
191
+ begin
192
+ response = send_request :get, '/api/versions'
193
+ url_node = wrap_response(response)
194
+ if url_node.nil?
195
+ @logger.warn "Unable to find version=#{VCLOUD_VERSION_NUMBER}. Default to #{default_login_url}"
196
+ @login_url = default_login_url
197
+ else
198
+ @login_url = url_node.login_url.content
199
+ end
200
+ rescue => ex
201
+ @logger.warn %Q{
202
+ Caught exception when retrieving login url:
203
+ #{ex.to_s}"
204
+
205
+ Default to #{default_login_url}
206
+ }
207
+
208
+ @login_url = default_login_url
209
+ end
210
+ end
211
+
212
+ def send_request(method, path, options = {})
213
+ path = path.href unless path.is_a?(String)
214
+
215
+ params = {
216
+ :method => method,
217
+ :url => if path.start_with?('/')
218
+ @url + path
219
+ else
220
+ path
221
+ end,
222
+ :headers => {
223
+ :Accept => "application/*+xml;version=#{VCLOUD_VERSION_NUMBER}",
224
+ :content_type => '*/*'
225
+ }
226
+ }
227
+ params[:headers][:x_vcloud_authorization] = @auth_token if !options[:login] && @auth_token
228
+ params[:cookies] = @cookie if !options[:login] && cookie_available?
229
+ params[:payload] = options[:payload].to_s if options[:payload]
230
+ params[:headers].merge! options[:headers] if options[:headers]
231
+ response = retry_for_network_issue do
232
+ @logger.debug "REST REQ #{method.to_s.upcase} #{params[:url]} #{params[:headers].inspect} #{params[:cookies].inspect} #{params[:payload]}"
233
+ RestClient::Request.execute params do |response, request, result, &block|
234
+ @logger.debug "REST RES #{response.code} #{response.headers.inspect} #{response.body}"
235
+ response.return! request, result, &block
236
+ end
237
+ end
238
+ end
239
+
240
+ def session
241
+ unless cookie_available?
242
+ auth = "#{@user}@#{@entities['organization']}:#{@pass}"
243
+ auth_header = "Basic #{Base64.encode64(auth)}"
244
+ response = send_request :post, login_url,
245
+ :headers => { :Authorization => auth_header, :content_type => 'application/x-www-form-urlencoded' },
246
+ :payload => URI.encode_www_form({ :Authorization => auth_header, :Accept => "application/*+xml;version=#{VCLOUD_VERSION_NUMBER}" }),
247
+ :with_response => true
248
+
249
+ @auth_token = response.headers[:x_vcloud_authorization]
250
+ @cookie = response.cookies
251
+ @cookie_expiration = Time.now + @cookie_timeout
252
+ @session = wrap_response(response)
253
+
254
+ flush_cache
255
+ @entity_resolver_link = @session.entity_resolver
256
+ @org_link = @session.org_link @entities['organization']
257
+ end
258
+ @session
259
+ end
260
+
261
+ def wrap_response(response)
262
+ VCloudSdk::Xml::WrapperFactory.wrap_document response
263
+ end
264
+
265
+ def retry_for_network_issue
266
+ retries = 0
267
+ delay = @retry_delay
268
+ result = nil
269
+ loop do
270
+ begin
271
+ result = yield
272
+ break
273
+ rescue RestClient::Exception => ex
274
+ raise ex if retries >= @retry_max
275
+ @logger.error "RestClient exception (retry after #{delay}ms): #{ex}"
276
+ sleep(delay / 1000)
277
+ delay *= 2
278
+ retries += 1
279
+ end
280
+ end
281
+ result
282
+ end
283
+ end
284
+ end
@@ -2,7 +2,7 @@ module Bosh
2
2
  module Clouds
3
3
 
4
4
  class VCloud
5
- VERSION = "0.4.9"
5
+ VERSION = '1.5.0.pre.3'
6
6
  end
7
7
 
8
8
  end