fog 1.30.0 → 1.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +39 -0
  3. data/CONTRIBUTORS.md +73 -1
  4. data/LICENSE.md +1 -1
  5. data/Rakefile +10 -8
  6. data/fog.gemspec +6 -3
  7. data/lib/fog/cloudstack/models/compute/server.rb +2 -0
  8. data/lib/fog/openstack.rb +1 -1
  9. data/lib/fog/openstack/baremetal.rb +5 -5
  10. data/lib/fog/openstack/compute.rb +20 -9
  11. data/lib/fog/openstack/core.rb +53 -14
  12. data/lib/fog/openstack/examples/compute/basics.rb +3 -1
  13. data/lib/fog/openstack/identity.rb +29 -254
  14. data/lib/fog/openstack/identity_v2.rb +264 -0
  15. data/lib/fog/openstack/identity_v3.rb +249 -0
  16. data/lib/fog/openstack/image.rb +1 -1
  17. data/lib/fog/openstack/metering.rb +1 -1
  18. data/lib/fog/openstack/models/baremetal/node.rb +22 -0
  19. data/lib/fog/openstack/models/compute/flavor.rb +13 -0
  20. data/lib/fog/openstack/models/compute/service.rb +48 -0
  21. data/lib/fog/openstack/models/compute/services.rb +20 -0
  22. data/lib/fog/openstack/models/identity_v2/ec2_credential.rb +45 -0
  23. data/lib/fog/openstack/models/identity_v2/ec2_credentials.rb +55 -0
  24. data/lib/fog/openstack/models/identity_v2/role.rb +52 -0
  25. data/lib/fog/openstack/models/identity_v2/roles.rb +22 -0
  26. data/lib/fog/openstack/models/identity_v2/tenant.rb +64 -0
  27. data/lib/fog/openstack/models/identity_v2/tenants.rb +31 -0
  28. data/lib/fog/openstack/models/identity_v2/user.rb +71 -0
  29. data/lib/fog/openstack/models/identity_v2/users.rb +43 -0
  30. data/lib/fog/openstack/models/identity_v3/domain.rb +47 -0
  31. data/lib/fog/openstack/models/identity_v3/domains.rb +36 -0
  32. data/lib/fog/openstack/models/identity_v3/endpoint.rb +50 -0
  33. data/lib/fog/openstack/models/identity_v3/endpoints.rb +27 -0
  34. data/lib/fog/openstack/models/identity_v3/group.rb +96 -0
  35. data/lib/fog/openstack/models/identity_v3/groups.rb +31 -0
  36. data/lib/fog/openstack/models/identity_v3/os_credential.rb +73 -0
  37. data/lib/fog/openstack/models/identity_v3/os_credentials.rb +31 -0
  38. data/lib/fog/openstack/models/identity_v3/policies.rb +31 -0
  39. data/lib/fog/openstack/models/identity_v3/policy.rb +46 -0
  40. data/lib/fog/openstack/models/identity_v3/project.rb +98 -0
  41. data/lib/fog/openstack/models/identity_v3/projects.rb +31 -0
  42. data/lib/fog/openstack/models/identity_v3/role.rb +45 -0
  43. data/lib/fog/openstack/models/identity_v3/role_assignment.rb +22 -0
  44. data/lib/fog/openstack/models/identity_v3/role_assignments.rb +22 -0
  45. data/lib/fog/openstack/models/identity_v3/roles.rb +35 -0
  46. data/lib/fog/openstack/models/identity_v3/service.rb +47 -0
  47. data/lib/fog/openstack/models/identity_v3/services.rb +31 -0
  48. data/lib/fog/openstack/models/identity_v3/token.rb +26 -0
  49. data/lib/fog/openstack/models/identity_v3/tokens.rb +40 -0
  50. data/lib/fog/openstack/models/identity_v3/user.rb +87 -0
  51. data/lib/fog/openstack/models/identity_v3/users.rb +35 -0
  52. data/lib/fog/openstack/network.rb +2 -9
  53. data/lib/fog/openstack/orchestration.rb +1 -6
  54. data/lib/fog/openstack/planning.rb +1 -1
  55. data/lib/fog/openstack/requests/baremetal/set_node_maintenance.rb +36 -0
  56. data/lib/fog/openstack/requests/baremetal/set_node_power_state.rb +35 -0
  57. data/lib/fog/openstack/requests/baremetal/set_node_provision_state.rb +38 -0
  58. data/lib/fog/openstack/requests/baremetal/unset_node_maintenance.rb +36 -0
  59. data/lib/fog/openstack/requests/compute/create_flavor_metadata.rb +38 -0
  60. data/lib/fog/openstack/requests/compute/create_security_group.rb +1 -1
  61. data/lib/fog/openstack/requests/compute/delete_service.rb +32 -0
  62. data/lib/fog/openstack/requests/compute/disable_service.rb +37 -0
  63. data/lib/fog/openstack/requests/compute/disable_service_log_reason.rb +38 -0
  64. data/lib/fog/openstack/requests/compute/enable_service.rb +38 -0
  65. data/lib/fog/openstack/requests/compute/get_flavor_metadata.rb +27 -0
  66. data/lib/fog/openstack/requests/compute/list_services.rb +72 -0
  67. data/lib/fog/openstack/requests/compute/list_tenants_with_flavor_access.rb +1 -1
  68. data/lib/fog/openstack/requests/compute/list_zones.rb +32 -0
  69. data/lib/fog/openstack/requests/identity_v2/add_user_to_tenant.rb +36 -0
  70. data/lib/fog/openstack/requests/identity_v2/check_token.rb +22 -0
  71. data/lib/fog/openstack/requests/identity_v2/create_ec2_credential.rb +59 -0
  72. data/lib/fog/openstack/requests/identity_v2/create_role.rb +38 -0
  73. data/lib/fog/openstack/requests/identity_v2/create_tenant.rb +34 -0
  74. data/lib/fog/openstack/requests/identity_v2/create_user.rb +45 -0
  75. data/lib/fog/openstack/requests/identity_v2/create_user_role.rb +26 -0
  76. data/lib/fog/openstack/requests/identity_v2/delete_ec2_credential.rb +43 -0
  77. data/lib/fog/openstack/requests/identity_v2/delete_role.rb +30 -0
  78. data/lib/fog/openstack/requests/identity_v2/delete_tenant.rb +33 -0
  79. data/lib/fog/openstack/requests/identity_v2/delete_user.rb +30 -0
  80. data/lib/fog/openstack/requests/identity_v2/delete_user_role.rb +25 -0
  81. data/lib/fog/openstack/requests/identity_v2/get_ec2_credential.rb +50 -0
  82. data/lib/fog/openstack/requests/identity_v2/get_role.rb +30 -0
  83. data/lib/fog/openstack/requests/identity_v2/get_tenant.rb +33 -0
  84. data/lib/fog/openstack/requests/identity_v2/get_tenants_by_id.rb +20 -0
  85. data/lib/fog/openstack/requests/identity_v2/get_tenants_by_name.rb +20 -0
  86. data/lib/fog/openstack/requests/identity_v2/get_user_by_id.rb +34 -0
  87. data/lib/fog/openstack/requests/identity_v2/get_user_by_name.rb +29 -0
  88. data/lib/fog/openstack/requests/identity_v2/list_ec2_credentials.rb +45 -0
  89. data/lib/fog/openstack/requests/identity_v2/list_endpoints_for_token.rb +20 -0
  90. data/lib/fog/openstack/requests/identity_v2/list_roles.rb +33 -0
  91. data/lib/fog/openstack/requests/identity_v2/list_roles_for_user_on_tenant.rb +32 -0
  92. data/lib/fog/openstack/requests/identity_v2/list_tenants.rb +47 -0
  93. data/lib/fog/openstack/requests/identity_v2/list_user_global_roles.rb +20 -0
  94. data/lib/fog/openstack/requests/identity_v2/list_users.rb +35 -0
  95. data/lib/fog/openstack/requests/identity_v2/remove_user_from_tenant.rb +22 -0
  96. data/lib/fog/openstack/requests/identity_v2/set_tenant.rb +21 -0
  97. data/lib/fog/openstack/requests/identity_v2/update_tenant.rb +30 -0
  98. data/lib/fog/openstack/requests/identity_v2/update_user.rb +34 -0
  99. data/lib/fog/openstack/requests/identity_v2/validate_token.rb +22 -0
  100. data/lib/fog/openstack/requests/identity_v3/add_user_to_group.rb +20 -0
  101. data/lib/fog/openstack/requests/identity_v3/auth_domains.rb +29 -0
  102. data/lib/fog/openstack/requests/identity_v3/auth_projects.rb +29 -0
  103. data/lib/fog/openstack/requests/identity_v3/check_domain_group_role.rb +20 -0
  104. data/lib/fog/openstack/requests/identity_v3/check_domain_user_role.rb +20 -0
  105. data/lib/fog/openstack/requests/identity_v3/check_project_group_role.rb +20 -0
  106. data/lib/fog/openstack/requests/identity_v3/check_project_user_role.rb +20 -0
  107. data/lib/fog/openstack/requests/identity_v3/create_domain.rb +21 -0
  108. data/lib/fog/openstack/requests/identity_v3/create_endpoint.rb +21 -0
  109. data/lib/fog/openstack/requests/identity_v3/create_group.rb +21 -0
  110. data/lib/fog/openstack/requests/identity_v3/create_os_credential.rb +21 -0
  111. data/lib/fog/openstack/requests/identity_v3/create_policy.rb +21 -0
  112. data/lib/fog/openstack/requests/identity_v3/create_project.rb +21 -0
  113. data/lib/fog/openstack/requests/identity_v3/create_role.rb +21 -0
  114. data/lib/fog/openstack/requests/identity_v3/create_service.rb +21 -0
  115. data/lib/fog/openstack/requests/identity_v3/create_user.rb +21 -0
  116. data/lib/fog/openstack/requests/identity_v3/delete_domain.rb +20 -0
  117. data/lib/fog/openstack/requests/identity_v3/delete_endpoint.rb +20 -0
  118. data/lib/fog/openstack/requests/identity_v3/delete_group.rb +20 -0
  119. data/lib/fog/openstack/requests/identity_v3/delete_os_credential.rb +20 -0
  120. data/lib/fog/openstack/requests/identity_v3/delete_policy.rb +20 -0
  121. data/lib/fog/openstack/requests/identity_v3/delete_project.rb +20 -0
  122. data/lib/fog/openstack/requests/identity_v3/delete_role.rb +20 -0
  123. data/lib/fog/openstack/requests/identity_v3/delete_service.rb +20 -0
  124. data/lib/fog/openstack/requests/identity_v3/delete_user.rb +20 -0
  125. data/lib/fog/openstack/requests/identity_v3/get_domain.rb +23 -0
  126. data/lib/fog/openstack/requests/identity_v3/get_endpoint.rb +23 -0
  127. data/lib/fog/openstack/requests/identity_v3/get_group.rb +23 -0
  128. data/lib/fog/openstack/requests/identity_v3/get_os_credential.rb +23 -0
  129. data/lib/fog/openstack/requests/identity_v3/get_policy.rb +23 -0
  130. data/lib/fog/openstack/requests/identity_v3/get_project.rb +23 -0
  131. data/lib/fog/openstack/requests/identity_v3/get_role.rb +23 -0
  132. data/lib/fog/openstack/requests/identity_v3/get_service.rb +23 -0
  133. data/lib/fog/openstack/requests/identity_v3/get_user.rb +23 -0
  134. data/lib/fog/openstack/requests/identity_v3/grant_domain_group_role.rb +20 -0
  135. data/lib/fog/openstack/requests/identity_v3/grant_domain_user_role.rb +20 -0
  136. data/lib/fog/openstack/requests/identity_v3/grant_project_group_role.rb +20 -0
  137. data/lib/fog/openstack/requests/identity_v3/grant_project_user_role.rb +20 -0
  138. data/lib/fog/openstack/requests/identity_v3/group_user_check.rb +20 -0
  139. data/lib/fog/openstack/requests/identity_v3/list_domain_group_roles.rb +23 -0
  140. data/lib/fog/openstack/requests/identity_v3/list_domain_user_roles.rb +23 -0
  141. data/lib/fog/openstack/requests/identity_v3/list_domains.rb +31 -0
  142. data/lib/fog/openstack/requests/identity_v3/list_endpoints.rb +31 -0
  143. data/lib/fog/openstack/requests/identity_v3/list_group_users.rb +32 -0
  144. data/lib/fog/openstack/requests/identity_v3/list_groups.rb +42 -0
  145. data/lib/fog/openstack/requests/identity_v3/list_os_credentials.rb +29 -0
  146. data/lib/fog/openstack/requests/identity_v3/list_policies.rb +28 -0
  147. data/lib/fog/openstack/requests/identity_v3/list_project_group_roles.rb +23 -0
  148. data/lib/fog/openstack/requests/identity_v3/list_project_user_roles.rb +23 -0
  149. data/lib/fog/openstack/requests/identity_v3/list_projects.rb +42 -0
  150. data/lib/fog/openstack/requests/identity_v3/list_role_assignments.rb +35 -0
  151. data/lib/fog/openstack/requests/identity_v3/list_roles.rb +42 -0
  152. data/lib/fog/openstack/requests/identity_v3/list_services.rb +30 -0
  153. data/lib/fog/openstack/requests/identity_v3/list_user_groups.rb +23 -0
  154. data/lib/fog/openstack/requests/identity_v3/list_user_projects.rb +23 -0
  155. data/lib/fog/openstack/requests/identity_v3/list_users.rb +32 -0
  156. data/lib/fog/openstack/requests/identity_v3/remove_user_from_group.rb +20 -0
  157. data/lib/fog/openstack/requests/identity_v3/revoke_domain_group_role.rb +20 -0
  158. data/lib/fog/openstack/requests/identity_v3/revoke_domain_user_role.rb +20 -0
  159. data/lib/fog/openstack/requests/identity_v3/revoke_project_group_role.rb +20 -0
  160. data/lib/fog/openstack/requests/identity_v3/revoke_project_user_role.rb +20 -0
  161. data/lib/fog/openstack/requests/identity_v3/token_authenticate.rb +21 -0
  162. data/lib/fog/openstack/requests/identity_v3/token_check.rb +21 -0
  163. data/lib/fog/openstack/requests/identity_v3/token_revoke.rb +21 -0
  164. data/lib/fog/openstack/requests/identity_v3/token_validate.rb +22 -0
  165. data/lib/fog/openstack/requests/identity_v3/update_domain.rb +21 -0
  166. data/lib/fog/openstack/requests/identity_v3/update_endpoint.rb +21 -0
  167. data/lib/fog/openstack/requests/identity_v3/update_group.rb +21 -0
  168. data/lib/fog/openstack/requests/identity_v3/update_os_credential.rb +21 -0
  169. data/lib/fog/openstack/requests/identity_v3/update_policy.rb +21 -0
  170. data/lib/fog/openstack/requests/identity_v3/update_project.rb +21 -0
  171. data/lib/fog/openstack/requests/identity_v3/update_role.rb +21 -0
  172. data/lib/fog/openstack/requests/identity_v3/update_service.rb +21 -0
  173. data/lib/fog/openstack/requests/identity_v3/update_user.rb +21 -0
  174. data/lib/fog/openstack/requests/image/list_public_images_detailed.rb +1 -1
  175. data/lib/fog/openstack/volume.rb +1 -1
  176. data/lib/fog/version.rb +1 -1
  177. data/lib/fog/vsphere/requests/compute/cloudinit_to_customspec.rb +27 -8
  178. data/lib/fog/vsphere/requests/compute/vm_clone.rb +376 -37
  179. data/lib/tasks/changelog_task.rb +1 -1
  180. data/spec/fog/openstack/identity_v3/authv3_a.yml +61 -0
  181. data/spec/fog/openstack/identity_v3/authv3_b.yml +61 -0
  182. data/spec/fog/openstack/identity_v3/authv3_c.yml +61 -0
  183. data/spec/fog/openstack/identity_v3/authv3_project.yml +61 -0
  184. data/spec/fog/openstack/identity_v3/authv3_token.yml +151 -0
  185. data/spec/fog/openstack/identity_v3/authv3_unscoped.yml +334 -0
  186. data/spec/fog/openstack/identity_v3/idv2_unscoped_token_v3.yml +467 -0
  187. data/spec/fog/openstack/identity_v3/idv3.yml +61 -0
  188. data/spec/fog/openstack/identity_v3/idv3_credential.yml +111 -0
  189. data/spec/fog/openstack/identity_v3/idv3_credential_crud.yml +528 -0
  190. data/spec/fog/openstack/identity_v3/idv3_domain.yml +195 -0
  191. data/spec/fog/openstack/identity_v3/idv3_domain_crud.yml +686 -0
  192. data/spec/fog/openstack/identity_v3/idv3_domain_group_roles_mutation.yml +906 -0
  193. data/spec/fog/openstack/identity_v3/idv3_domain_roles_mutation.yml +505 -0
  194. data/spec/fog/openstack/identity_v3/idv3_endpoint.yml +303 -0
  195. data/spec/fog/openstack/identity_v3/idv3_endpoints_crud.yml +718 -0
  196. data/spec/fog/openstack/identity_v3/idv3_group_crud_mutation.yml +975 -0
  197. data/spec/fog/openstack/identity_v3/idv3_policy.yml +147 -0
  198. data/spec/fog/openstack/identity_v3/idv3_policy_crud.yml +368 -0
  199. data/spec/fog/openstack/identity_v3/idv3_project.yml +211 -0
  200. data/spec/fog/openstack/identity_v3/idv3_project_crud.yml +663 -0
  201. data/spec/fog/openstack/identity_v3/idv3_project_group_user_roles_mutation.yml +1378 -0
  202. data/spec/fog/openstack/identity_v3/idv3_role.yml +199 -0
  203. data/spec/fog/openstack/identity_v3/idv3_role_crud.yml +616 -0
  204. data/spec/fog/openstack/identity_v3/idv3_service.yml +223 -0
  205. data/spec/fog/openstack/identity_v3/idv3_services_crud.yml +562 -0
  206. data/spec/fog/openstack/identity_v3/idv3_token.yml +240 -0
  207. data/spec/fog/openstack/identity_v3/idv3_user_crud.yml +572 -0
  208. data/spec/fog/openstack/identity_v3/idv3_users.yml +393 -0
  209. data/spec/fog/openstack/identity_v3_spec.rb +929 -0
  210. data/tests/openstack/requests/baremetal/node_tests.rb +18 -0
  211. data/tests/openstack/requests/compute/flavor_tests.rb +18 -0
  212. data/tests/openstack/requests/compute/service_tests.rb +33 -0
  213. metadata +259 -49
  214. data/lib/fog/openstack/models/identity/ec2_credential.rb +0 -44
  215. data/lib/fog/openstack/models/identity/ec2_credentials.rb +0 -53
  216. data/lib/fog/openstack/models/identity/role.rb +0 -50
  217. data/lib/fog/openstack/models/identity/roles.rb +0 -20
  218. data/lib/fog/openstack/models/identity/tenant.rb +0 -62
  219. data/lib/fog/openstack/models/identity/tenants.rb +0 -29
  220. data/lib/fog/openstack/models/identity/user.rb +0 -69
  221. data/lib/fog/openstack/models/identity/users.rb +0 -41
  222. data/lib/fog/openstack/requests/identity/add_user_to_tenant.rb +0 -34
  223. data/lib/fog/openstack/requests/identity/check_token.rb +0 -20
  224. data/lib/fog/openstack/requests/identity/create_ec2_credential.rb +0 -57
  225. data/lib/fog/openstack/requests/identity/create_role.rb +0 -36
  226. data/lib/fog/openstack/requests/identity/create_tenant.rb +0 -32
  227. data/lib/fog/openstack/requests/identity/create_user.rb +0 -43
  228. data/lib/fog/openstack/requests/identity/create_user_role.rb +0 -24
  229. data/lib/fog/openstack/requests/identity/delete_ec2_credential.rb +0 -42
  230. data/lib/fog/openstack/requests/identity/delete_role.rb +0 -28
  231. data/lib/fog/openstack/requests/identity/delete_tenant.rb +0 -31
  232. data/lib/fog/openstack/requests/identity/delete_user.rb +0 -28
  233. data/lib/fog/openstack/requests/identity/delete_user_role.rb +0 -23
  234. data/lib/fog/openstack/requests/identity/get_ec2_credential.rb +0 -48
  235. data/lib/fog/openstack/requests/identity/get_role.rb +0 -28
  236. data/lib/fog/openstack/requests/identity/get_tenant.rb +0 -31
  237. data/lib/fog/openstack/requests/identity/get_tenants_by_id.rb +0 -18
  238. data/lib/fog/openstack/requests/identity/get_tenants_by_name.rb +0 -18
  239. data/lib/fog/openstack/requests/identity/get_user_by_id.rb +0 -32
  240. data/lib/fog/openstack/requests/identity/get_user_by_name.rb +0 -27
  241. data/lib/fog/openstack/requests/identity/list_ec2_credentials.rb +0 -43
  242. data/lib/fog/openstack/requests/identity/list_endpoints_for_token.rb +0 -18
  243. data/lib/fog/openstack/requests/identity/list_roles.rb +0 -31
  244. data/lib/fog/openstack/requests/identity/list_roles_for_user_on_tenant.rb +0 -30
  245. data/lib/fog/openstack/requests/identity/list_tenants.rb +0 -45
  246. data/lib/fog/openstack/requests/identity/list_user_global_roles.rb +0 -18
  247. data/lib/fog/openstack/requests/identity/list_users.rb +0 -33
  248. data/lib/fog/openstack/requests/identity/remove_user_from_tenant.rb +0 -20
  249. data/lib/fog/openstack/requests/identity/set_tenant.rb +0 -19
  250. data/lib/fog/openstack/requests/identity/update_tenant.rb +0 -28
  251. data/lib/fog/openstack/requests/identity/update_user.rb +0 -32
  252. data/lib/fog/openstack/requests/identity/validate_token.rb +0 -20
@@ -58,7 +58,16 @@ module Fog
58
58
  # * 'numCPUs'<~Integer> - the number of Virtual CPUs of the Destination VM
59
59
  # * 'memoryMB'<~Integer> - the size of memory of the Destination VM in MB
60
60
  # * customization_spec<~Hash>: Options are marked as required if you
61
- # use this customization_spec. Static IP Settings not configured.
61
+ # use this customization_spec.
62
+ # As defined https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Specification.html
63
+ # * encryptionKey <~array of bytes> Used to encrypt/decrypt password
64
+ # * globalIPSettings expects a hash, REQUIRED
65
+ # * identity expects a hash, REQUIRED - either LinuxPrep, Sysprep or SysprepText
66
+ # * nicSettingMap expects an array
67
+ # * options expects a hash
68
+ # * All options can be parsed using a yaml template with cloudinit_to_customspec.rb
69
+ #
70
+ # OLD Values still supported:
62
71
  # This only support cloning and setting DHCP on the first interface
63
72
  # * 'domain'<~String> - *REQUIRED* This is put into
64
73
  # /etc/resolve.conf (we hope)
@@ -156,52 +165,382 @@ module Fog
156
165
  virtual_machine_config_spec.memoryHotAddEnabled = options['memoryHotAddEnabled'] if ( options.key?('memoryHotAddEnabled') )
157
166
  virtual_machine_config_spec.firmware = options['firmware'] if ( options.key?('firmware') )
158
167
  # Options['customization_spec']
159
- # Build up all the crappy tiered objects like the perl method
160
- # Collect your variables ifset (writing at 11pm revist me)
168
+ # OLD Options still supported
161
169
  # * domain <~String> - *REQUIRED* - Sets the server's domain for customization
162
170
  # * dnsSuffixList <~Array> - Optional - Sets the dns search paths in resolv - Example: ["dev.example.com", "example.com"]
171
+ # * time_zone <~String> - Required - Only valid linux options are valid - example: 'America/Denver'
163
172
  # * ipsettings <~Hash> - Optional - If not set defaults to dhcp
164
173
  # * ip <~String> - *REQUIRED* Sets the ip address of the VM - Example: 10.0.0.10
165
174
  # * dnsServerList <~Array> - Optional - Sets the nameservers in resolv - Example: ["10.0.0.2", "10.0.0.3"]
166
175
  # * gateway <~Array> - Optional - Sets the gateway for the interface - Example: ["10.0.0.1"]
167
176
  # * subnetMask <~String> - *REQUIRED* - Set the netmask of the interface - Example: "255.255.255.0"
168
177
  # For other ip settings options see http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.vm.customization.IPSettings.html
178
+ #
179
+ # Implement complete customization spec as per https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Specification.html
180
+ # * encryptionKey <~Array> - Optional, encryption key used to encypt any encrypted passwords
181
+ # https://pubs.vmware.com/vsphere-51/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.GlobalIPSettings.html
182
+ # * globalIPSettings <~Hash> - REQUIRED
183
+ # * dnsServerList <~Array> - Optional, list of dns servers - Example: ["10.0.0.2", "10.0.0.3"]
184
+ # * dnsSuffixList <~Array> - Optional, List of name resolution suffixes - Example: ["dev.example.com", "example.com"]
185
+ # * identity <~Hash> - REQUIRED, Network identity and settings, similar to Microsoft's Sysprep tool. This is a Sysprep, LinuxPrep, or SysprepText object
186
+ # * Sysprep <~Hash> - Optional, representation of a Windows sysprep.inf answer file.
187
+ # * guiRunOnce: <~Hash> -Optional, representation of the sysprep GuiRunOnce key
188
+ # * commandList: <~Array> - REQUIRED, list of commands to run at first user logon, after guest customization. - Example: ["c:\sysprep\runaftersysprep.cmd", "c:\sysprep\installpuppet.ps1"]
189
+ # * guiUnattended: <~Hash> - REQUIRED, representation of the sysprep GuiUnattended key
190
+ # * autoLogin: boolean - REQUIRED, Flag to determine whether or not the machine automatically logs on as Administrator.
191
+ # * autoLogonCount: int - REQUIRED, specifies the number of times the machine should automatically log on as Administrator
192
+ # * password: <~Hash> - REQUIRED, new administrator password for the machine
193
+ # * plainText: boolean - REQUIRED, specify whether or not the password is in plain text, rather than encrypted
194
+ # * value: <~String> - REQUIRED, password string
195
+ # * timeZone: <~int> - REQUIRED, (see here for values https://msdn.microsoft.com/en-us/library/ms912391(v=winembedded.11).aspx)
196
+ # * identification: <~Hash> - REQUIRED, representation of the sysprep Identification key
197
+ # * domainAdmin: <~String> - Optional, domain user account used for authentication if the virtual machine is joining a domain
198
+ # * domainAdminPassword: <~Hash> - Optional, password for the domain user account used for authentication
199
+ # * plainText: boolean - REQUIRED, specify whether or not the password is in plain text, rather than encrypted
200
+ # * value: <~String> - REQUIRED, password string
201
+ # * joinDomain: <~String> - Optional, The domain that the virtual machine should join. If this value is supplied, then domainAdmin and domainAdminPassword must also be supplied
202
+ # * joinWorkgroup: <~String> - Optional, The workgroup that the virtual machine should join.
203
+ # * licenseFilePrintData: <~Hash> - Optional, representation of the sysprep LicenseFilePrintData key
204
+ # * autoMode: <~String> - REQUIRED, Server licensing mode. Two strings are supported: 'perSeat' or 'perServer'
205
+ # * autoUsers: <~Int> - Optional, This key is valid only if AutoMode = PerServer. The integer value indicates the number of client licenses
206
+ # * userData: <~Hash> - REQUIRED, representation of the sysprep UserData key
207
+ # * computerName: <~String> - REQUIRED, The computer name of the (Windows) virtual machine. Will be truncates to 15 characters
208
+ # * fullName: <~String> - REQUIRED, User's full name
209
+ # * orgName: <~String> - REQUIRED, User's organization
210
+ # * productId: <~String> - REQUIRED, serial number for os, ignored if using volume licensed instance
211
+ # * LinuxPrep: <~Hash> - Optional, contains machine-wide settings (note the uppercase P)
212
+ # * domain: <~String> - REQUIRED, The fully qualified domain name.
213
+ # * hostName: <~String> - REQUIRED, the network host name
214
+ # * hwClockUTC: <~Boolean> - Optional, Specifies whether the hardware clock is in UTC or local time
215
+ # * timeZone: <~String> - Optional, Case sensistive timezone, valid values can be found at https://pubs.vmware.com/vsphere-51/topic/com.vmware.wssdk.apiref.doc/timezone.html
216
+ # * SysprepText: <~Hash> - Optional, alternate way to specify the sysprep.inf answer file.
217
+ # * value: <~String> - REQUIRED, Text for the sysprep.inf answer file.
218
+ # * nicSettingMap: <~Array> - Optional, IP settings that are specific to a particular virtual network adapter
219
+ # * Each item in array:
220
+ # * adapter: <~Hash> - REQUIRED, IP settings for the associated virtual network adapter
221
+ # * dnsDomain: <~String> - Optional, DNS domain suffix for adapter
222
+ # * dnsServerList: <~Array> - Optional, list of dns server ip addresses - Example: ["10.0.0.2", "10.0.0.3"]
223
+ # * gateway: <~Array> - Optional, list of gateways - Example: ["10.0.0.2", "10.0.0.3"]
224
+ # * ip: <~String> - Optional, but required if static IP
225
+ # * ipV6Spec: <~Hash> - Optional, IPv^ settings
226
+ # * ipAddress: <~String> - Optional, but required if setting static IP
227
+ # * gateway: <~Array> - Optional, list of ipv6 gateways
228
+ # * netBIOS: <~String> - Optional, NetBIOS settings, if supplied must be one of: disableNetBIOS','enableNetBIOS','enableNetBIOSViaDhcp'
229
+ # * primaryWINS: <~String> - Optional, IP address of primary WINS server
230
+ # * secondaryWINS: <~String> - Optional, IP address of secondary WINS server
231
+ # * subnetMask: <~String> - Optional, subnet mask for adapter
232
+ # * macAddress: <~String> - Optional, MAC address of adapter being customized. This cannot be set by the client
233
+ # * options: <~Hash> Optional operations, currently only win options have any value
234
+ # * changeSID: <~Boolean> - REQUIRED, The customization process should modify the machine's security identifier
235
+ # * deleteAccounts: <~Boolean> - REQUIRED, If deleteAccounts is true, then all user accounts are removed from the system
236
+ # * reboot: <~String> - Optional, (defaults to reboot), Action to be taken after running sysprep, must be one of: 'noreboot', 'reboot', 'shutdown'
237
+ #
169
238
  if ( options.key?('customization_spec') )
170
- cust_options = options['customization_spec']
171
- if cust_options.key?("ipsettings")
172
- raise ArgumentError, "ip and subnetMask is required for static ip" unless cust_options["ipsettings"].key?("ip") and
173
- cust_options["ipsettings"].key?("subnetMask")
239
+ custom_spec = options['customization_spec']
240
+
241
+ # backwards compatablity
242
+ if custom_spec.key?('domain')
243
+ # doing this means the old options quash any new ones passed as well... might not be the best way to do it?
244
+ # any 'old' options overwrite the following:
245
+ # - custom_spec['identity']['LinuxPrep']
246
+ # - custom_spec['globalIPSettings['['dnsServerList']
247
+ # - custom_spec['globalIPSettings']['dnsSuffixList']
248
+ # - custom_spec['nicSettingMap'][0]['adapter']['ip']
249
+ # - custom_spec['nicSettingMap'][0]['adapter']['gateway']
250
+ # - custom_spec['nicSettingMap'][0]['adapter']['subnetMask']
251
+ # - custom_spec['nicSettingMap'][0]['adapter']['dnsDomain']
252
+ # - custom_spec['nicSettingMap'][0]['adapter']['dnsServerList']
253
+ #
254
+ # we can assume old parameters being passed
255
+ cust_hostname = custom_spec['hostname'] || options['name']
256
+ custom_spec['identity'] = Hash.new unless custom_spec.key?('identity')
257
+ custom_spec['identity']['LinuxPrep'] = {"domain" => custom_spec['domain'], "hostName" => cust_hostname, "timeZone" => custom_spec['time_zone']}
258
+
259
+ if custom_spec.key?('ipsettings')
260
+ custom_spec['globalIPSettings']=Hash.new unless custom_spec.key?('globalIPSettings')
261
+ custom_spec['globalIPSettings']['dnsServerList'] = custom_spec['ipsettings']['dnsServerList'] if custom_spec['ipsettings'].key?('dnsServerList')
262
+ custom_spec['globalIPSettings']['dnsSuffixList'] = custom_spec['dnsSuffixList'] || [custom_spec['domain']] if ( custom_spec['dnsSuffixList'] || custom_spec['domain'])
263
+ end
264
+
265
+ if (custom_spec['ipsettings'].key?('ip') or custom_spec['ipsettings'].key?('gateway') or custom_spec['ipsettings'].key?('subnetMask') or custom_spec['ipsettings'].key?('domain') or custom_spec['ipsettings'].key?('dnsServerList'))
266
+ if custom_spec['ipsettings'].key?('ip')
267
+ raise ArgumentError, "subnetMask is required for static ip" unless custom_spec["ipsettings"].key?("subnetMask")
268
+ end
269
+ custom_spec['nicSettingMap']=Array.new unless custom_spec.key?('nicSettingMap')
270
+ custom_spec['nicSettingMap'][0]=Hash.new unless custom_spec['nicSettingMap'].length > 0
271
+ custom_spec['nicSettingMap'][0]['adapter']=Hash.new unless custom_spec['nicSettingMap'][0].key?('adapter')
272
+ custom_spec['nicSettingMap'][0]['adapter']['ip'] = custom_spec['ipsettings']['ip'] if custom_spec['ipsettings'].key?('ip')
273
+ custom_spec['nicSettingMap'][0]['adapter']['gateway'] = custom_spec['ipsettings']['gateway'] if custom_spec['ipsettings'].key?('gateway')
274
+ custom_spec['nicSettingMap'][0]['adapter']['subnetMask'] = custom_spec['ipsettings']['subnetMask'] if custom_spec['ipsettings'].key?('subnetMask')
275
+ custom_spec['nicSettingMap'][0]['adapter']['dnsDomain'] = custom_spec['ipsettings']['domain'] if custom_spec['ipsettings'].key?('domain')
276
+ custom_spec['nicSettingMap'][0]['adapter']['dnsServerList'] = custom_spec['ipsettings']['dnsServerList'] if custom_spec['ipsettings'].key?('dnsServerList')
277
+ end
278
+ end
279
+ ### End of backwards compatability
280
+
281
+ ## requirements check here ##
282
+ raise ArgumentError, "globalIPSettings are required when using Customization Spec" unless custom_spec.key?('globalIPSettings')
283
+ raise ArgumentError, "identity is required when using Customization Spec" unless custom_spec.key?('identity')
284
+
285
+ # encryptionKey
286
+ custom_encryptionKey = custom_spec['encryptionKey'] if custom_spec.key?('encryptionKey')
287
+ custom_encryptionKey ||= nil
288
+
289
+ # globalIPSettings
290
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.GlobalIPSettings.html
291
+ custom_globalIPSettings = RbVmomi::VIM::CustomizationGlobalIPSettings.new()
292
+ custom_globalIPSettings.dnsServerList = custom_spec['globalIPSettings']['dnsServerList'] if custom_spec['globalIPSettings'].key?("dnsServerList")
293
+ custom_globalIPSettings.dnsSuffixList = custom_spec['globalIPSettings']['dnsSuffixList'] if custom_spec['globalIPSettings'].key?("dnsSuffixList")
294
+
295
+ # identity
296
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.IdentitySettings.html
297
+ # Accepts the 3 supported CustomizationIdentitySettings Types:
298
+ # 1. CustomizationLinuxPrep (LinuxPrep) - note the uppercase P
299
+ # 2. CustomizationSysprep (Sysprep)
300
+ # 3. CustomizationSysprepText (SysprepText)
301
+ # At least one of these is required
302
+ #
303
+ identity = custom_spec['identity']
304
+ if identity.key?("LinuxPrep")
305
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.LinuxPrep.html
306
+ # Fields:
307
+ # * domain: string **REQUIRED**
308
+ # * hostName: string (CustomizationName) **REQUIRED** Will use options['name'] if not provided.
309
+ # * hwClockUTC: boolean
310
+ # * timeZone: string (https://pubs.vmware.com/vsphere-55/topic/com.vmware.wssdk.apiref.doc/timezone.html)
311
+ raise ArgumentError, "domain is required when using LinuxPrep identity" unless identity['LinuxPrep'].key?('domain')
312
+ custom_identity = RbVmomi::VIM::CustomizationLinuxPrep(:domain => identity['LinuxPrep']['domain'])
313
+ cust_hostname = RbVmomi::VIM::CustomizationFixedName(:name => identity['LinuxPrep']['hostName']) if identity['LinuxPrep'].key?('hostName')
314
+ cust_hostname ||= RbVmomi::VIM::CustomizationFixedName(:name => options['name'])
315
+ custom_identity.hostName = cust_hostname
316
+ custom_identity.hwClockUTC = identity['LinuxPrep']['hwClockUTC'] if identity['LinuxPrep'].key?('hwClockUTC')
317
+ custom_identity.timeZone = identity['LinuxPrep']['timeZone'] if identity['LinuxPrep'].key?('timeZone')
318
+ elsif identity.key?("Sysprep")
319
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Sysprep.html
320
+ # Fields:
321
+ # * guiRunOnce: CustomizationGuiRunOnce
322
+ # * guiUnattended: CustomizationGuiUnattended **REQUIRED**
323
+ # * identification: CustomizationIdentification **REQUIRED**
324
+ # * licenseFilePrintData: CustomizationLicenseFilePrintData
325
+ # * userData: CustomizationUserData **REQUIRED**
326
+ #
327
+ raise ArgumentError, "guiUnattended is required when using Sysprep identity" unless identity['Sysprep'].key?('guiUnattended')
328
+ raise ArgumentError, "identification is required when using Sysprep identity" unless identity['Sysprep'].key?('identification')
329
+ raise ArgumentError, "userData is required when using Sysprep identity" unless identity['Sysprep'].key?('userData')
330
+ if identity['Sysprep']['guiRunOnce']
331
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.GuiRunOnce.html
332
+ # Fields:
333
+ # * commandList: array of string **REQUIRED***
334
+ #
335
+ raise ArgumentError, "commandList is required when using Sysprep identity and guiRunOnce" unless identity['Sysprep']['guiRunOnce'].key?('commandList')
336
+ cust_guirunonce = RbVmomi::VIM.CustomizationGuiRunOnce( :commandList => identity['Sysprep']['guiRunOnce']['commandList'] )
337
+ end
338
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.GuiUnattended.html
339
+ # Fields:
340
+ # * autoLogin: boolean **REQUIRED**
341
+ # * autoLogonCount: int **REQUIRED**
342
+ # * timeZone: int (see here for values https://msdn.microsoft.com/en-us/library/ms912391(v=winembedded.11).aspx) **REQUIRED**
343
+ # * password: CustomizationPassword
344
+ raise ArgumentError, "guiUnattended->autoLogon is required when using Sysprep identity" unless identity['Sysprep']['guiUnattended'].key?('autoLogon')
345
+ raise ArgumentError, "guiUnattended->autoLogonCount is required when using Sysprep identity" unless identity['Sysprep']['guiUnattended'].key?('autoLogonCount')
346
+ raise ArgumentError, "guiUnattended->timeZone is required when using Sysprep identity" unless identity['Sysprep']['guiUnattended'].key?('timeZone')
347
+ custom_guiUnattended = RbVmomi::VIM.CustomizationGuiUnattended(
348
+ :autoLogon => identity['Sysprep']['guiUnattended']['autoLogon'],
349
+ :autoLogonCount => identity['Sysprep']['guiUnattended']['autoLogonCount'],
350
+ :timeZone => identity['Sysprep']['guiUnattended']['timeZone']
351
+ )
352
+ if identity['Sysprep']['guiUnattended']['password']
353
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Password.html
354
+ # Fields:
355
+ # * plainText: boolean **REQUIRED**
356
+ # * value: string **REQUIRED**
357
+ raise ArgumentError, "guiUnattended->password->plainText is required when using Sysprep identity and guiUnattended -> password" unless identity['Sysprep']['guiUnattended']['password'].key?('plainText')
358
+ raise ArgumentError, "guiUnattended->password->value is required when using Sysprep identity and guiUnattended -> password" unless identity['Sysprep']['guiUnattended']['password'].key?('value')
359
+ custom_guiUnattended.password = RbVmomi::VIM.CustomizationPassword(
360
+ :plainText => identity['Sysprep']['guiUnattended']['password']['plainText'],
361
+ :value => identity['Sysprep']['guiUnattended']['password']['value']
362
+ )
363
+ end
364
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Identification.html
365
+ # Fields:
366
+ # * domainAdmin: string
367
+ # * domainAdminPassword: CustomizationPassword
368
+ # * joinDomain: string *If supplied domainAdmin and domainAdminPassword must be set
369
+ # * joinWorkgroup: string *If supplied, joinDomain, domainAdmin and domainAdminPassword will be ignored
370
+ custom_identification = RbVmomi::VIM.CustomizationIdentification()
371
+ if identity['Sysprep']['identification'].key?('joinWorkgroup')
372
+ custom_identification.joinWorkgroup = identity['Sysprep']['identification']['joinWorkgroup']
373
+ elsif identity['Sysprep']['identification'].key?('joinDomain')
374
+ raise ArgumentError, "identification->domainAdmin is required when using Sysprep identity and identification -> joinDomain" unless identity['Sysprep']['identification'].key?('domainAdmin')
375
+ raise ArgumentError, "identification->domainAdminPassword is required when using Sysprep identity and identification -> joinDomain" unless identity['Sysprep']['identification'].key?('domainAdmin')
376
+ raise ArgumentError, "identification->domainAdminPassword->plainText is required when using Sysprep identity and identification -> joinDomain" unless identity['Sysprep']['identification']['domainAdminPassword'].key?('plainText')
377
+ raise ArgumentError, "identification->domainAdminPassword->value is required when using Sysprep identity and identification -> joinDomain" unless identity['Sysprep']['identification']['domainAdminPassword'].key?('value')
378
+ custom_identification.joinDomain = identity['Sysprep']['identification']['joinDomain']
379
+ custom_identification.domainAdmin = identity['Sysprep']['identification']['domainAdmin']
380
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Password.html
381
+ # Fields:
382
+ # * plainText: boolean **REQUIRED**
383
+ # * value: string **REQUIRED**
384
+ custom_identification.domainAdminPassword = RbVmomi::VIM.CustomizationPassword(
385
+ :plainText => identity['Sysprep']['identification']['domainAdminPassword']['plainText'],
386
+ :value => identity['Sysprep']['identification']['domainAdminPassword']['value']
387
+ )
388
+ else
389
+ raise ArgumentError, "No valid Indentification found, valid values are 'joinWorkgroup' and 'joinDomain'"
390
+ end
391
+ if identity['Sysprep'].key?('licenseFilePrintData')
392
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.LicenseFilePrintData.html
393
+ # Fields:
394
+ # * autoMode: string (CustomizationLicenseDataMode) ** REQUIRED **, valid strings are: 'perSeat' or 'perServer'
395
+ # * autoUsers: int (valid only if AutoMode = PerServer)
396
+ raise ArgumentError, "licenseFilePrintData->autoMode is required when using Sysprep identity and licenseFilePrintData" unless identity['Sysprep']['licenseFilePrintData'].key?('autoMode')
397
+ raise ArgumentError, "Unsupported autoMode, supported modes are : 'perSeat' or 'perServer'" unless ['perSeat', 'perServer'].include? identity['Sysprep']['licenseFilePrintData']['autoMode']
398
+ custom_licenseFilePrintData = RbVmomi::VIM.CustomizationLicenseFilePrintData(
399
+ :autoMode => RbVmomi::VIM.CustomizationLicenseDataMode(identity['Sysprep']['licenseFilePrintData']['autoMode'])
400
+ )
401
+ if identity['Sysprep']['licenseFilePrintData'].key?('autoUsers')
402
+ custom_licenseFilePrintData.autoUsers = identity['Sysprep']['licenseFilePrintData']['autoUsers'] if identity['Sysprep']['licenseFilePrintData']['autoMode'] == "PerServer"
403
+ end
404
+ end
405
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.UserData.html
406
+ # Fields:
407
+ # * computerName: string (CustomizationFixedName) **REQUIRED**
408
+ # * fullName: string **REQUIRED**
409
+ # * orgName: string **REQUIRED**
410
+ # * productID: string **REQUIRED**
411
+ raise ArgumentError, "userData->computerName is required when using Sysprep identity" unless identity['Sysprep']['userData'].key?('computerName')
412
+ raise ArgumentError, "userData->fullName is required when using Sysprep identity" unless identity['Sysprep']['userData'].key?('fullName')
413
+ raise ArgumentError, "userData->orgName is required when using Sysprep identity" unless identity['Sysprep']['userData'].key?('orgName')
414
+ raise ArgumentError, "userData->productId is required when using Sysprep identity" unless identity['Sysprep']['userData'].key?('productId')
415
+ custom_userData = RbVmomi::VIM.CustomizationUserData(
416
+ :fullName => identity['Sysprep']['userData']['fullName'],
417
+ :orgName => identity['Sysprep']['userData']['orgName'],
418
+ :productId => identity['Sysprep']['userData']['productId'],
419
+ :computerName => RbVmomi::VIM.CustomizationFixedName(:name => identity['Sysprep']['userData']['computerName'])
420
+ )
421
+
422
+ custom_identity = RbVmomi::VIM::CustomizationSysprep(
423
+ :guiUnattended => custom_guiUnattended,
424
+ :identification => custom_identification,
425
+ :userData => custom_userData
426
+ )
427
+ custom_identity.guiRunOnce = cust_guirunonce if defined?(cust_guirunonce)
428
+ custom_identity.licenseFilePrintData = custom_licenseFilePrintData if defined?(custom_licenseFilePrintData)
429
+ elsif identity.key?("SysprepText")
430
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.SysprepText.html
431
+ # Fields:
432
+ # * value: string **REQUIRED**
433
+ raise ArgumentError, "SysprepText -> value is required when using SysprepText identity" unless identity['SysprepText'].key?('value')
434
+ custom_identity = RbVmomi::VIM::CustomizationSysprepText(:value => identity['SysprepText']['value'])
435
+ else
436
+ raise ArgumentError, "At least one of the following valid identities must be supplied: LinuxPrep, Sysprep, SysprepText"
174
437
  end
175
- raise ArgumentError, "domain is required" unless cust_options.key?("domain")
176
- cust_domain = cust_options['domain']
177
- if cust_options.key?("ipsettings")
178
- cust_ip_settings = RbVmomi::VIM::CustomizationIPSettings.new(cust_options["ipsettings"])
179
- cust_ip_settings.ip = RbVmomi::VIM::CustomizationFixedIp("ipAddress" => cust_options["ipsettings"]["ip"])
180
- cust_ip_settings.gateway = cust_options['ipsettings']['gateway']
438
+
439
+ if custom_spec.key?("nicSettingMap")
440
+ # custom_spec['nicSettingMap'] is an array of adapater mappings:
441
+ # custom_spec['nicSettingMap'][0]['macAddress']
442
+ # custom_spec['nicSettingMap'][0]['adapter']['ip']
443
+ #https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.AdapterMapping.html
444
+ # Fields:
445
+ # * adapter: CustomizationIPSettings **REQUIRED**
446
+ # * macAddress: string
447
+ raise ArgumentError, "At least one nicSettingMap is required when using nicSettingMap" unless custom_spec['nicSettingMap'].length > 0
448
+ raise ArgumentError, "Adapter is required when using nicSettingMap" unless custom_spec['nicSettingMap'][0].key?('adapter')
449
+
450
+ custom_nicSettingMap = []
451
+ # need to go through array here for each apapter
452
+ custom_spec['nicSettingMap'].each do | nic |
453
+ # https://pubs.vmware.com/vsphere-55/index.jsp?topic=%2Fcom.vmware.wssdk.apiref.doc%2Fvim.vm.customization.IPSettings.html
454
+ # Fields:
455
+ # * dnsDomain: string
456
+ # * gateway: array of string
457
+ # * ip: CustomizationIpGenerator (string) **REQUIRED IF Assigning Static IP***
458
+ # * ipV6Spec: CustomizationIPSettingsIpV6AddressSpec
459
+ # * netBIOS: CustomizationNetBIOSMode (string)
460
+ # * primaryWINS: string
461
+ # * secondaryWINS: string
462
+ # * subnetMask: string - Required if assigning static IP
463
+ if nic['adapter'].key?('ip')
464
+ raise ArgumentError, "SubnetMask is required when assigning static IP when using nicSettingMap -> Adapter" unless nic['adapter'].key?('subnetMask')
465
+ custom_ip = RbVmomi::VIM.CustomizationFixedIp(:ipAddress => nic['adapter']['ip'])
466
+ else
467
+ custom_ip = RbVmomi::VIM::CustomizationDhcpIpGenerator.new()
468
+ end
469
+ custom_adapter = RbVmomi::VIM.CustomizationIPSettings(:ip => custom_ip)
470
+ custom_adapter.dnsDomain = nic['adapter']['dnsDomain'] if nic['adapter'].key?('dnsDomain')
471
+ custom_adapter.dnsServerList = nic['adapter']['dnsServerList'] if nic['adapter'].key?('dnsServerList')
472
+ custom_adapter.gateway = nic['adapter']['gateway'] if nic['adapter'].key?('gateway')
473
+ if nic['adapter'].key?('ipV6Spec')
474
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.IPSettings.IpV6AddressSpec.html
475
+ # Fields:
476
+ # * gateway: array of string
477
+ # * ip: CustomizationIpV6Generator[] **Required if setting static IP **
478
+ if nic['adapter']['ipV6Spec'].key?('ipAddress')
479
+ raise ArgumentError, "SubnetMask is required when assigning static IPv6 when using nicSettingMap -> Adapter -> ipV6Spec" unless nic['adapter']['ipV6Spec'].key?('subnetMask')
480
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.FixedIpV6.html
481
+ # * ipAddress: string **REQUIRED**
482
+ # * subnetMask: int **REQUIRED**
483
+ custom_ipv6 = RbVmomi::VIM.CustomizationFixedIpV6(
484
+ :ipAddress => nic['adapter']['ipV6Spec']['ipAddress'],
485
+ :subnetMask => nic['adapter']['ipV6Spec']['subnetMask']
486
+ )
487
+ else
488
+ custom_ipv6 = RbVmomi::VIM::CustomizationDhcpIpV6Generator.new()
489
+ end
490
+ custom_ipv6Spec = RbVmomo::VIM.CustomizationIPSettingsIpV6AddressSpec(:ip => custom_ipv6)
491
+ custom_ipv6Spec.gateway = nic['adapter']['ipV6Spec']['gateway'] if nic['adapter']['ipV6Spec'].key?('gateway')
492
+ custom_adapter.ipV6Spec = custom_ipv6Spec
493
+ end
494
+ if nic['adapter'].key?('netBIOS')
495
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.IPSettings.NetBIOSMode.html
496
+ # Fields:
497
+ # netBIOS: string matching: 'disableNetBIOS','enableNetBIOS' or 'enableNetBIOSViaDhcp' ** REQUIRED **
498
+ #
499
+ raise ArgumentError, "Unsupported NetBIOSMode, supported modes are : 'disableNetBIOS','enableNetBIOS' or 'enableNetBIOSViaDhcp'" unless ['disableNetBIOS','enableNetBIOS','enableNetBIOSViaDhcp'].include? nic['adapter']['netBIOS']
500
+ custom_adapter.netBIOS = RbVmomi::VIM.CustomizationNetBIOSMode(nic['adapter']['netBIOS'])
501
+ end
502
+ custom_adapter.primaryWINS = nic['adapter']['primaryWINS'] if nic['adapter'].key?('primaryWINS')
503
+ custom_adapter.secondaryWINS = nic['adapter']['secondaryWINS'] if nic['adapter'].key?('secondaryWINS')
504
+ custom_adapter.subnetMask = nic['adapter']['subnetMask'] if nic['adapter'].key?('subnetMask')
505
+
506
+ custom_adapter_mapping = RbVmomi::VIM::CustomizationAdapterMapping(:adapter => custom_adapter)
507
+ custom_adapter_mapping.macAddress = nic['macAddress'] if nic.key?('macAddress')
508
+
509
+ # build the adapters array, creates it if not already created, otherwise appends to it
510
+ custom_nicSettingMap << custom_adapter_mapping
511
+ end
512
+ end
513
+ custom_nicSettingMap = nil if custom_nicSettingMap.length < 1
514
+
515
+ if custom_spec.key?("options")
516
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Options.html
517
+ # this currently doesn't have any Linux options, just windows
518
+ # Fields:
519
+ # * changeSID: boolean **REQUIRED**
520
+ # * deleteAccounts: boolean **REQUIRED** **note deleteAccounts is deprecated as of VI API 2.5 so can be ignored
521
+ # * reboot: CustomizationSysprepRebootOption: (string) one of following 'noreboot', reboot' or 'shutdown' (defaults to reboot)
522
+ raise ArgumentError, "changeSID id required when using Windows Options" unless custom_spec['options'].key?('changeSID')
523
+ raise ArgumentError, "deleteAccounts id required when using Windows Options" unless custom_spec['options'].key?('deleteAccounts')
524
+ custom_options = RbVmomi::VIM::CustomizationWinOptions(
525
+ :changeSID => custom_spec['options']['changeSID'],
526
+ :deleteAccounts => custom_spec['options']['deleteAccounts']
527
+ )
528
+ if custom_spec['options'].key?('reboot')
529
+ raise ArgumentError, "Unsupported reboot option, supported options are : 'noreboot', 'reboot' or 'shutdown'" unless ['noreboot','reboot','shutdown'].include? custom_spec['options']['reboot']
530
+ custom_options.reboot = RBVmomi::VIM.CustomizationSysprepRebootOption(custom_spec['options']['reboot'])
531
+ end
181
532
  end
182
- cust_ip_settings ||= RbVmomi::VIM::CustomizationIPSettings.new("ip" => RbVmomi::VIM::CustomizationDhcpIpGenerator.new())
183
- cust_ip_settings.dnsDomain = cust_domain
184
- cust_global_ip_settings = RbVmomi::VIM::CustomizationGlobalIPSettings.new
185
- cust_global_ip_settings.dnsServerList = cust_ip_settings.dnsServerList
186
- cust_global_ip_settings.dnsSuffixList = cust_options['dnsSuffixList'] || [cust_domain]
187
- cust_hostname = RbVmomi::VIM::CustomizationFixedName.new(:name => cust_options['hostname']) if cust_options.key?('hostname')
188
- cust_hostname ||= RbVmomi::VIM::CustomizationFixedName.new(:name => options['name'])
189
- cust_hwclockutc = cust_options['hw_clock_utc']
190
- cust_timezone = cust_options['time_zone']
191
- # Start Building objects
192
- # Build the CustomizationLinuxPrep Object
193
- cust_prep = RbVmomi::VIM::CustomizationLinuxPrep.new(
194
- :domain => cust_domain,
195
- :hostName => cust_hostname,
196
- :hwClockUTC => cust_hwclockutc,
197
- :timeZone => cust_timezone)
198
- # Build the Custom Adapter Mapping Supports only one eth right now
199
- cust_adapter_mapping = [RbVmomi::VIM::CustomizationAdapterMapping.new("adapter" => cust_ip_settings)]
200
- # Build the customization Spec
201
- customization_spec = RbVmomi::VIM::CustomizationSpec.new(
202
- :identity => cust_prep,
203
- :globalIPSettings => cust_global_ip_settings,
204
- :nicSettingMap => cust_adapter_mapping)
533
+ custom_options ||=nil
534
+
535
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Specification.html
536
+ customization_spec = RbVmomi::VIM::CustomizationSpec(
537
+ :globalIPSettings => custom_globalIPSettings,
538
+ :identity => custom_identity
539
+ )
540
+ customization_spec.encryptionKey = custom_encryptionKey if defined?(custom_encryptionKey)
541
+ customization_spec.nicSettingMap = custom_nicSettingMap if defined?(custom_nicSettingMap)
542
+ customization_spec.options = custom_options if defined?(custom_options)
543
+
205
544
  end
206
545
  customization_spec ||= nil
207
546
 
@@ -229,7 +568,7 @@ module Fog
229
568
  disk_backing.backing.fileName = "[#{disk.backing.datastore.name}]";
230
569
  disk_backing.backing.parent = disk.backing
231
570
  }
232
- },
571
+ }
233
572
  ]
234
573
  }
235
574
  vm_mob_ref.ReconfigVM_Task(:spec => disk_spec).wait_for_completion
@@ -18,7 +18,6 @@ module Fog
18
18
 
19
19
  add_commits_to_changelog
20
20
  save_changelog
21
- ::Rake::Task[:github_release].invoke
22
21
  end
23
22
  end
24
23
 
@@ -141,6 +140,7 @@ Watchers | #{watchers}
141
140
  'Rodrigo Estebanez',
142
141
  'Rupak Ganguly',
143
142
  'Stepan G. Fedorov',
143
+ 'TerryHowe',
144
144
  'Wesley Beary'
145
145
  ].include?(committer)
146
146
  end