ruby_vcloud_sdk 0.4.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (319) hide show
  1. data/README +1 -0
  2. data/Rakefile +50 -0
  3. data/lib/ruby_vcloud_sdk.rb +19 -0
  4. data/lib/ruby_vcloud_sdk/client.rb +899 -0
  5. data/lib/ruby_vcloud_sdk/config.rb +17 -0
  6. data/lib/ruby_vcloud_sdk/connection/connection.rb +163 -0
  7. data/lib/ruby_vcloud_sdk/connection/file_uploader.rb +43 -0
  8. data/lib/ruby_vcloud_sdk/errors.rb +21 -0
  9. data/lib/ruby_vcloud_sdk/ovf_directory.rb +45 -0
  10. data/lib/ruby_vcloud_sdk/util.rb +21 -0
  11. data/lib/ruby_vcloud_sdk/version.rb +3 -0
  12. data/lib/ruby_vcloud_sdk/xml/constants.rb +427 -0
  13. data/lib/ruby_vcloud_sdk/xml/wrapper.rb +242 -0
  14. data/lib/ruby_vcloud_sdk/xml/wrapper_classes.rb +3 -0
  15. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/admin_catalog.rb +20 -0
  16. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/admin_org.rb +15 -0
  17. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/catalog_item.rb +27 -0
  18. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/disk.rb +40 -0
  19. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/disk_attach_or_detach_params.rb +12 -0
  20. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/disk_create_params.rb +47 -0
  21. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/entity.rb +11 -0
  22. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/file.rb +11 -0
  23. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/hard_disk_item_wrapper.rb +50 -0
  24. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/instantiate_vapp_template_params.rb +71 -0
  25. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/ip_scope.rb +55 -0
  26. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/item.rb +32 -0
  27. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/media.rb +53 -0
  28. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/media_insert_or_eject_params.rb +17 -0
  29. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/metadata_value.rb +15 -0
  30. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/network.rb +15 -0
  31. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/network_config.rb +27 -0
  32. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/network_config_section.rb +25 -0
  33. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/network_connection.rb +71 -0
  34. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/network_connection_section.rb +67 -0
  35. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/nic_item_wrapper.rb +91 -0
  36. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/org_network.rb +19 -0
  37. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/org_vdc_network.rb +11 -0
  38. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/session.rb +17 -0
  39. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/task.rb +32 -0
  40. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/upload_vapp_template_params.rb +11 -0
  41. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vapp.rb +55 -0
  42. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vapp_template.rb +19 -0
  43. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vcloud.rb +15 -0
  44. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vdc.rb +54 -0
  45. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vdc_storage_profile.rb +15 -0
  46. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/virtual_hardware_section.rb +68 -0
  47. data/lib/ruby_vcloud_sdk/xml/wrapper_classes/vm.rb +179 -0
  48. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminAllocatedExtIpRecord.xml +1 -0
  49. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminCatalog.xml +1 -0
  50. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminCatalogItemRecord.xml +1 -0
  51. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminCatalogRecord.xml +1 -0
  52. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminGroupRecord.xml +1 -0
  53. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminMediaRecord.xml +1 -0
  54. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminOrg.xml +1 -0
  55. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminOrgNetworkRecord.xml +1 -0
  56. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminShadowVmRecord.xml +1 -0
  57. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminTaskRecord.xml +1 -0
  58. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminUserRecord.xml +1 -0
  59. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminVAppNetworkRecord.xml +1 -0
  60. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminVAppRecord.xml +1 -0
  61. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminVAppReference.xml +1 -0
  62. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminVAppReferences.xml +1 -0
  63. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminVAppTemplateRecord.xml +1 -0
  64. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminVdc.xml +1 -0
  65. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminVdcRecord.xml +1 -0
  66. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminVdcReference.xml +1 -0
  67. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminVdcReferences.xml +1 -0
  68. data/lib/ruby_vcloud_sdk/xml/xml_templates/AdminVmRecord.xml +1 -0
  69. data/lib/ruby_vcloud_sdk/xml/xml_templates/AllEULAsAccepted.xml +1 -0
  70. data/lib/ruby_vcloud_sdk/xml/xml_templates/AllocatedExtIpRecord.xml +1 -0
  71. data/lib/ruby_vcloud_sdk/xml/xml_templates/BlockingTaskRecord.xml +1 -0
  72. data/lib/ruby_vcloud_sdk/xml/xml_templates/BlockingTaskReference.xml +1 -0
  73. data/lib/ruby_vcloud_sdk/xml/xml_templates/BlockingTaskReferences.xml +1 -0
  74. data/lib/ruby_vcloud_sdk/xml/xml_templates/CaptureVAppParams.xml +1 -0
  75. data/lib/ruby_vcloud_sdk/xml/xml_templates/Catalog.xml +1 -0
  76. data/lib/ruby_vcloud_sdk/xml/xml_templates/CatalogItem.xml +1 -0
  77. data/lib/ruby_vcloud_sdk/xml/xml_templates/CatalogItemRecord.xml +1 -0
  78. data/lib/ruby_vcloud_sdk/xml/xml_templates/CatalogItemReference.xml +1 -0
  79. data/lib/ruby_vcloud_sdk/xml/xml_templates/CatalogItemReferences.xml +1 -0
  80. data/lib/ruby_vcloud_sdk/xml/xml_templates/CatalogRecord.xml +1 -0
  81. data/lib/ruby_vcloud_sdk/xml/xml_templates/CatalogReference.xml +1 -0
  82. data/lib/ruby_vcloud_sdk/xml/xml_templates/CatalogReferences.xml +1 -0
  83. data/lib/ruby_vcloud_sdk/xml/xml_templates/CellRecord.xml +1 -0
  84. data/lib/ruby_vcloud_sdk/xml/xml_templates/CloneMediaParams.xml +1 -0
  85. data/lib/ruby_vcloud_sdk/xml/xml_templates/CloneVAppParams.xml +1 -0
  86. data/lib/ruby_vcloud_sdk/xml/xml_templates/CloneVAppTemplateParams.xml +1 -0
  87. data/lib/ruby_vcloud_sdk/xml/xml_templates/ComposeVAppParams.xml +1 -0
  88. data/lib/ruby_vcloud_sdk/xml/xml_templates/ControlAccessParams.xml +1 -0
  89. data/lib/ruby_vcloud_sdk/xml/xml_templates/CustomizationSection.xml +1 -0
  90. data/lib/ruby_vcloud_sdk/xml/xml_templates/DatastoreProviderVdcRelationRecord.xml +1 -0
  91. data/lib/ruby_vcloud_sdk/xml/xml_templates/DatastoreRecord.xml +1 -0
  92. data/lib/ruby_vcloud_sdk/xml/xml_templates/DatastoreReference.xml +1 -0
  93. data/lib/ruby_vcloud_sdk/xml/xml_templates/DatastoreReferences.xml +1 -0
  94. data/lib/ruby_vcloud_sdk/xml/xml_templates/DeployVAppParams.xml +1 -0
  95. data/lib/ruby_vcloud_sdk/xml/xml_templates/DhcpService.xml +1 -0
  96. data/lib/ruby_vcloud_sdk/xml/xml_templates/DiskAttachOrDetachParams.xml +5 -0
  97. data/lib/ruby_vcloud_sdk/xml/xml_templates/DiskCreateParams.xml +9 -0
  98. data/lib/ruby_vcloud_sdk/xml/xml_templates/DvSwitchRecord.xml +1 -0
  99. data/lib/ruby_vcloud_sdk/xml/xml_templates/Entity.xml +1 -0
  100. data/lib/ruby_vcloud_sdk/xml/xml_templates/Error.xml +1 -0
  101. data/lib/ruby_vcloud_sdk/xml/xml_templates/EventRecord.xml +1 -0
  102. data/lib/ruby_vcloud_sdk/xml/xml_templates/ExternalNetwork.xml +1 -0
  103. data/lib/ruby_vcloud_sdk/xml/xml_templates/File.xml +1 -0
  104. data/lib/ruby_vcloud_sdk/xml/xml_templates/FirewallService.xml +1 -0
  105. data/lib/ruby_vcloud_sdk/xml/xml_templates/GeneralOrgSettings.xml +1 -0
  106. data/lib/ruby_vcloud_sdk/xml/xml_templates/Group.xml +1 -0
  107. data/lib/ruby_vcloud_sdk/xml/xml_templates/GroupRecord.xml +1 -0
  108. data/lib/ruby_vcloud_sdk/xml/xml_templates/GroupReference.xml +1 -0
  109. data/lib/ruby_vcloud_sdk/xml/xml_templates/GroupReferences.xml +1 -0
  110. data/lib/ruby_vcloud_sdk/xml/xml_templates/GuestCustomizationSection.xml +1 -0
  111. data/lib/ruby_vcloud_sdk/xml/xml_templates/HostRecord.xml +1 -0
  112. data/lib/ruby_vcloud_sdk/xml/xml_templates/HostReference.xml +1 -0
  113. data/lib/ruby_vcloud_sdk/xml/xml_templates/HostReferences.xml +1 -0
  114. data/lib/ruby_vcloud_sdk/xml/xml_templates/InstantiateOvfParams.xml +1 -0
  115. data/lib/ruby_vcloud_sdk/xml/xml_templates/InstantiateVAppTemplateParams.xml +1 -0
  116. data/lib/ruby_vcloud_sdk/xml/xml_templates/IpScope.xml +12 -0
  117. data/lib/ruby_vcloud_sdk/xml/xml_templates/IpsecVpnLocalPeer.xml +1 -0
  118. data/lib/ruby_vcloud_sdk/xml/xml_templates/IpsecVpnPeer.xml +1 -0
  119. data/lib/ruby_vcloud_sdk/xml/xml_templates/IpsecVpnRemotePeer.xml +1 -0
  120. data/lib/ruby_vcloud_sdk/xml/xml_templates/IpsecVpnService.xml +1 -0
  121. data/lib/ruby_vcloud_sdk/xml/xml_templates/IpsecVpnThirdPartyPeer.xml +1 -0
  122. data/lib/ruby_vcloud_sdk/xml/xml_templates/Item.xml +3 -0
  123. data/lib/ruby_vcloud_sdk/xml/xml_templates/ItemVcd.xml +5 -0
  124. data/lib/ruby_vcloud_sdk/xml/xml_templates/LeaseSettingsSection.xml +1 -0
  125. data/lib/ruby_vcloud_sdk/xml/xml_templates/Link.xml +1 -0
  126. data/lib/ruby_vcloud_sdk/xml/xml_templates/Media.xml +6 -0
  127. data/lib/ruby_vcloud_sdk/xml/xml_templates/MediaInsertOrEjectParams.xml +4 -0
  128. data/lib/ruby_vcloud_sdk/xml/xml_templates/MediaRecord.xml +1 -0
  129. data/lib/ruby_vcloud_sdk/xml/xml_templates/MediaReference.xml +1 -0
  130. data/lib/ruby_vcloud_sdk/xml/xml_templates/MediaReferences.xml +1 -0
  131. data/lib/ruby_vcloud_sdk/xml/xml_templates/Metadata.xml +5 -0
  132. data/lib/ruby_vcloud_sdk/xml/xml_templates/MetadataEntry.xml +7 -0
  133. data/lib/ruby_vcloud_sdk/xml/xml_templates/MetadataValue.xml +8 -0
  134. data/lib/ruby_vcloud_sdk/xml/xml_templates/NatService.xml +1 -0
  135. data/lib/ruby_vcloud_sdk/xml/xml_templates/Network.xml +4 -0
  136. data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkAssignment.xml +1 -0
  137. data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkConfig.xml +21 -0
  138. data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkConfigSection.xml +1 -0
  139. data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkConnection.xml +11 -0
  140. data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkConnectionSection.xml +1 -0
  141. data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkPoolRecord.xml +1 -0
  142. data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkPoolReference.xml +1 -0
  143. data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkPoolReferences.xml +1 -0
  144. data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkRecord.xml +1 -0
  145. data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkReference.xml +1 -0
  146. data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkReferences.xml +1 -0
  147. data/lib/ruby_vcloud_sdk/xml/xml_templates/NetworkService.xml +1 -0
  148. data/lib/ruby_vcloud_sdk/xml/xml_templates/Org.xml +1 -0
  149. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgEmailSettings.xml +1 -0
  150. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgList.xml +1 -0
  151. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgNetwork.xml +1 -0
  152. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgNetworkRecord.xml +1 -0
  153. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgNetworkReference.xml +1 -0
  154. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgNetworkReferences.xml +1 -0
  155. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgPasswordPolicySettings.xml +1 -0
  156. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgRecord.xml +1 -0
  157. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgReference.xml +1 -0
  158. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgReferences.xml +1 -0
  159. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgSettings.xml +1 -0
  160. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgVAppTemplateLeaseSettings.xml +1 -0
  161. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgVdcNetwork.xml +1 -0
  162. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgVdcRecord.xml +1 -0
  163. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgVdcReference.xml +1 -0
  164. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgVdcReferences.xml +1 -0
  165. data/lib/ruby_vcloud_sdk/xml/xml_templates/OrgVdcResourcePoolRelationRecord.xml +1 -0
  166. data/lib/ruby_vcloud_sdk/xml/xml_templates/Owner.xml +1 -0
  167. data/lib/ruby_vcloud_sdk/xml/xml_templates/PortgroupRecord.xml +1 -0
  168. data/lib/ruby_vcloud_sdk/xml/xml_templates/ProductSectionList.xml +1 -0
  169. data/lib/ruby_vcloud_sdk/xml/xml_templates/ProviderVdc.xml +1 -0
  170. data/lib/ruby_vcloud_sdk/xml/xml_templates/ProviderVdcResourcePoolRelationRecord.xml +1 -0
  171. data/lib/ruby_vcloud_sdk/xml/xml_templates/PublishCatalogParams.xml +1 -0
  172. data/lib/ruby_vcloud_sdk/xml/xml_templates/QueryList.xml +1 -0
  173. data/lib/ruby_vcloud_sdk/xml/xml_templates/QueryResultRecords.xml +1 -0
  174. data/lib/ruby_vcloud_sdk/xml/xml_templates/RasdItemsList.xml +1 -0
  175. data/lib/ruby_vcloud_sdk/xml/xml_templates/RecomposeVAppParams.xml +1 -0
  176. data/lib/ruby_vcloud_sdk/xml/xml_templates/Record.xml +1 -0
  177. data/lib/ruby_vcloud_sdk/xml/xml_templates/Reference.xml +1 -0
  178. data/lib/ruby_vcloud_sdk/xml/xml_templates/References.xml +1 -0
  179. data/lib/ruby_vcloud_sdk/xml/xml_templates/RelocateParams.xml +1 -0
  180. data/lib/ruby_vcloud_sdk/xml/xml_templates/ResourceEntity.xml +1 -0
  181. data/lib/ruby_vcloud_sdk/xml/xml_templates/ResourcePoolRecord.xml +1 -0
  182. data/lib/ruby_vcloud_sdk/xml/xml_templates/Right.xml +1 -0
  183. data/lib/ruby_vcloud_sdk/xml/xml_templates/RightRecord.xml +1 -0
  184. data/lib/ruby_vcloud_sdk/xml/xml_templates/RightReference.xml +1 -0
  185. data/lib/ruby_vcloud_sdk/xml/xml_templates/RightReferences.xml +1 -0
  186. data/lib/ruby_vcloud_sdk/xml/xml_templates/Role.xml +1 -0
  187. data/lib/ruby_vcloud_sdk/xml/xml_templates/RoleRecord.xml +1 -0
  188. data/lib/ruby_vcloud_sdk/xml/xml_templates/RoleReference.xml +1 -0
  189. data/lib/ruby_vcloud_sdk/xml/xml_templates/RoleReferences.xml +1 -0
  190. data/lib/ruby_vcloud_sdk/xml/xml_templates/RuntimeInfoSection.xml +1 -0
  191. data/lib/ruby_vcloud_sdk/xml/xml_templates/ScreenTicket.xml +1 -0
  192. data/lib/ruby_vcloud_sdk/xml/xml_templates/Session.xml +1 -0
  193. data/lib/ruby_vcloud_sdk/xml/xml_templates/ShadowVMReferences.xml +1 -0
  194. data/lib/ruby_vcloud_sdk/xml/xml_templates/StaticRoutingService.xml +1 -0
  195. data/lib/ruby_vcloud_sdk/xml/xml_templates/StrandedUserRecord.xml +1 -0
  196. data/lib/ruby_vcloud_sdk/xml/xml_templates/Task.xml +0 -0
  197. data/lib/ruby_vcloud_sdk/xml/xml_templates/TaskRecord.xml +1 -0
  198. data/lib/ruby_vcloud_sdk/xml/xml_templates/TaskReference.xml +1 -0
  199. data/lib/ruby_vcloud_sdk/xml/xml_templates/TaskReferences.xml +1 -0
  200. data/lib/ruby_vcloud_sdk/xml/xml_templates/TasksList.xml +1 -0
  201. data/lib/ruby_vcloud_sdk/xml/xml_templates/UndeployVAppParams.xml +1 -0
  202. data/lib/ruby_vcloud_sdk/xml/xml_templates/UploadVAppTemplateParams.xml +1 -0
  203. data/lib/ruby_vcloud_sdk/xml/xml_templates/User.xml +1 -0
  204. data/lib/ruby_vcloud_sdk/xml/xml_templates/UserRecord.xml +1 -0
  205. data/lib/ruby_vcloud_sdk/xml/xml_templates/UserReference.xml +1 -0
  206. data/lib/ruby_vcloud_sdk/xml/xml_templates/UserReferences.xml +1 -0
  207. data/lib/ruby_vcloud_sdk/xml/xml_templates/VApp.xml +1 -0
  208. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppLeaseSettings.xml +1 -0
  209. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppNetwork.xml +1 -0
  210. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppNetworkRecord.xml +1 -0
  211. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppNetworkReference.xml +1 -0
  212. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppNetworkReferences.xml +1 -0
  213. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppOrgNetworkRelationRecord.xml +1 -0
  214. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppOrgNetworkRelationReference.xml +1 -0
  215. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppOrgNetworkRelationReferences.xml +1 -0
  216. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppRecord.xml +1 -0
  217. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppReference.xml +1 -0
  218. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppReferences.xml +1 -0
  219. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppTemplate.xml +1 -0
  220. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppTemplateRecord.xml +1 -0
  221. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppTemplateReference.xml +1 -0
  222. data/lib/ruby_vcloud_sdk/xml/xml_templates/VAppTemplateReferences.xml +1 -0
  223. data/lib/ruby_vcloud_sdk/xml/xml_templates/VCloud.xml +1 -0
  224. data/lib/ruby_vcloud_sdk/xml/xml_templates/VMRecord.xml +1 -0
  225. data/lib/ruby_vcloud_sdk/xml/xml_templates/VMReference.xml +1 -0
  226. data/lib/ruby_vcloud_sdk/xml/xml_templates/VMReferences.xml +1 -0
  227. data/lib/ruby_vcloud_sdk/xml/xml_templates/VMWProviderVdcRecord.xml +1 -0
  228. data/lib/ruby_vcloud_sdk/xml/xml_templates/VMWProviderVdcReference.xml +1 -0
  229. data/lib/ruby_vcloud_sdk/xml/xml_templates/VMWProviderVdcReferences.xml +1 -0
  230. data/lib/ruby_vcloud_sdk/xml/xml_templates/Vdc.xml +1 -0
  231. data/lib/ruby_vcloud_sdk/xml/xml_templates/VdcReferences.xml +1 -0
  232. data/lib/ruby_vcloud_sdk/xml/xml_templates/VdcStorageProfile.xml +1 -0
  233. data/lib/ruby_vcloud_sdk/xml/xml_templates/VirtualCenterRecord.xml +1 -0
  234. data/lib/ruby_vcloud_sdk/xml/xml_templates/VirtualCenterReference.xml +1 -0
  235. data/lib/ruby_vcloud_sdk/xml/xml_templates/VirtualCenterReferences.xml +1 -0
  236. data/lib/ruby_vcloud_sdk/xml/xml_templates/Vm.xml +1 -0
  237. data/lib/ruby_vcloud_sdk/xml/xml_templates/VmPendingQuestion.xml +1 -0
  238. data/lib/ruby_vcloud_sdk/xml/xml_templates/VmQuestionAnswer.xml +1 -0
  239. data/lib/ruby_vcloud_sdk/xml/xml_templates/generate_dictionary.rb +8 -0
  240. data/spec/assets/admin_org_response.xml +75 -0
  241. data/spec/assets/catalog_add_item_response.xml +8 -0
  242. data/spec/assets/catalog_add_vapp_request.xml +5 -0
  243. data/spec/assets/catalog_item_added_response.xml +19 -0
  244. data/spec/assets/catalog_response.xml +19 -0
  245. data/spec/assets/existing_media_busy_response.xml +19 -0
  246. data/spec/assets/existing_media_catalog_item.xml +8 -0
  247. data/spec/assets/existing_media_delete_task_done.xml +6 -0
  248. data/spec/assets/existing_media_done_response.xml +11 -0
  249. data/spec/assets/existing_vapp_resolver_response.xml +3 -0
  250. data/spec/assets/existing_vapp_template_catalog_resolver_response.xml +3 -0
  251. data/spec/assets/existing_vapp_template_instantiate_response.xml +20 -0
  252. data/spec/assets/existing_vapp_template_instantiate_task_error_response.xml +7 -0
  253. data/spec/assets/existing_vapp_template_instantiate_task_start_response.xml +7 -0
  254. data/spec/assets/existing_vapp_template_instantiate_task_success_response.xml +7 -0
  255. data/spec/assets/existing_vapp_template_item_response.xml +8 -0
  256. data/spec/assets/existing_vapp_template_ready_response.xml +79 -0
  257. data/spec/assets/finalize_upload_task_done_response.xml +7 -0
  258. data/spec/assets/finalize_upload_task_response.xml +7 -0
  259. data/spec/assets/indy_disk_attach_request.xml +3 -0
  260. data/spec/assets/indy_disk_attach_task.xml +6 -0
  261. data/spec/assets/indy_disk_attach_task_error.xml +6 -0
  262. data/spec/assets/indy_disk_create_error.xml +1 -0
  263. data/spec/assets/indy_disk_create_request.xml +4 -0
  264. data/spec/assets/indy_disk_create_response.xml +19 -0
  265. data/spec/assets/indy_disk_delete_task.xml +6 -0
  266. data/spec/assets/indy_disk_detach_request.xml +3 -0
  267. data/spec/assets/indy_disk_detach_task.xml +6 -0
  268. data/spec/assets/indy_disk_response.xml +11 -0
  269. data/spec/assets/instantiated_suspended_vapp_response.xml +209 -0
  270. data/spec/assets/instantiated_vapp_delelete_done_task.xml +5 -0
  271. data/spec/assets/instantiated_vapp_delelete_running_task.xml +6 -0
  272. data/spec/assets/instantiated_vapp_network_config_add_network_request.xml +36 -0
  273. data/spec/assets/instantiated_vapp_network_config_modify_network_task_success.xml +6 -0
  274. data/spec/assets/instantiated_vapp_network_config_remove_network_request.xml +6 -0
  275. data/spec/assets/instantiated_vapp_network_config_section_response.xml +17 -0
  276. data/spec/assets/instantiated_vapp_off_response.xml +206 -0
  277. data/spec/assets/instantiated_vapp_on_response.xml +205 -0
  278. data/spec/assets/instantiated_vapp_power_task_running.xml +6 -0
  279. data/spec/assets/instantiated_vapp_power_task_success.xml +6 -0
  280. data/spec/assets/instantiated_vapp_response.xml +205 -0
  281. data/spec/assets/instantiated_vm_change_task_running.xml +6 -0
  282. data/spec/assets/instantiated_vm_change_task_success.xml +6 -0
  283. data/spec/assets/instantiated_vm_cpu_response.xml +11 -0
  284. data/spec/assets/instantiated_vm_insert_media_task_done.xml +6 -0
  285. data/spec/assets/instantiated_vm_memory_response.xml +11 -0
  286. data/spec/assets/instantiated_vm_modify_task_running.xml +6 -0
  287. data/spec/assets/instantiated_vm_modify_task_success.xml +5 -0
  288. data/spec/assets/instantiated_vm_network_section_response.xml +11 -0
  289. data/spec/assets/instantiated_vm_response.xml +149 -0
  290. data/spec/assets/media_add_to_catalog_request.xml +5 -0
  291. data/spec/assets/media_add_to_catalog_response.xml +8 -0
  292. data/spec/assets/media_delete_task_done.xml +6 -0
  293. data/spec/assets/media_upload_pending_response.xml +13 -0
  294. data/spec/assets/media_upload_request.xml +2 -0
  295. data/spec/assets/metadata_set_request.xml +3 -0
  296. data/spec/assets/metadata_set_task_done.xml +6 -0
  297. data/spec/assets/org_network_response.xml +22 -0
  298. data/spec/assets/reconfigure_vm_request.xml +133 -0
  299. data/spec/assets/reconfigure_vm_task.xml +8 -0
  300. data/spec/assets/session.xml +7 -0
  301. data/spec/assets/test-config.yml +38 -0
  302. data/spec/assets/undeploy_params.xml +1 -0
  303. data/spec/assets/vapp_template_catalog_resolver_response.xml +3 -0
  304. data/spec/assets/vapp_template_delelete_done_task.xml +5 -0
  305. data/spec/assets/vapp_template_delelete_running_task.xml +6 -0
  306. data/spec/assets/vapp_template_instantiate_request.xml +8 -0
  307. data/spec/assets/vapp_template_instantiate_with_locality_request.xml +14 -0
  308. data/spec/assets/vapp_template_no_disk_response.xml +27 -0
  309. data/spec/assets/vapp_template_ready_response.xml +79 -0
  310. data/spec/assets/vapp_template_upload_complete.xml +28 -0
  311. data/spec/assets/vapp_template_upload_failed.xml +28 -0
  312. data/spec/assets/vapp_template_upload_request.xml +4 -0
  313. data/spec/assets/vapp_template_upload_response.xml +25 -0
  314. data/spec/assets/vcloud_response.xml +56 -0
  315. data/spec/assets/vdc_response.xml +57 -0
  316. data/spec/spec_helper.rb +107 -0
  317. data/spec/unit/client_response.rb +700 -0
  318. data/spec/unit/client_spec.rb +1152 -0
  319. metadata +498 -0
@@ -0,0 +1,1152 @@
1
+ require "spec_helper"
2
+ require "client_response"
3
+ require "stringio"
4
+ require "logger"
5
+ require "nokogiri/diff"
6
+
7
+ module VCloudSdk
8
+ vcd = VCloudSdk::Test::vcd_settings
9
+ logger = Config.logger
10
+
11
+ Config.configure({"logger" => logger,
12
+ "rest_logger" =>VCloudSdk::Test::rest_logger(logger),
13
+ "rest_throttle" => vcd["control"]["rest_throttle"]})
14
+
15
+ describe Client, :min, :all do
16
+ let(:url) { vcd["url"] }
17
+ let(:username) { vcd["user"] }
18
+ let(:password) { vcd["password"] }
19
+ let(:control) { vcd["control"] }
20
+ let(:entities) { vcd["entities"] }
21
+ let(:auth_cookies) { {"vcloud-token" => vcd["testing"]["cookies"]} }
22
+
23
+ def mock_rest_connection
24
+ @upload_file_state = "success"
25
+ current_vapp_state = "nothing"
26
+ finalize_vapp_task_state = "running"
27
+ delete_vapp_template_task_state = "running"
28
+ delete_vapp_task_state = "running"
29
+ change_vm_task_state = "running"
30
+ catalog_state = "not_added"
31
+ template_instantiate_state = "running"
32
+ vapp_power_state = "off"
33
+ existing_media_state = "busy"
34
+ metadata_value = ""
35
+ metadata_xml = ""
36
+ rest_client = mock("Rest Client")
37
+ response_mapping = {
38
+ :get => {
39
+ Test::Response::ADMIN_VCLOUD_LINK => lambda {
40
+ |url, headers| Test::Response::VCLOUD_RESPONSE },
41
+ Test::Response::ADMIN_ORG_LINK => lambda {
42
+ |url, headers| Test::Response::ADMIN_ORG_RESPONSE },
43
+ Test::Response::VDC_LINK => lambda {
44
+ |url, headers| Test::Response::VDC_RESPONSE },
45
+ Test::Response::CATALOG_LINK => lambda { |url, headers|
46
+ case (catalog_state)
47
+ when "not_added"
48
+ Test::Response::CATALOG_RESPONSE
49
+ when "added"
50
+ Test::Response::CATALOG_ITEM_ADDED_RESPONSE
51
+ end
52
+ },
53
+ Test::Response::CATALOG_ITEM_VAPP_LINK => lambda {
54
+ |url, headers| Test::Response::CATALOG_ADD_ITEM_RESPONSE
55
+ },
56
+ Test::Response::VAPP_TEMPLATE_LINK => lambda { |url, headers|
57
+ case (current_vapp_state)
58
+ when "ovf_uploaded"
59
+ Test::Response::VAPP_TEMPLATE_NO_DISKS_RESPONSE
60
+ when "nothing"
61
+ Test::Response::VAPP_TEMPLATE_UPLOAD_OVF_WAITING_RESPONSE
62
+ when "disks_uploaded"
63
+ Test::Response::VAPP_TEMPLATE_UPLOAD_COMPLETE
64
+ when "disks_upload_failed"
65
+ Test::Response::VAPP_TEMPLATE_UPLOAD_FAILED
66
+ when "finalized"
67
+ Test::Response::VAPP_TEMPLATE_READY_RESPONSE
68
+ end
69
+ },
70
+ Test::Response::FINALIZE_UPLOAD_TASK_LINK => lambda {
71
+ |url, headers|
72
+ case (finalize_vapp_task_state)
73
+ when "running"
74
+ finalize_vapp_task_state = "success"
75
+ current_vapp_state = "finalized"
76
+ Test::Response::FINALIZE_UPLOAD_TASK_RESPONSE
77
+ when "success"
78
+ Test::Response::FINALIZE_UPLOAD_TASK_DONE_RESPONSE
79
+ end
80
+ },
81
+ Test::Response::VAPP_TEMPLATE_DELETE_TASK_LINK => lambda {
82
+ |url, headers|
83
+ case (delete_vapp_template_task_state)
84
+ when "running"
85
+ delete_vapp_template_task_state = "success"
86
+ Test::Response::VAPP_TEMPLATE_DELETE_RUNNING_TASK
87
+ when "success"
88
+ Test::Response::VAPP_TEMPLATE_DELETE_DONE_TASK
89
+ end
90
+ },
91
+ Test::Response::EXISTING_VAPP_TEMPLATE_CATALOG_ITEM_LINK =>
92
+ lambda { |url, headers|
93
+ Test::Response::EXISTING_VAPP_TEMPLATE_CATALOG_ITEM_RESPONSE
94
+ },
95
+ Test::Response::EXISTING_VAPP_TEMPLATE_LINK => lambda {
96
+ |url, headers|
97
+ Test::Response::EXISTING_VAPP_TEMPLATE_READY_RESPONSE
98
+ },
99
+ Test::Response::EXISTING_VAPP_TEMPLATE_INSTANTIATE_TASK_LINK =>
100
+ lambda { |url, headers|
101
+ case (template_instantiate_state)
102
+ when "running"
103
+ template_instantiate_state = "success"
104
+ Test::Response::
105
+ EXISTING_VAPP_TEMPLATE_INSTANTIATE_TASK_START_RESPONSE
106
+ when "success"
107
+ Test::Response::
108
+ EXISTING_VAPP_TEMPLATE_INSTANTIATE_TASK_SUCCESS_RESPONSE
109
+ end
110
+ },
111
+ Test::Response::INSTANTIATED_VAPP_LINK => lambda {
112
+ |url, headers|
113
+ case(vapp_power_state)
114
+ when "off"
115
+ Test::Response::INSTANTIAED_VAPP_RESPONSE
116
+ when "on"
117
+ Test::Response::INSTANTIAED_VAPP_ON_RESPONSE
118
+ when "powered-off"
119
+ Test::Response::INSTANTIAED_VAPP_POWERED_OFF_RESPONSE
120
+ when "suspended"
121
+ Test::Response::INSTANTIATED_SUSPENDED_VAPP_RESPONSE
122
+ end
123
+ },
124
+ Test::Response::INSTANTIATED_VAPP_DELETE_TASK_LINK => lambda {
125
+ |url, headers|
126
+ case (delete_vapp_task_state)
127
+ when "running"
128
+ delete_vapp_task_state = "success"
129
+ Test::Response::INSTANTIATED_VAPP_DELETE_RUNNING_TASK
130
+ when "success"
131
+ Test::Response::INSTANTIATED_VAPP_DELETE_DONE_TASK
132
+ end
133
+ },
134
+ Test::Response::INSTANTIATED_VM_LINK => lambda { |url, headers|
135
+ Test::Response::INSTANTIATED_VM_RESPONSE
136
+ },
137
+ Test::Response::INSTANTIATED_VM_CPU_LINK => lambda {
138
+ |url, headers| Test::Response::INSTANTIATED_VM_CPU_RESPONSE
139
+ },
140
+ Test::Response::INSTANTIATED_VM_MEMORY_LINK => lambda {
141
+ |url, headers| Test::Response::INSTANTIATED_VM_MEMORY_RESPONSE
142
+ },
143
+ Test::Response::INSTANTIATED_VM_MODIFY_TASK_LINK => lambda {
144
+ |url, headers|
145
+ case(change_vm_task_state)
146
+ when "running"
147
+ change_vm_task_state = "success"
148
+ Test::Response::INSTANTIATED_VM_MODIFY_TASK_RUNNING
149
+ when "success"
150
+ Test::Response::INSTANTIATED_VM_MODIFY_TASK_SUCCESS
151
+ end
152
+ },
153
+ Test::Response::EXISTING_VAPP_LINK => lambda { |url, headers|
154
+ Test::Response::INSTANTIAED_VAPP_RESPONSE
155
+ },
156
+ Test::Response::INSTANTIATED_VAPP_POWER_ON_TASK_LINK => lambda {
157
+ |url, headers|
158
+ Test::Response::INSTANTED_VAPP_POWER_TASK_SUCCESS
159
+ },
160
+ Test::Response::ORG_NETWORK_LINK => lambda { |url, headers|
161
+ Test::Response::ORG_NETWORK_RESPONSE
162
+ },
163
+ Test::Response::INSTANTIATED_VAPP_NETWORK_CONFIG_SECTION_LINK =>
164
+ lambda { |url, headers|
165
+ Test::Response::
166
+ INSTANTIATED_VAPP_NETWORK_CONFIG_SECTION_RESPONSE
167
+ },
168
+ Test::Response::
169
+ INSTANTIATED_VAPP_NETWORK_CONFIG_ADD_NETWORK_TASK_LINK =>
170
+ lambda { |url, headers|
171
+ Test::Response::
172
+ INSTANTIATED_VAPP_NETWORK_CONFIG_MODIFY_NETWORK_TASK_SUCCESS
173
+ },
174
+ Test::Response::INSTANTIATED_VM_NETWORK_SECTION_LINK => lambda {
175
+ |url, headers|
176
+ Test::Response::INSTANTIATED_VM_NETWORK_SECTION_RESPONSE
177
+ },
178
+ Test::Response::MEDIA_LINK => lambda { |url, headers|
179
+ Test::Response::MEDIA_UPLOAD_PENDING_RESPONSE
180
+ },
181
+ Test::Response::EXISTING_MEDIA_CATALOG_ITEM_LINK => lambda {
182
+ |url, headers| Test::Response::EXISTING_MEDIA_CATALOG_ITEM
183
+ },
184
+ Test::Response::EXISTING_MEDIA_LINK => lambda { |url, headers|
185
+ case(existing_media_state)
186
+ when "busy"
187
+ existing_media_state = "done"
188
+ Test::Response::EXISTING_MEDIA_BUSY_RESPONSE
189
+ when "done"
190
+ Test::Response::EXISTING_MEDIA_DONE_RESPONSE
191
+ end
192
+ },
193
+ Test::Response::METADATA_SET_LINK => lambda { |url, headers|
194
+ metadata_xml
195
+ },
196
+ Test::Response::INDY_DISK_URL => lambda { |url, headers|
197
+ Test::Response::INDY_DISK_RESPONSE
198
+ },
199
+ Test::Response::EXISTING_VAPP_RESOLVER_URL => lambda {
200
+ |url,headers| Test::Response::EXISTING_VAPP_RESOLVER_RESPONSE
201
+ },
202
+ Test::Response::EXISTING_VAPP_TEMPLATE_CATALOG_RESOLVER_URL =>
203
+ lambda { |url,headers|
204
+ Test::Response::
205
+ EXISTING_VAPP_TEMPLATE_CATALOG_RESOLVER_RESPONSE
206
+ },
207
+ Test::Response::VAPP_TEMPLATE_CATALOG_RESOLVER_URL => lambda {
208
+ |url,headers|
209
+ Test::Response::VAPP_TEMPLATE_CATALOG_RESOLVER_RESPONSE
210
+ }
211
+ },
212
+ :post => {
213
+ Test::Response::LOGIN_LINK => lambda { |url, data, headers|
214
+ session_object = Test::Response::SESSION
215
+
216
+ def session_object.cookies
217
+ {"vcloud-token" =>
218
+ VCloudSdk::Test::vcd_settings["testing"]["cookies"]}
219
+ end
220
+
221
+ session_object
222
+ },
223
+ Test::Response::VDC_VAPP_UPLOAD_LINK => lambda {
224
+ |url, data, headers|
225
+ current_vapp_state = "nothing"
226
+ Test::Response::VAPP_TEMPLATE_UPLOAD_OVF_WAITING_RESPONSE
227
+ },
228
+ Test::Response::CATALOG_ADD_ITEM_LINK => lambda {
229
+ |url, data, headers|
230
+ case(Xml::WrapperFactory.wrap_document(data))
231
+ when Xml::WrapperFactory.wrap_document(
232
+ Test::Response::CATALOG_ADD_VAPP_REQUEST)
233
+ catalog_state = "added"
234
+ Test::Response::CATALOG_ADD_ITEM_RESPONSE
235
+ when Xml::WrapperFactory.wrap_document(
236
+ Test::Response::MEDIA_ADD_TO_CATALOG_REQUEST)
237
+ catalog_state = "added"
238
+ Test::Response::MEDIA_ADD_TO_CATALOG_RESPONSE
239
+ else
240
+ Config.logger.error("Response mapping not found for " +
241
+ "POST and #{url} and #{data}")
242
+ raise "Response mapping not found."
243
+ end
244
+ },
245
+ Test::Response::VAPP_TEMPLATE_INSTANTIATE_LINK => lambda {
246
+ |url, data, headers|
247
+ Test::Response::EXISTING_VAPP_TEMPLATE_INSTANTIATE_RESPONSE
248
+ },
249
+ Test::Response::RECONFIGURE_VM_LINK => lambda {
250
+ |url, data, headers|
251
+ Test::Response::RECONFIGURE_VM_TASK
252
+ },
253
+ Test::Response::INSTANTIATED_VAPP_POWER_ON_LINK => lambda {
254
+ |url, data, headers|
255
+ vapp_power_state = "on"
256
+ Test::Response::INSTANTED_VAPP_POWER_TASK_RUNNING
257
+ },
258
+ Test::Response::INSTANTIATED_VAPP_POWER_OFF_LINK => lambda {
259
+ |url, data, headers|
260
+ vapp_power_state = "powered-off"
261
+ Test::Response::INSTANTED_VAPP_POWER_TASK_RUNNING
262
+ },
263
+ Test::Response::INSTANTIATED_VAPP_POWER_REBOOT_LINK => lambda {
264
+ |url, data, headers|
265
+ vapp_power_state = "on"
266
+ Test::Response::INSTANTED_VAPP_POWER_TASK_RUNNING
267
+ },
268
+ Test::Response::INSTANTIATED_VAPP_UNDEPLOY_LINK => lambda {
269
+ |url, data, headers|
270
+ vapp_power_state = "off"
271
+ Test::Response::INSTANTED_VAPP_POWER_TASK_RUNNING
272
+ },
273
+ Test::Response::INSTANTIATED_VAPP_DISCARD_STATE_LINK => lambda {
274
+ |url, data, headers|
275
+ vapp_power_state = "off"
276
+ Test::Response::INSTANTED_VAPP_POWER_TASK_RUNNING
277
+ },
278
+ Test::Response::MEDIA_UPLOAD_LINK => lambda {
279
+ |url, data, headers|
280
+ Test::Response::MEDIA_UPLOAD_PENDING_RESPONSE
281
+ },
282
+ Test::Response::INSTANTIATED_VM_INSERT_MEDIA_LINK => lambda {
283
+ |url, data, headers|
284
+ Test::Response::INSTANTIATED_VM_INSERT_MEDIA_TASK_DONE
285
+ },
286
+ Test::Response::VDC_INDY_DISKS_LINK => lambda {
287
+ |url, data, headers|
288
+ Test::Response::INDY_DISK_CREATE_RESPONSE
289
+ },
290
+ Test::Response::INSTANTIATED_VM_ATTACH_DISK_LINK => lambda {
291
+ |url, data, headers|
292
+ Test::Response::INDY_DISK_ATTACH_TASK
293
+ }
294
+ },
295
+ :put => {
296
+ Test::Response::VAPP_TEMPLATE_UPLOAD_OVF_LINK => lambda {
297
+ |url, data, headers|
298
+ current_vapp_state = "ovf_uploaded"
299
+ ""
300
+ },
301
+ Test::Response::INSTANTIATED_VM_CPU_LINK => lambda {
302
+ |url, data, headers|
303
+ change_vm_task_state = "running"
304
+ Test::Response::INSTANTIATED_VM_MODIFY_TASK_RUNNING
305
+ },
306
+ Test::Response::INSTANTIATED_VM_MEMORY_LINK => lambda {
307
+ |url, data, headers|
308
+ change_vm_task_state = "running"
309
+ Test::Response::INSTANTIATED_VM_MODIFY_TASK_RUNNING
310
+ },
311
+ Test::Response::INSTANTIATED_VM_LINK => lambda {
312
+ |url, data, headers|
313
+ change_vm_task_state = "running"
314
+ Test::Response::INSTANTIATED_VM_MODIFY_TASK_RUNNING
315
+ },
316
+ Test::Response::INSTANTIATED_VM_HARDWARE_SECTION_LINK =>
317
+ lambda { |url, data, headers|
318
+ change_vm_task_state = "running"
319
+ Test::Response::INSTANTIATED_VM_MODIFY_TASK_RUNNING
320
+ },
321
+ Test::Response::INSTANTIATED_VAPP_NETWORK_CONFIG_SECTION_LINK =>
322
+ lambda { |url, data, headers|
323
+ Test::Response::
324
+ INSTANTIATED_VAPP_NETWORK_CONFIG_MODIFY_NETWORK_TASK_SUCCESS
325
+ },
326
+ Test::Response::INSTANTIATED_VM_NETWORK_SECTION_LINK => lambda {
327
+ |url, data, headers|
328
+ change_vm_task_state = "running"
329
+ Test::Response::INSTANTIATED_VM_MODIFY_TASK_RUNNING
330
+ },
331
+ Test::Response::METADATA_SET_LINK => lambda {
332
+ |url, data, headers|
333
+ received = Xml::WrapperFactory.wrap_document(data)
334
+ metadata_value = received.value
335
+ metadata_xml = data
336
+ Test::Response::METADATA_SET_TASK_DONE
337
+ }
338
+ },
339
+ :delete => {
340
+ Test::Response::VAPP_TEMPLATE_LINK => lambda { |url, headers|
341
+ Test::Response::VAPP_TEMPLATE_DELETE_RUNNING_TASK
342
+ },
343
+ Test::Response::INSTANTIATED_VAPP_LINK => lambda {
344
+ |url, headers|
345
+ Test::Response::INSTANTIATED_VAPP_DELETE_RUNNING_TASK
346
+ },
347
+ Test::Response::CATALOG_ITEM_VAPP_LINK => lambda {
348
+ |url, headers|
349
+ nil
350
+ },
351
+ Test::Response::EXISTING_MEDIA_LINK => lambda { |url, headers|
352
+ Test::Response::EXISTING_MEDIA_DELETE_TASK_DONE
353
+ },
354
+ Test::Response::EXISTING_MEDIA_CATALOG_ITEM_LINK => lambda {
355
+ |url, headers|
356
+ nil
357
+ },
358
+ Test::Response::MEDIA_LINK => lambda { |url, headers|
359
+ Test::Response::MEDIA_DELETE_TASK_DONE
360
+ },
361
+ Test::Response::INDY_DISK_URL => lambda { |url, headers|
362
+ Test::Response::INDY_DISK_DELETE_TASK
363
+ },
364
+ }
365
+ }
366
+
367
+ #Working around Ruby 1.8"s lack of define_singleton_method
368
+ metaclass = class << response_mapping;
369
+ self;
370
+ end
371
+
372
+ metaclass.send :define_method, :get_mapping do |http_method, url|
373
+ mapping = self[http_method][url]
374
+ if mapping.nil?
375
+ Config.logger.error("Response mapping not found for " +
376
+ "#{http_method} and #{url}")
377
+ # string substitution doesn"t work here for some reason
378
+ raise "Response mapping not found."
379
+ else
380
+ mapping
381
+ end
382
+ end
383
+
384
+ rest_client.stub(:get) do |headers|
385
+ response_mapping.get_mapping(:get, build_url).call(build_url, headers)
386
+ end
387
+ rest_client.stub(:post) do |data, headers|
388
+ response_mapping.get_mapping(:post, build_url).call(build_url, data,
389
+ headers)
390
+ end
391
+ rest_client.stub(:put) do |data, headers|
392
+ response_mapping.get_mapping(:put, build_url).call(build_url, data,
393
+ headers)
394
+ end
395
+ rest_client.stub(:delete) do |headers|
396
+ response_mapping.get_mapping(:delete, build_url).call(build_url,
397
+ headers)
398
+ end
399
+ rest_client.stub(:vapp_state=) do |value|
400
+ current_vapp_state = value
401
+ end
402
+ rest_client.stub(:vapp_state) do
403
+ current_vapp_state
404
+ end
405
+ rest_client.stub(:response_mapping) do
406
+ response_mapping
407
+ end
408
+ rest_client.stub(:vapp_power_state=) do |value|
409
+ vapp_power_state = value
410
+ end
411
+ rest_client.stub(:[]) do |value|
412
+ @resource = value
413
+ @rest_connection
414
+ end
415
+
416
+ rest_client
417
+ end
418
+
419
+ def build_url
420
+ url + @resource
421
+ end
422
+
423
+ def nested(url)
424
+ URI.parse(url).path
425
+ end
426
+
427
+ class MockRestClient
428
+ class << self
429
+ attr_accessor :log
430
+ end
431
+ end
432
+
433
+ def create_mock_client
434
+ @rest_connection = mock_rest_connection()
435
+ file_uploader = mock("File Uploader")
436
+ file_uploader.stub(:upload) do
437
+ @rest_connection.vapp_state = @upload_file_state == "success" ?
438
+ "disks_uploaded" : "disks_upload_failed"
439
+ end
440
+ conn = Connection::Connection.new(url, entities["organization"],
441
+ control["time_limit_sec"]["http_request"], MockRestClient,
442
+ @rest_connection, file_uploader)
443
+ conn.stub(:file_uploader) do
444
+ file_uploader
445
+ end
446
+ conn.stub(:rest_connection) do
447
+ @rest_connection
448
+ end
449
+ conn
450
+ end
451
+
452
+ def create_mock_ovf_directory(string_io)
453
+ directory = mock("Directory")
454
+ # Actual content of the OVF is irrelevant as long as the client gives
455
+ # back the same one given to it
456
+ ovf_string = "ovf_string"
457
+ ovf_string_io = StringIO.new(ovf_string)
458
+ directory.stub(:ovf_file_path) { "ovf_file" }
459
+ directory.stub(:ovf_file) {
460
+ ovf_string_io
461
+ }
462
+ directory.stub(:vmdk_file_path) do |file_name|
463
+ file_name
464
+ end
465
+ directory.stub(:vmdk_file) do |file_name|
466
+ string_io
467
+ end
468
+ directory
469
+ end
470
+
471
+ def create_mock_media_file()
472
+ media_string = Test::Response::MEDIA_CONTENT
473
+ string_io = StringIO.new(media_string)
474
+ string_io.stub(:path) { "bogus/bogus.iso" }
475
+ string_io.stub(:stat) {
476
+ o = Object.new
477
+ o.stub(:size) { media_string.length }
478
+ o
479
+ }
480
+ string_io
481
+ end
482
+
483
+
484
+ describe "VCD Adapter client", :positive, :min, :all do
485
+ it "logs into organization with usename and password and get the " +
486
+ "organization VDC" do
487
+ conn = mock("Connection")
488
+ root_session = Xml::WrapperFactory.wrap_document(
489
+ Test::Response::SESSION)
490
+ vcloud_response = Xml::WrapperFactory.wrap_document(
491
+ Test::Response::VCLOUD_RESPONSE)
492
+ admin_org_response = Xml::WrapperFactory.wrap_document(
493
+ Test::Response::ADMIN_ORG_RESPONSE)
494
+ vdc_response = Xml::WrapperFactory.wrap_document(
495
+ Test::Response::VDC_RESPONSE)
496
+ conn.should_receive(:connect).with(username, password).and_return(
497
+ root_session)
498
+ conn.should_receive(:get).with(root_session.admin_root).and_return(
499
+ vcloud_response)
500
+ conn.should_receive(:get).with(vcloud_response.organization(
501
+ entities["organization"])).and_return(admin_org_response)
502
+ Client.new(nil, username, password, entities, control, conn)
503
+ end
504
+ end
505
+
506
+ describe "VCD Adapter client", :upload, :all do
507
+ it "uploads an OVF to the OVDC", :positive do
508
+ vmdk_string = "vmdk"
509
+ vmdk_string_io = StringIO.new(vmdk_string)
510
+ directory = create_mock_ovf_directory(vmdk_string_io)
511
+
512
+ conn = create_mock_client
513
+
514
+ vapp_name = Test::Response::VAPP_TEMPLATE_NAME
515
+
516
+ client = Client.new(nil, username, password, entities, control, conn)
517
+
518
+ conn.file_uploader.should_receive(:upload).with(
519
+ Test::Response::VAPP_TEMPLATE_DISK_UPLOAD_1, vmdk_string_io,
520
+ auth_cookies)
521
+ catalog_item = client.upload_vapp_template(vapp_name, directory)
522
+ # Since the wrapper classes are used to hide away the raw XML,
523
+ # compare the wrapped versions
524
+ catalog_item.should eq(Xml::WrapperFactory.wrap_document(
525
+ Test::Response::CATALOG_ADD_ITEM_RESPONSE))
526
+ end
527
+
528
+ it "reports an exception upon error in transferring an OVF file",
529
+ :negative do
530
+ vmdk_string = "vmdk"
531
+ vmdk_string_io = StringIO.new(vmdk_string)
532
+ directory = create_mock_ovf_directory(vmdk_string_io)
533
+
534
+ conn = create_mock_client
535
+ @upload_file_state = "failed"
536
+ vapp_name = Test::Response::VAPP_TEMPLATE_NAME
537
+ client = Client.new(nil, username, password, entities, control, conn)
538
+
539
+ conn.file_uploader.should_receive(:upload).with(
540
+ Test::Response::VAPP_TEMPLATE_DISK_UPLOAD_1, vmdk_string_io,
541
+ auth_cookies)
542
+ expect {
543
+ client.upload_vapp_template(vapp_name, directory)
544
+ }.to raise_exception("Error uploading vApp template")
545
+ @upload_file_state = "success"
546
+ end
547
+
548
+ it "deletes the vApp template if there's an error uploading it to " +
549
+ "the catalog", :negative do
550
+ vmdk_string = "vmdk"
551
+ vmdk_string_io = StringIO.new(vmdk_string)
552
+ directory = create_mock_ovf_directory(vmdk_string_io)
553
+
554
+ conn = create_mock_client
555
+ conn.rest_connection.response_mapping[:post][
556
+ Test::Response::CATALOG_ADD_ITEM_LINK] =
557
+ lambda { |url, data, headers|
558
+ raise ApiError, "Bogus add to catalog error"
559
+ }
560
+ vapp_name = Test::Response::VAPP_TEMPLATE_NAME
561
+ conn.rest_connection.should_receive(:[]).with(
562
+ nested(Test::Response::VAPP_TEMPLATE_LINK))
563
+ conn.rest_connection.should_receive(:delete).with(anything())
564
+ client = Client.new(nil, username, password, entities, control, conn)
565
+ expect {
566
+ client.upload_vapp_template(vapp_name, directory)
567
+ }.to raise_exception("Bogus add to catalog error")
568
+ end
569
+
570
+ end
571
+
572
+ describe "VCD Adapter client", :delete, :all do
573
+ it "deletes a vApp template from the catalog", :positive do
574
+ vmdk_string = "vmdk"
575
+ vmdk_string_io = StringIO.new(vmdk_string)
576
+ directory = create_mock_ovf_directory(vmdk_string_io)
577
+
578
+ conn = create_mock_client
579
+ client = Client.new(nil, username, password, entities, control, conn)
580
+ vapp_name = Test::Response::VAPP_TEMPLATE_NAME
581
+ conn.rest_connection.should_receive(:[]).with(
582
+ nested(Test::Response::VAPP_TEMPLATE_LINK))
583
+ conn.rest_connection.should_receive(:delete).with(anything())
584
+ catalog_item = client.upload_vapp_template(vapp_name, directory)
585
+ client.delete_catalog_vapp(catalog_item.urn)
586
+ end
587
+
588
+ it "no exception for delete catalog vapp if the vApp does not exist",
589
+ :negative do
590
+ conn = create_mock_client
591
+ client = Client.new(nil, username, password, entities, control, conn)
592
+ client.delete_catalog_vapp("bogus")
593
+ end
594
+
595
+ it "raise exception for upload media to catalog if the catalog does " +
596
+ "not exist", :negative do
597
+ conn = create_mock_client
598
+ ent_clone = entities.clone
599
+ ent_clone["media_catalog"] = "bogus"
600
+ media_file = create_mock_media_file()
601
+ client = Client.new(nil, username, password, ent_clone, control, conn)
602
+ media_name = Test::Response::MEDIA_NAME
603
+
604
+ conn.file_uploader.stub(:upload) do |href, data, headers|
605
+ href.should eq(Test::Response::MEDIA_ISO_LINK)
606
+ data.read.should eq(Test::Response::MEDIA_CONTENT)
607
+ end
608
+ conn.rest_connection.should_receive(:[]).with(
609
+ nested(Test::Response::MEDIA_LINK))
610
+ conn.rest_connection.should_receive(:delete).with(anything())
611
+ expect {
612
+ client.upload_catalog_media(media_name, media_file)
613
+ }.to raise_exception(/.+ catalog .+ not found\./)
614
+ end
615
+
616
+ it "should not raise if underlying vApp no longer exists when " +
617
+ "deleting a vApp from the catalog", :negative do
618
+ conn = create_mock_client
619
+ client = Client.new(nil, username, password, entities, control, conn)
620
+ conn.rest_connection.response_mapping[:delete][
621
+ Test::Response::VAPP_TEMPLATE_LINK] = lambda { |urls, headers|
622
+ raise RestClient::ResourceNotFound
623
+ }
624
+ client.delete_catalog_vapp(Test::Response::VAPP_TEMPLATE_NAME)
625
+ end
626
+ end
627
+
628
+ describe "VCD Adapter client", :instantiate_template, :all do
629
+ it "instantiates a vApp from the catalog", :positive do
630
+ conn = create_mock_client
631
+ client = Client.new(nil, username, password, entities, control, conn)
632
+ catalog_vapp_id = Test::Response::EXISTING_VAPP_TEMPLATE_CATALOG_URN
633
+ vapp_name = Test::Response::VAPP_NAME
634
+ conn.rest_connection.should_receive(:[]).with(
635
+ nested(Test::Response::VAPP_TEMPLATE_INSTANTIATE_LINK))
636
+ conn.rest_connection.should_receive(:post).with(
637
+ Test::Response::EXISTING_VAPP_TEMPLATE_INSTANTIATE_REQUEST,
638
+ anything())
639
+ client.instantiate_vapp_template(catalog_vapp_id, vapp_name)
640
+ end
641
+
642
+ it "instantiates with locality a vApp from the catalog", :positive do
643
+ conn = create_mock_client
644
+ client = Client.new(nil, username, password, entities, control, conn)
645
+ catalog_vapp_id = Test::Response::EXISTING_VAPP_TEMPLATE_CATALOG_URN
646
+ vapp_name = Test::Response::VAPP_NAME
647
+ conn.rest_connection.should_receive(:[]).with(
648
+ nested(Test::Response::VAPP_TEMPLATE_INSTANTIATE_LINK))
649
+ conn.rest_connection.should_receive(:post).with(
650
+ Test::Response::
651
+ EXISTING_VAPP_TEMPLATE_INSTANTIATE_WITH_LOCALITY_REQUEST,
652
+ anything())
653
+ client.instantiate_vapp_template(catalog_vapp_id, vapp_name, "desc",
654
+ [ Test::Response::INDY_DISK_URL ])
655
+ end
656
+
657
+ it "instantiates raises an exception if the task fails", :negative do
658
+ conn = create_mock_client
659
+ client = Client.new(nil, username, password, entities, control, conn)
660
+ catalog_vapp_id = Test::Response::EXISTING_VAPP_TEMPLATE_CATALOG_URN
661
+ vapp_name = Test::Response::VAPP_NAME
662
+ conn.rest_connection.response_mapping[:get][
663
+ Test::Response::EXISTING_VAPP_TEMPLATE_INSTANTIATE_TASK_LINK] =
664
+ lambda { |url, headers|
665
+ Test::Response::
666
+ EXISTING_VAPP_TEMPLATE_INSTANTIATE_TASK_ERROR_RESPONSE
667
+ }
668
+ conn.rest_connection.should_receive(:[]).with(
669
+ nested(Test::Response::INSTANTIATED_VAPP_LINK))
670
+ conn.rest_connection.should_receive(:delete).with(anything())
671
+ expect {
672
+ client.instantiate_vapp_template(catalog_vapp_id, vapp_name)
673
+ }.to raise_exception(/.+Creating Virtual.+did not complete success.+/)
674
+ end
675
+
676
+ end
677
+
678
+ describe "VCD Adapter client", :modify_vm, :all do
679
+ it "reconfigures a VM", :positive do
680
+ conn = create_mock_client
681
+ client = Client.new(nil, username, password, entities, control, conn)
682
+ catalog_vapp_id = Test::Response::EXISTING_VAPP_TEMPLATE_CATALOG_URN
683
+ vapp_name = Test::Response::VAPP_NAME
684
+ conn.rest_connection.should_receive(:[]).with(
685
+ nested(Test::Response::RECONFIGURE_VM_LINK))
686
+ conn.rest_connection.should_receive(:post).with(
687
+ Test::Response::RECONFIGURE_VM_REQUEST, anything())
688
+ vapp = client.instantiate_vapp_template(catalog_vapp_id, vapp_name)
689
+ vm = vapp.vms.first
690
+ client.reconfigure_vm(vm) do |v|
691
+ vm.name = Test::Response::CHANGED_VM_NAME
692
+ vm.description = Test::Response::CHANGED_VM_DESCRIPTION
693
+ v.change_cpu_count(Test::Response::CHANGED_VM_CPU)
694
+ v.change_memory(Test::Response::CHANGED_VM_MEMORY)
695
+ v.add_hard_disk(Test::Response::CHANGED_VM_DISK)
696
+ v.delete_nic(*vm.hardware_section.nics)
697
+ end
698
+ end
699
+
700
+ it "gets information on HD", :positive do
701
+ conn = create_mock_client
702
+ client = Client.new(nil, username, password, entities, control, conn)
703
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
704
+ vm = vapp.vms.first
705
+ vm.hardware_section.hard_disks.each do |h|
706
+ h.capacity_mb.should_not be_nil
707
+ h.disk_id.should_not be_nil
708
+ h.bus_sub_type.should_not be_nil
709
+ h.bus_type.should_not be_nil
710
+ end
711
+
712
+ vm.hardware_section.nics.each do |n|
713
+ n.mac_address.should_not be_nil
714
+ end
715
+
716
+ end
717
+
718
+ end
719
+
720
+ describe "VCD Adapter client", :power_vapp, :all do
721
+ it "finds and powers on a vApp and powers it off" , :positive do
722
+ conn = create_mock_client
723
+ client = Client.new(nil, username, password, entities, control, conn)
724
+
725
+ conn.rest_connection.should_receive(:[]).with(
726
+ nested(Test::Response::INSTANTIATED_VAPP_POWER_ON_LINK))
727
+ conn.rest_connection.should_receive(:post).with(
728
+ anything(), anything())
729
+ conn.rest_connection.should_receive(:[]).with(
730
+ nested(Test::Response::INSTANTIATED_VAPP_POWER_OFF_LINK))
731
+ conn.rest_connection.should_receive(:post).with(
732
+ anything(), anything())
733
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
734
+ client.power_on_vapp(vapp)
735
+ client.power_off_vapp(vapp, false)
736
+ end
737
+
738
+ it "finds and powers on a powered-on vApp" , :negative do
739
+ conn = create_mock_client
740
+ client = Client.new(nil, username, password, entities, control, conn)
741
+
742
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
743
+ client.power_on_vapp(vapp)
744
+ conn.rest_connection.should_not_receive(:[]).with(
745
+ nested(Test::Response::INSTANTIATED_VAPP_POWER_ON_LINK))
746
+ conn.rest_connection.should_not_receive(:post).with(
747
+ anything(), anything())
748
+ client.power_on_vapp(vapp)
749
+ end
750
+
751
+ it "finds and powers off a powered-off vApp" , :negative do
752
+ conn = create_mock_client
753
+ client = Client.new(nil, username, password, entities, control, conn)
754
+
755
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
756
+ client.power_off_vapp(vapp, false)
757
+ conn.rest_connection.should_not_receive(:[]).with(
758
+ nested(Test::Response::INSTANTIATED_VAPP_POWER_OFF_LINK))
759
+ conn.rest_connection.should_not_receive(:post).with(
760
+ anything(), anything())
761
+ client.power_off_vapp(vapp, false)
762
+ end
763
+
764
+ it "finds and powers on a vApp and undeploys it" , :positive do
765
+ conn = create_mock_client
766
+ client = Client.new(nil, username, password, entities, control, conn)
767
+
768
+ conn.rest_connection.should_receive(:[]).with(
769
+ nested(Test::Response::INSTANTIATED_VAPP_POWER_ON_LINK))
770
+ conn.rest_connection.should_receive(:post).with(
771
+ anything(), anything())
772
+ conn.rest_connection.should_receive(:[]).with(
773
+ nested(Test::Response::INSTANTIATED_VAPP_UNDEPLOY_LINK))
774
+ conn.rest_connection.should_receive(:post).with(
775
+ anything(), anything())
776
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
777
+ client.power_on_vapp(vapp)
778
+ client.power_off_vapp(vapp)
779
+ end
780
+
781
+ it "finds and undeploys an undeployed vapp" , :negative do
782
+ conn = create_mock_client
783
+ client = Client.new(nil, username, password, entities, control, conn)
784
+
785
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
786
+ client.power_off_vapp(vapp)
787
+ conn.rest_connection.should_not_receive(:[]).with(
788
+ nested(Test::Response::INSTANTIATED_VAPP_UNDEPLOY_LINK))
789
+ conn.rest_connection.should_not_receive(:post).with(
790
+ anything(), anything())
791
+ client.power_off_vapp(vapp)
792
+ end
793
+
794
+ it "finds and undeploys a powered-off vapp" , :positive do
795
+ conn = create_mock_client
796
+ client = Client.new(nil, username, password, entities, control, conn)
797
+
798
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
799
+ client.power_on_vapp(vapp)
800
+ client.power_off_vapp(vapp, false)
801
+ conn.rest_connection.should_receive(:[]).with(
802
+ nested(Test::Response::INSTANTIATED_VAPP_UNDEPLOY_LINK))
803
+ conn.rest_connection.should_receive(:post).with(
804
+ Test::Response::UNDEPLOY_PARAMS, anything())
805
+ client.power_off_vapp(vapp)
806
+ end
807
+
808
+ it "discards state of a suspended vapp" , :positive do
809
+ conn = create_mock_client
810
+ client = Client.new(nil, username, password, entities, control, conn)
811
+
812
+ conn.rest_connection.response_mapping[:get][
813
+ Test::Response::EXISTING_VAPP_LINK] = lambda { |url, headers|
814
+ Test::Response::INSTANTIATED_SUSPENDED_VAPP_RESPONSE }
815
+ conn.rest_connection.vapp_power_state = "suspended"
816
+
817
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
818
+ conn.rest_connection.should_receive(:[]).with(
819
+ nested(Test::Response::INSTANTIATED_VAPP_DISCARD_STATE_LINK))
820
+ conn.rest_connection.should_receive(:post).with(
821
+ anything(), anything())
822
+
823
+ client.discard_suspended_state_vapp(vapp)
824
+ end
825
+
826
+ it "finds and powers on a vApp and reboots it" , :positive do
827
+ conn = create_mock_client
828
+ client = Client.new(nil, username, password, entities, control, conn)
829
+
830
+ conn.rest_connection.should_receive(:[]).with(
831
+ nested(Test::Response::INSTANTIATED_VAPP_POWER_ON_LINK))
832
+ conn.rest_connection.should_receive(:post).with(
833
+ anything(), anything())
834
+ conn.rest_connection.should_receive(:[]).with(
835
+ nested(Test::Response::INSTANTIATED_VAPP_POWER_REBOOT_LINK))
836
+ conn.rest_connection.should_receive(:post).with(
837
+ anything(), anything())
838
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
839
+ client.power_on_vapp(vapp)
840
+ client.reboot_vapp(vapp)
841
+ end
842
+
843
+ it "reboot of a powered-off vApp raises an exception" , :positive do
844
+ conn = create_mock_client
845
+ client = Client.new(nil, username, password, entities, control, conn)
846
+
847
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
848
+ expect {
849
+ client.reboot_vapp(vapp)
850
+ }.to raise_exception(VappPoweredOffError)
851
+ end
852
+
853
+ it "reboot of a suspended vApp raises an exception" , :positive do
854
+ conn = create_mock_client
855
+ client = Client.new(nil, username, password, entities, control, conn)
856
+ conn.rest_connection.vapp_power_state = "suspended"
857
+
858
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
859
+ expect {
860
+ client.reboot_vapp(vapp)
861
+ }.to raise_exception(VappSuspendedError)
862
+ end
863
+ end
864
+
865
+ describe "VCD Adapter client", :delete_vapp, :all do
866
+ it "finds a vApp and deletes it without undeploying", :positive do
867
+ conn = create_mock_client
868
+ client = Client.new(nil, username, password, entities, control, conn)
869
+
870
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
871
+ conn.rest_connection.should_not_receive(:[]).with(
872
+ nested(Test::Response::INSTANTIATED_VAPP_UNDEPLOY_LINK))
873
+ conn.rest_connection.should_not_receive(:post).with(
874
+ anything(), anything())
875
+ conn.rest_connection.should_receive(:[]).with(
876
+ nested(Test::Response::INSTANTIATED_VAPP_LINK))
877
+ conn.rest_connection.should_receive(:delete).with(anything())
878
+ client.delete_vapp(vapp)
879
+ end
880
+
881
+ it "finds and powers on a vApp and fails on delete vApp", :negative do
882
+ conn = create_mock_client
883
+ client = Client.new(nil, username, password, entities, control, conn)
884
+
885
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
886
+ client.power_on_vapp(vapp)
887
+ conn.rest_connection.should_receive(:[]).once.with(
888
+ nested(Test::Response::INSTANTIATED_VAPP_LINK))
889
+ conn.rest_connection.should_not_receive(:delete).with(anything())
890
+ expect {
891
+ client.delete_vapp(vapp)
892
+ }.to raise_exception(/vApp .+ powered on, power-off before deleting./)
893
+ end
894
+ end
895
+
896
+ describe "VCD Adapter client", :add_vapp_network, :all do
897
+ it "finds a network and vapp and adds the network to the vApp",
898
+ :positive do
899
+ conn = create_mock_client
900
+ client = Client.new(nil, username, password, entities, control, conn)
901
+
902
+ network_name = Test::Response::ORG_NETWORK_NAME
903
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
904
+ network = client.get_ovdc.available_networks.find {
905
+ |n| n["name"] == network_name }
906
+ conn.rest_connection.should_receive(:[]).with(nested(
907
+ Test::Response::INSTANTIATED_VAPP_NETWORK_CONFIG_SECTION_LINK))
908
+ conn.rest_connection.should_receive(:put).with(Test::Response::
909
+ INSTANTIATED_VAPP_NETWORK_CONFIG_ADD_NETWORK_REQUEST,
910
+ anything())
911
+ client.add_network(vapp, network)
912
+ end
913
+
914
+ it "removes all networks", :positive do
915
+ conn = create_mock_client
916
+ client = Client.new(nil, username, password, entities, control, conn)
917
+
918
+ conn.rest_connection.response_mapping[:put][
919
+ Test::Response::INSTANTIATED_VAPP_NETWORK_CONFIG_SECTION_LINK] =
920
+ lambda { |url, data, headers|
921
+ expected = Xml::WrapperFactory.wrap_document(
922
+ Test::Response::
923
+ INSTANTIATED_VAPP_NETWORK_CONFIG_REMOVE_NETWORK_REQUEST)
924
+ received = Xml::WrapperFactory.wrap_document(data)
925
+ received.should eq(expected)
926
+ Test::Response::
927
+ INSTANTIATED_VAPP_NETWORK_CONFIG_MODIFY_NETWORK_TASK_SUCCESS
928
+ }
929
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
930
+ client.delete_networks(vapp)
931
+ end
932
+ end
933
+
934
+ describe "VCD Adapter client", :add_remove_insert_media, :all do
935
+ it "uploads media to VDC and adds it to the catalog", :positive do
936
+ conn = create_mock_client
937
+ media_file = create_mock_media_file()
938
+ client = Client.new(nil, username, password, entities, control, conn)
939
+ media_name = Test::Response::MEDIA_NAME
940
+
941
+ conn.file_uploader.stub(:upload) do |href, data, headers|
942
+ href.should eq(Test::Response::MEDIA_ISO_LINK)
943
+ data.read.should eq(Test::Response::MEDIA_CONTENT)
944
+ end
945
+
946
+ conn.rest_connection.should_receive(:[]).with(
947
+ nested(Test::Response::CATALOG_ADD_ITEM_LINK))
948
+ conn.rest_connection.should_receive(:post).with(
949
+ Test::Response::MEDIA_ADD_TO_CATALOG_REQUEST, anything())
950
+
951
+ client.upload_catalog_media(media_name, media_file)
952
+
953
+ end
954
+
955
+ it "deletes a media from catalog and the VDC", :positive do
956
+ conn = create_mock_client
957
+ client = Client.new(nil, username, password, entities, control, conn)
958
+ media_name = Test::Response::EXISTING_MEDIA_NAME
959
+
960
+ conn.rest_connection.should_receive(:[]).with(
961
+ nested(Test::Response::EXISTING_MEDIA_LINK))
962
+ conn.rest_connection.should_receive(:delete).with(anything())
963
+ conn.rest_connection.should_receive(:[]).with(
964
+ nested(Test::Response::EXISTING_MEDIA_CATALOG_ITEM_LINK))
965
+ conn.rest_connection.should_receive(:delete).with(anything())
966
+ client.delete_catalog_media(media_name)
967
+
968
+ end
969
+
970
+ it "uploads media to VDC, fails to add to catalog, and rolls back",
971
+ :negative do
972
+ conn = create_mock_client
973
+ media_file = create_mock_media_file()
974
+ client = Client.new(nil, username, password, entities, control, conn)
975
+ media_name = Test::Response::MEDIA_NAME
976
+
977
+ conn.rest_connection.response_mapping[:post][
978
+ Test::Response::CATALOG_ADD_ITEM_LINK] = lambda {
979
+ |url, data, headers|
980
+ raise ApiError, "bogus error"
981
+ }
982
+
983
+ conn.rest_connection.should_receive(:[]).with(
984
+ nested(Test::Response::MEDIA_LINK))
985
+ conn.rest_connection.should_receive(:delete).with(anything())
986
+ expect {
987
+ client.upload_catalog_media(media_name, media_file)
988
+ }.to raise_exception(/bogus error/)
989
+
990
+ end
991
+
992
+ it "inserts a media into a VM", :positive do
993
+ conn = create_mock_client
994
+
995
+ client = Client.new(nil, username, password, entities, control, conn)
996
+ media_name = Test::Response::EXISTING_MEDIA_NAME
997
+
998
+ catalog_vapp_id = Test::Response::EXISTING_VAPP_TEMPLATE_CATALOG_URN
999
+ vapp_name = Test::Response::VAPP_NAME
1000
+
1001
+ vapp = client.instantiate_vapp_template(catalog_vapp_id, vapp_name)
1002
+ vm = vapp.vms.first
1003
+ client.insert_catalog_media(vm, media_name)
1004
+
1005
+ end
1006
+
1007
+ end
1008
+
1009
+ describe "VCD Adapter client", :metadata, :all do
1010
+ it "sets and gets metadata on a VM", :positive do
1011
+ conn = create_mock_client
1012
+
1013
+ client = Client.new(nil, username, password, entities, control, conn)
1014
+
1015
+ metadata_key = Test::Response::METADATA_KEY
1016
+ metadata_value = Test::Response::METADATA_VALUE
1017
+ vapp = client.get_vapp(Test::Response::EXISTING_VAPP_URN)
1018
+ vm = vapp.vms.first
1019
+ client.set_metadata(vm, metadata_key, metadata_value)
1020
+ value = client.get_metadata(vm, metadata_key)
1021
+ value.should eq metadata_value
1022
+ end
1023
+
1024
+ end
1025
+
1026
+ describe "VCD Adapter client", :indy_disk, :all do
1027
+ it "creates an indepdent disk", :positive do
1028
+ disk_name = Test::Response::INDY_DISK_NAME
1029
+ disk_size = Test::Response::INDY_DISK_SIZE
1030
+
1031
+ conn = create_mock_client
1032
+
1033
+ client = Client.new(nil, username, password, entities, control, conn)
1034
+
1035
+ conn.rest_connection.should_receive(:[]).with(
1036
+ nested(Test::Response::VDC_INDY_DISKS_LINK))
1037
+ conn.rest_connection.should_receive(:post).with(
1038
+ Test::Response::INDY_DISK_CREATE_REQUEST, anything())
1039
+
1040
+ client.create_disk(disk_name, disk_size)
1041
+
1042
+ end
1043
+
1044
+ it "creates an indepdent disk but hits an error", :negative do
1045
+ disk_name = Test::Response::INDY_DISK_NAME
1046
+ disk_size = Test::Response::INDY_DISK_SIZE
1047
+
1048
+ conn = create_mock_client
1049
+
1050
+ client = Client.new(nil, username, password, entities, control, conn)
1051
+
1052
+ conn.rest_connection.response_mapping[:post][
1053
+ Test::Response::VDC_INDY_DISKS_LINK] = lambda {
1054
+ |href, data, headers|
1055
+ Test::Response::INDY_DISK_CREATE_ERROR
1056
+ }
1057
+ expect {
1058
+ client.create_disk(disk_name, disk_size)
1059
+ }.to raise_exception(ApiRequestError)
1060
+
1061
+ end
1062
+
1063
+ it "attaches an indepdent disk to a VM and then detaches", :positive do
1064
+ disk_name = Test::Response::INDY_DISK_NAME
1065
+
1066
+ conn = create_mock_client
1067
+
1068
+ client = Client.new(nil, username, password, entities, control, conn)
1069
+
1070
+ catalog_vapp_id = Test::Response::EXISTING_VAPP_TEMPLATE_CATALOG_URN
1071
+ vapp_name = Test::Response::VAPP_NAME
1072
+
1073
+ vapp = client.instantiate_vapp_template(catalog_vapp_id, vapp_name)
1074
+ vm = vapp.vms.first
1075
+
1076
+ vdc = client.get_ovdc()
1077
+ disk = vdc.disks(disk_name).first
1078
+
1079
+ conn.rest_connection.response_mapping[:post][
1080
+ Test::Response::INSTANTIATED_VM_ATTACH_DISK_LINK] = lambda {
1081
+ |href, data, headers|
1082
+ data_xml = Nokogiri::XML(data)
1083
+ expected_xml = Nokogiri::XML(
1084
+ Test::Response::INDY_DISK_ATTACH_REQUEST)
1085
+ equality = VCloudSdk::Test::compare_xml(data_xml, expected_xml)
1086
+ equality.should == true
1087
+ Test::Response::INDY_DISK_ATTACH_TASK
1088
+ }
1089
+
1090
+ client.attach_disk(disk, vm)
1091
+
1092
+ conn.rest_connection.response_mapping[:post][
1093
+ Test::Response::INSTANTIATED_VM_DETACH_DISK_LINK] = lambda {
1094
+ |href, data, headers|
1095
+ data_xml = Nokogiri::XML(data)
1096
+ expected_xml = Nokogiri::XML(
1097
+ Test::Response::INDY_DISK_DETACH_REQUEST)
1098
+ equality = VCloudSdk::Test::compare_xml(data_xml, expected_xml)
1099
+ equality.should == true
1100
+ Test::Response::INDY_DISK_DETACH_TASK
1101
+ }
1102
+
1103
+ client.detach_disk(disk, vm)
1104
+
1105
+
1106
+ end
1107
+
1108
+ it "attaches an indepdent disk to a VM but has an error", :negative do
1109
+ disk_name = Test::Response::INDY_DISK_NAME
1110
+
1111
+ conn = create_mock_client
1112
+
1113
+ client = Client.new(nil, username, password, entities, control, conn)
1114
+
1115
+ catalog_vapp_id = Test::Response::EXISTING_VAPP_TEMPLATE_CATALOG_URN
1116
+ vapp_name = Test::Response::VAPP_NAME
1117
+
1118
+ vapp = client.instantiate_vapp_template(catalog_vapp_id, vapp_name)
1119
+ vm = vapp.vms.first
1120
+
1121
+ vdc = client.get_ovdc()
1122
+ disk = vdc.disks(disk_name).first
1123
+
1124
+ conn.rest_connection.response_mapping[:post][
1125
+ Test::Response::INSTANTIATED_VM_ATTACH_DISK_LINK] = lambda {
1126
+ |href, data, headers|
1127
+ Test::Response::INDY_DISK_ATTACH_TASK_ERROR
1128
+ }
1129
+
1130
+ expect {
1131
+ client.attach_disk(disk, vm)
1132
+ }.to raise_exception(/.+ Attaching Disk .+ complete successfully\./)
1133
+
1134
+ end
1135
+
1136
+ it "deletes an independent disk", :positive do
1137
+ disk_name = Test::Response::INDY_DISK_NAME
1138
+
1139
+ conn = create_mock_client
1140
+ client = Client.new(nil, username, password, entities, control, conn)
1141
+ vdc = client.get_ovdc()
1142
+ disk = vdc.disks(disk_name).first
1143
+ conn.rest_connection.should_receive(:[]).with(
1144
+ nested(Test::Response::INDY_DISK_URL))
1145
+ conn.rest_connection.should_receive(:delete).with(anything())
1146
+ client.delete_disk(disk)
1147
+ end
1148
+
1149
+ end
1150
+
1151
+ end
1152
+ end