fog-google 0.6.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (484) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -7
  3. data/README.md +17 -15
  4. data/ci/.gitignore +1 -0
  5. data/ci/README.md +70 -0
  6. data/ci/credentials.yml.tpl +13 -0
  7. data/ci/docker-image/Dockerfile +20 -0
  8. data/ci/pipeline.yml +63 -0
  9. data/ci/tasks/run-int.sh +34 -0
  10. data/ci/tasks/run-int.yml +15 -0
  11. data/ci/tasks/utils.sh +10 -0
  12. data/examples/l7_load_balance.rb +16 -8
  13. data/examples/metadata.rb +2 -1
  14. data/examples/monitoring/timeseries_collection.rb +2 -2
  15. data/examples/sql/instances.rb +3 -7
  16. data/examples/sql/operations.rb +2 -2
  17. data/examples/sql/ssl_certs.rb +4 -4
  18. data/fog-google.gemspec +11 -12
  19. data/lib/fog/bin/google.rb +16 -13
  20. data/lib/fog/compute/google.rb +30 -29
  21. data/lib/fog/compute/google/mock.rb +380 -377
  22. data/lib/fog/compute/google/models/address.rb +46 -16
  23. data/lib/fog/compute/google/models/addresses.rb +22 -14
  24. data/lib/fog/compute/google/models/backend_service.rb +27 -26
  25. data/lib/fog/compute/google/models/backend_services.rb +6 -5
  26. data/lib/fog/compute/google/models/disk.rb +32 -42
  27. data/lib/fog/compute/google/models/disk_type.rb +1 -0
  28. data/lib/fog/compute/google/models/disk_types.rb +18 -12
  29. data/lib/fog/compute/google/models/disks.rb +35 -19
  30. data/lib/fog/compute/google/models/firewall.rb +31 -8
  31. data/lib/fog/compute/google/models/firewalls.rb +7 -6
  32. data/lib/fog/compute/google/models/forwarding_rule.rb +31 -34
  33. data/lib/fog/compute/google/models/forwarding_rules.rb +27 -17
  34. data/lib/fog/compute/google/models/global_address.rb +7 -37
  35. data/lib/fog/compute/google/models/global_addresses.rb +17 -17
  36. data/lib/fog/compute/google/models/global_forwarding_rule.rb +33 -37
  37. data/lib/fog/compute/google/models/global_forwarding_rules.rb +7 -6
  38. data/lib/fog/compute/google/models/http_health_check.rb +56 -32
  39. data/lib/fog/compute/google/models/http_health_checks.rb +4 -4
  40. data/lib/fog/compute/google/models/image.rb +27 -34
  41. data/lib/fog/compute/google/models/images.rb +38 -38
  42. data/lib/fog/compute/google/models/instance_group.rb +4 -4
  43. data/lib/fog/compute/google/models/instance_groups.rb +15 -13
  44. data/lib/fog/compute/google/models/{flavor.rb → machine_type.rb} +6 -14
  45. data/lib/fog/compute/google/models/machine_types.rb +37 -0
  46. data/lib/fog/compute/google/models/network.rb +17 -11
  47. data/lib/fog/compute/google/models/networks.rb +5 -4
  48. data/lib/fog/compute/google/models/operation.rb +3 -3
  49. data/lib/fog/compute/google/models/operations.rb +20 -9
  50. data/lib/fog/compute/google/models/project.rb +2 -2
  51. data/lib/fog/compute/google/models/projects.rb +3 -2
  52. data/lib/fog/compute/google/models/region.rb +2 -2
  53. data/lib/fog/compute/google/models/regions.rb +5 -4
  54. data/lib/fog/compute/google/models/route.rb +5 -2
  55. data/lib/fog/compute/google/models/routes.rb +5 -4
  56. data/lib/fog/compute/google/models/server.rb +358 -171
  57. data/lib/fog/compute/google/models/servers.rb +66 -33
  58. data/lib/fog/compute/google/models/snapshot.rb +22 -10
  59. data/lib/fog/compute/google/models/snapshots.rb +7 -5
  60. data/lib/fog/compute/google/models/ssl_certificate.rb +10 -3
  61. data/lib/fog/compute/google/models/ssl_certificates.rb +5 -4
  62. data/lib/fog/compute/google/models/subnetwork.rb +31 -2
  63. data/lib/fog/compute/google/models/subnetworks.rb +16 -8
  64. data/lib/fog/compute/google/models/target_http_proxies.rb +4 -3
  65. data/lib/fog/compute/google/models/target_http_proxy.rb +29 -27
  66. data/lib/fog/compute/google/models/target_https_proxies.rb +4 -3
  67. data/lib/fog/compute/google/models/target_https_proxy.rb +46 -27
  68. data/lib/fog/compute/google/models/target_instance.rb +21 -23
  69. data/lib/fog/compute/google/models/target_instances.rb +21 -13
  70. data/lib/fog/compute/google/models/target_pool.rb +87 -44
  71. data/lib/fog/compute/google/models/target_pools.rb +21 -13
  72. data/lib/fog/compute/google/models/url_map.rb +58 -28
  73. data/lib/fog/compute/google/models/url_maps.rb +4 -3
  74. data/lib/fog/compute/google/models/zone.rb +10 -6
  75. data/lib/fog/compute/google/models/zones.rb +4 -3
  76. data/lib/fog/compute/google/real.rb +2 -3
  77. data/lib/fog/compute/google/requests/add_backend_service_backends.rb +2 -14
  78. data/lib/fog/compute/google/requests/add_instance_group_instances.rb +13 -15
  79. data/lib/fog/compute/google/requests/add_server_access_config.rb +15 -17
  80. data/lib/fog/compute/google/requests/add_target_pool_health_checks.rb +15 -12
  81. data/lib/fog/compute/google/requests/add_target_pool_instances.rb +13 -12
  82. data/lib/fog/compute/google/requests/attach_disk.rb +6 -20
  83. data/lib/fog/compute/google/requests/create_disk_snapshot.rb +22 -0
  84. data/lib/fog/compute/google/requests/delete_address.rb +6 -8
  85. data/lib/fog/compute/google/requests/delete_backend_service.rb +3 -29
  86. data/lib/fog/compute/google/requests/delete_disk.rb +8 -31
  87. data/lib/fog/compute/google/requests/delete_firewall.rb +1 -7
  88. data/lib/fog/compute/google/requests/delete_forwarding_rule.rb +5 -36
  89. data/lib/fog/compute/google/requests/delete_global_address.rb +1 -6
  90. data/lib/fog/compute/google/requests/delete_global_forwarding_rule.rb +4 -35
  91. data/lib/fog/compute/google/requests/delete_global_operation.rb +2 -9
  92. data/lib/fog/compute/google/requests/delete_http_health_check.rb +4 -28
  93. data/lib/fog/compute/google/requests/delete_image.rb +4 -29
  94. data/lib/fog/compute/google/requests/delete_instance_group.rb +1 -8
  95. data/lib/fog/compute/google/requests/delete_network.rb +1 -7
  96. data/lib/fog/compute/google/requests/delete_region_operation.rb +5 -14
  97. data/lib/fog/compute/google/requests/delete_route.rb +5 -7
  98. data/lib/fog/compute/google/requests/delete_server.rb +4 -54
  99. data/lib/fog/compute/google/requests/delete_server_access_config.rb +5 -11
  100. data/lib/fog/compute/google/requests/delete_snapshot.rb +1 -7
  101. data/lib/fog/compute/google/requests/delete_ssl_certificate.rb +1 -7
  102. data/lib/fog/compute/google/requests/delete_subnetwork.rb +12 -32
  103. data/lib/fog/compute/google/requests/delete_target_http_proxy.rb +4 -30
  104. data/lib/fog/compute/google/requests/delete_target_https_proxy.rb +3 -9
  105. data/lib/fog/compute/google/requests/delete_target_instance.rb +5 -33
  106. data/lib/fog/compute/google/requests/delete_target_pool.rb +5 -36
  107. data/lib/fog/compute/google/requests/delete_url_map.rb +4 -30
  108. data/lib/fog/compute/google/requests/delete_zone_operation.rb +1 -8
  109. data/lib/fog/compute/google/requests/deprecate_image.rb +20 -0
  110. data/lib/fog/compute/google/requests/detach_disk.rb +4 -11
  111. data/lib/fog/compute/google/requests/expand_subnetwork_ip_cidr_range.rb +36 -0
  112. data/lib/fog/compute/google/requests/get_address.rb +6 -8
  113. data/lib/fog/compute/google/requests/get_backend_service.rb +1 -6
  114. data/lib/fog/compute/google/requests/get_backend_service_health.rb +3 -8
  115. data/lib/fog/compute/google/requests/get_disk.rb +7 -31
  116. data/lib/fog/compute/google/requests/get_disk_type.rb +4 -27
  117. data/lib/fog/compute/google/requests/get_firewall.rb +1 -7
  118. data/lib/fog/compute/google/requests/get_forwarding_rule.rb +6 -30
  119. data/lib/fog/compute/google/requests/get_global_address.rb +1 -6
  120. data/lib/fog/compute/google/requests/get_global_forwarding_rule.rb +4 -17
  121. data/lib/fog/compute/google/requests/get_global_operation.rb +7 -36
  122. data/lib/fog/compute/google/requests/get_http_health_check.rb +4 -24
  123. data/lib/fog/compute/google/requests/get_image.rb +4 -22
  124. data/lib/fog/compute/google/requests/get_image_from_family.rb +9 -20
  125. data/lib/fog/compute/google/requests/get_instance_group.rb +1 -8
  126. data/lib/fog/compute/google/requests/get_machine_type.rb +5 -28
  127. data/lib/fog/compute/google/requests/get_network.rb +1 -7
  128. data/lib/fog/compute/google/requests/get_project.rb +1 -6
  129. data/lib/fog/compute/google/requests/get_region.rb +3 -23
  130. data/lib/fog/compute/google/requests/get_region_operation.rb +7 -42
  131. data/lib/fog/compute/google/requests/get_route.rb +4 -7
  132. data/lib/fog/compute/google/requests/get_server.rb +4 -58
  133. data/lib/fog/compute/google/requests/get_server_serial_port_output.rb +21 -9
  134. data/lib/fog/compute/google/requests/get_snapshot.rb +1 -8
  135. data/lib/fog/compute/google/requests/get_ssl_certificate.rb +1 -6
  136. data/lib/fog/compute/google/requests/get_subnetwork.rb +11 -29
  137. data/lib/fog/compute/google/requests/get_target_http_proxy.rb +4 -12
  138. data/lib/fog/compute/google/requests/get_target_https_proxy.rb +3 -9
  139. data/lib/fog/compute/google/requests/get_target_instance.rb +5 -15
  140. data/lib/fog/compute/google/requests/get_target_pool.rb +5 -27
  141. data/lib/fog/compute/google/requests/get_target_pool_health.rb +7 -24
  142. data/lib/fog/compute/google/requests/get_url_map.rb +4 -12
  143. data/lib/fog/compute/google/requests/get_zone.rb +3 -22
  144. data/lib/fog/compute/google/requests/get_zone_operation.rb +8 -38
  145. data/lib/fog/compute/google/requests/insert_address.rb +12 -9
  146. data/lib/fog/compute/google/requests/insert_backend_service.rb +7 -49
  147. data/lib/fog/compute/google/requests/insert_disk.rb +25 -96
  148. data/lib/fog/compute/google/requests/insert_firewall.rb +46 -26
  149. data/lib/fog/compute/google/requests/insert_forwarding_rule.rb +14 -47
  150. data/lib/fog/compute/google/requests/insert_global_address.rb +7 -8
  151. data/lib/fog/compute/google/requests/insert_global_forwarding_rule.rb +11 -43
  152. data/lib/fog/compute/google/requests/insert_http_health_check.rb +9 -46
  153. data/lib/fog/compute/google/requests/insert_image.rb +8 -51
  154. data/lib/fog/compute/google/requests/insert_instance_group.rb +16 -19
  155. data/lib/fog/compute/google/requests/insert_network.rb +16 -13
  156. data/lib/fog/compute/google/requests/insert_route.rb +18 -20
  157. data/lib/fog/compute/google/requests/insert_server.rb +74 -235
  158. data/lib/fog/compute/google/requests/insert_ssl_certificate.rb +10 -14
  159. data/lib/fog/compute/google/requests/insert_subnetwork.rb +37 -53
  160. data/lib/fog/compute/google/requests/insert_target_http_proxy.rb +11 -39
  161. data/lib/fog/compute/google/requests/insert_target_https_proxy.rb +13 -10
  162. data/lib/fog/compute/google/requests/insert_target_instance.rb +10 -42
  163. data/lib/fog/compute/google/requests/insert_target_pool.rb +7 -45
  164. data/lib/fog/compute/google/requests/insert_url_map.rb +10 -41
  165. data/lib/fog/compute/google/requests/invalidate_url_map_cache.rb +22 -0
  166. data/lib/fog/compute/google/requests/list_addresses.rb +12 -9
  167. data/lib/fog/compute/google/requests/list_aggregated_addresses.rb +5 -7
  168. data/lib/fog/compute/google/requests/list_aggregated_disk_types.rb +9 -25
  169. data/lib/fog/compute/google/requests/list_aggregated_disks.rb +17 -24
  170. data/lib/fog/compute/google/requests/list_aggregated_forwarding_rules.rb +22 -0
  171. data/lib/fog/compute/google/requests/list_aggregated_instance_groups.rb +2 -7
  172. data/lib/fog/compute/google/requests/list_aggregated_machine_types.rb +8 -8
  173. data/lib/fog/compute/google/requests/list_aggregated_servers.rb +9 -24
  174. data/lib/fog/compute/google/requests/list_aggregated_subnetworks.rb +20 -20
  175. data/lib/fog/compute/google/requests/list_aggregated_target_instances.rb +11 -26
  176. data/lib/fog/compute/google/requests/list_aggregated_target_pools.rb +24 -0
  177. data/lib/fog/compute/google/requests/list_backend_services.rb +1 -6
  178. data/lib/fog/compute/google/requests/list_disk_types.rb +9 -31
  179. data/lib/fog/compute/google/requests/list_disks.rb +13 -14
  180. data/lib/fog/compute/google/requests/list_firewalls.rb +7 -7
  181. data/lib/fog/compute/google/requests/list_forwarding_rules.rb +10 -14
  182. data/lib/fog/compute/google/requests/list_global_addresses.rb +24 -0
  183. data/lib/fog/compute/google/requests/list_global_forwarding_rules.rb +9 -15
  184. data/lib/fog/compute/google/requests/list_global_operations.rb +10 -9
  185. data/lib/fog/compute/google/requests/list_http_health_checks.rb +8 -13
  186. data/lib/fog/compute/google/requests/list_images.rb +10 -14
  187. data/lib/fog/compute/google/requests/list_instance_group_instances.rb +3 -8
  188. data/lib/fog/compute/google/requests/list_instance_groups.rb +1 -7
  189. data/lib/fog/compute/google/requests/list_machine_types.rb +10 -15
  190. data/lib/fog/compute/google/requests/list_networks.rb +8 -8
  191. data/lib/fog/compute/google/requests/list_region_operations.rb +12 -10
  192. data/lib/fog/compute/google/requests/list_regions.rb +7 -69
  193. data/lib/fog/compute/google/requests/list_routes.rb +11 -7
  194. data/lib/fog/compute/google/requests/list_servers.rb +9 -16
  195. data/lib/fog/compute/google/requests/list_snapshots.rb +5 -9
  196. data/lib/fog/compute/google/requests/list_ssl_certificates.rb +9 -6
  197. data/lib/fog/compute/google/requests/list_subnetworks.rb +24 -22
  198. data/lib/fog/compute/google/requests/list_target_http_proxies.rb +10 -14
  199. data/lib/fog/compute/google/requests/list_target_https_proxies.rb +7 -7
  200. data/lib/fog/compute/google/requests/list_target_instances.rb +12 -15
  201. data/lib/fog/compute/google/requests/list_target_pools.rb +11 -14
  202. data/lib/fog/compute/google/requests/list_url_maps.rb +10 -14
  203. data/lib/fog/compute/google/requests/list_zone_operations.rb +11 -10
  204. data/lib/fog/compute/google/requests/list_zones.rb +10 -12
  205. data/lib/fog/compute/google/requests/patch_firewall.rb +25 -0
  206. data/lib/fog/compute/google/requests/patch_url_map.rb +19 -0
  207. data/lib/fog/compute/google/requests/remove_instance_group_instances.rb +13 -15
  208. data/lib/fog/compute/google/requests/remove_target_pool_health_checks.rb +13 -12
  209. data/lib/fog/compute/google/requests/remove_target_pool_instance.rb +13 -12
  210. data/lib/fog/compute/google/requests/remove_target_pool_instances.rb +13 -12
  211. data/lib/fog/compute/google/requests/reset_server.rb +1 -8
  212. data/lib/fog/compute/google/requests/set_common_instance_metadata.rb +6 -11
  213. data/lib/fog/compute/google/requests/set_forwarding_rule_target.rb +7 -13
  214. data/lib/fog/compute/google/requests/set_global_forwarding_rule_target.rb +6 -13
  215. data/lib/fog/compute/google/requests/set_server_disk_auto_delete.rb +8 -10
  216. data/lib/fog/compute/google/requests/set_server_metadata.rb +35 -0
  217. data/lib/fog/compute/google/requests/set_server_scheduling.rb +7 -15
  218. data/lib/fog/compute/google/requests/set_server_tags.rb +23 -0
  219. data/lib/fog/compute/google/requests/set_snapshot_labels.rb +23 -0
  220. data/lib/fog/compute/google/requests/set_subnetwork_private_ip_google_access.rb +40 -0
  221. data/lib/fog/compute/google/requests/set_target_http_proxy_url_map.rb +8 -13
  222. data/lib/fog/compute/google/requests/set_target_https_proxy_ssl_certificates.rb +22 -0
  223. data/lib/fog/compute/google/requests/set_target_https_proxy_url_map.rb +8 -13
  224. data/lib/fog/compute/google/requests/set_target_pool_backup.rb +29 -0
  225. data/lib/fog/compute/google/requests/start_server.rb +3 -10
  226. data/lib/fog/compute/google/requests/stop_server.rb +3 -10
  227. data/lib/fog/compute/google/requests/update_firewall.rb +32 -28
  228. data/lib/fog/compute/google/requests/update_http_health_check.rb +23 -0
  229. data/lib/fog/compute/google/requests/update_url_map.rb +11 -24
  230. data/lib/fog/compute/google/requests/validate_url_map.rb +8 -10
  231. data/lib/fog/dns/google.rb +4 -3
  232. data/lib/fog/dns/google/models/change.rb +2 -2
  233. data/lib/fog/dns/google/models/changes.rb +6 -5
  234. data/lib/fog/dns/google/models/project.rb +6 -6
  235. data/lib/fog/dns/google/models/projects.rb +3 -2
  236. data/lib/fog/dns/google/models/record.rb +16 -10
  237. data/lib/fog/dns/google/models/records.rb +8 -4
  238. data/lib/fog/dns/google/models/zone.rb +1 -1
  239. data/lib/fog/dns/google/models/zones.rb +4 -3
  240. data/lib/fog/dns/google/real.rb +2 -3
  241. data/lib/fog/dns/google/requests/create_change.rb +9 -46
  242. data/lib/fog/dns/google/requests/create_managed_zone.rb +7 -62
  243. data/lib/fog/dns/google/requests/delete_managed_zone.rb +3 -17
  244. data/lib/fog/dns/google/requests/get_change.rb +3 -24
  245. data/lib/fog/dns/google/requests/get_managed_zone.rb +3 -19
  246. data/lib/fog/dns/google/requests/get_project.rb +3 -23
  247. data/lib/fog/dns/google/requests/list_changes.rb +11 -24
  248. data/lib/fog/dns/google/requests/list_managed_zones.rb +7 -14
  249. data/lib/fog/dns/google/requests/list_resource_record_sets.rb +11 -33
  250. data/lib/fog/google/models/monitoring/metric_descriptors.rb +24 -7
  251. data/lib/fog/google/models/monitoring/monitored_resource_descriptors.rb +18 -7
  252. data/lib/fog/google/models/monitoring/timeseries_collection.rb +25 -15
  253. data/lib/fog/google/models/pubsub/subscription.rb +5 -5
  254. data/lib/fog/google/models/pubsub/subscriptions.rb +4 -3
  255. data/lib/fog/google/models/pubsub/topic.rb +3 -4
  256. data/lib/fog/google/models/pubsub/topics.rb +4 -3
  257. data/lib/fog/google/models/sql/backup_run.rb +8 -5
  258. data/lib/fog/google/models/sql/backup_runs.rb +9 -9
  259. data/lib/fog/google/models/sql/flag.rb +2 -1
  260. data/lib/fog/google/models/sql/flags.rb +1 -1
  261. data/lib/fog/google/models/sql/instance.rb +76 -91
  262. data/lib/fog/google/models/sql/instances.rb +5 -8
  263. data/lib/fog/google/models/sql/operation.rb +24 -18
  264. data/lib/fog/google/models/sql/operations.rb +7 -9
  265. data/lib/fog/google/models/sql/ssl_cert.rb +11 -11
  266. data/lib/fog/google/models/sql/ssl_certs.rb +8 -8
  267. data/lib/fog/google/models/sql/tier.rb +1 -1
  268. data/lib/fog/google/models/sql/tiers.rb +1 -1
  269. data/lib/fog/google/models/sql/user.rb +44 -0
  270. data/lib/fog/google/models/sql/users.rb +21 -0
  271. data/lib/fog/google/monitoring.rb +5 -0
  272. data/lib/fog/google/monitoring/real.rb +2 -3
  273. data/lib/fog/google/pubsub.rb +1 -0
  274. data/lib/fog/google/pubsub/real.rb +1 -1
  275. data/lib/fog/google/requests/monitoring/create_metric_descriptor.rb +49 -0
  276. data/lib/fog/google/requests/monitoring/create_timeseries.rb +27 -0
  277. data/lib/fog/google/requests/monitoring/delete_metric_descriptor.rb +17 -0
  278. data/lib/fog/google/requests/monitoring/get_metric_descriptor.rb +17 -0
  279. data/lib/fog/google/requests/monitoring/get_monitored_resource_descriptor.rb +19 -0
  280. data/lib/fog/google/requests/monitoring/list_metric_descriptors.rb +8 -230
  281. data/lib/fog/google/requests/monitoring/list_monitored_resource_descriptors.rb +9 -45
  282. data/lib/fog/google/requests/monitoring/list_timeseries.rb +26 -60
  283. data/lib/fog/google/requests/pubsub/acknowledge_subscription.rb +11 -28
  284. data/lib/fog/google/requests/pubsub/create_subscription.rb +8 -27
  285. data/lib/fog/google/requests/pubsub/create_topic.rb +3 -16
  286. data/lib/fog/google/requests/pubsub/delete_subscription.rb +3 -10
  287. data/lib/fog/google/requests/pubsub/delete_topic.rb +3 -11
  288. data/lib/fog/google/requests/pubsub/get_subscription.rb +3 -26
  289. data/lib/fog/google/requests/pubsub/get_topic.rb +3 -23
  290. data/lib/fog/google/requests/pubsub/list_subscriptions.rb +7 -17
  291. data/lib/fog/google/requests/pubsub/list_topics.rb +7 -11
  292. data/lib/fog/google/requests/pubsub/publish_topic.rb +6 -39
  293. data/lib/fog/google/requests/pubsub/pull_subscription.rb +7 -48
  294. data/lib/fog/google/requests/sql/clone_instance.rb +20 -64
  295. data/lib/fog/google/requests/sql/delete_backup_run.rb +21 -0
  296. data/lib/fog/google/requests/sql/delete_instance.rb +4 -49
  297. data/lib/fog/google/requests/sql/delete_ssl_cert.rb +4 -50
  298. data/lib/fog/google/requests/sql/delete_user.rb +22 -0
  299. data/lib/fog/google/requests/sql/export_instance.rb +35 -38
  300. data/lib/fog/google/requests/sql/get_backup_run.rb +5 -14
  301. data/lib/fog/google/requests/sql/get_instance.rb +4 -30
  302. data/lib/fog/google/requests/sql/get_operation.rb +5 -49
  303. data/lib/fog/google/requests/sql/get_ssl_cert.rb +4 -48
  304. data/lib/fog/google/requests/sql/import_instance.rb +23 -36
  305. data/lib/fog/google/requests/sql/insert_backup_run.rb +26 -0
  306. data/lib/fog/google/requests/sql/insert_instance.rb +9 -146
  307. data/lib/fog/google/requests/sql/insert_ssl_cert.rb +10 -62
  308. data/lib/fog/google/requests/sql/insert_user.rb +23 -0
  309. data/lib/fog/google/requests/sql/list_backup_runs.rb +5 -10
  310. data/lib/fog/google/requests/sql/list_flags.rb +3 -124
  311. data/lib/fog/google/requests/sql/list_instances.rb +8 -15
  312. data/lib/fog/google/requests/sql/list_operations.rb +8 -34
  313. data/lib/fog/google/requests/sql/list_ssl_certs.rb +4 -33
  314. data/lib/fog/google/requests/sql/list_tiers.rb +2 -62
  315. data/lib/fog/google/requests/sql/list_users.rb +22 -0
  316. data/lib/fog/google/requests/sql/reset_instance_ssl_config.rb +4 -29
  317. data/lib/fog/google/requests/sql/restart_instance.rb +4 -29
  318. data/lib/fog/google/requests/sql/restore_instance_backup.rb +11 -12
  319. data/lib/fog/google/requests/sql/update_instance.rb +13 -116
  320. data/lib/fog/google/requests/sql/update_user.rb +25 -0
  321. data/lib/fog/google/shared.rb +53 -69
  322. data/lib/fog/google/sql.rb +16 -4
  323. data/lib/fog/google/sql/real.rb +2 -2
  324. data/lib/fog/google/version.rb +1 -1
  325. data/lib/fog/parsers/storage/google/get_bucket_object_versions.rb +12 -8
  326. data/lib/fog/storage/google_json.rb +10 -4
  327. data/lib/fog/storage/google_json/models/directories.rb +17 -10
  328. data/lib/fog/storage/google_json/models/directory.rb +28 -31
  329. data/lib/fog/storage/google_json/models/file.rb +36 -88
  330. data/lib/fog/storage/google_json/models/files.rb +16 -25
  331. data/lib/fog/storage/google_json/real.rb +4 -4
  332. data/lib/fog/storage/google_json/requests/copy_object.rb +15 -50
  333. data/lib/fog/storage/google_json/requests/delete_bucket.rb +4 -25
  334. data/lib/fog/storage/google_json/requests/delete_object.rb +5 -29
  335. data/lib/fog/storage/google_json/requests/get_bucket.rb +25 -68
  336. data/lib/fog/storage/google_json/requests/get_bucket_acl.rb +14 -38
  337. data/lib/fog/storage/google_json/requests/get_object.rb +53 -75
  338. data/lib/fog/storage/google_json/requests/get_object_acl.rb +14 -40
  339. data/lib/fog/storage/google_json/requests/get_object_http_url.rb +6 -13
  340. data/lib/fog/storage/google_json/requests/get_object_https_url.rb +5 -12
  341. data/lib/fog/storage/google_json/requests/get_object_metadata.rb +30 -0
  342. data/lib/fog/storage/google_json/requests/get_object_url.rb +2 -3
  343. data/lib/fog/storage/google_json/requests/list_bucket_acl.rb +24 -0
  344. data/lib/fog/storage/google_json/requests/list_buckets.rb +12 -16
  345. data/lib/fog/storage/google_json/requests/list_object_acl.rb +27 -0
  346. data/lib/fog/storage/google_json/requests/list_objects.rb +5 -20
  347. data/lib/fog/storage/google_json/requests/put_bucket.rb +23 -57
  348. data/lib/fog/storage/google_json/requests/put_bucket_acl.rb +11 -18
  349. data/lib/fog/storage/google_json/requests/put_object.rb +68 -97
  350. data/lib/fog/storage/google_json/requests/put_object_acl.rb +16 -14
  351. data/lib/fog/storage/google_json/requests/put_object_url.rb +8 -14
  352. data/lib/fog/storage/google_json/utils.rb +2 -2
  353. data/lib/fog/storage/google_xml/models/file.rb +2 -2
  354. data/lib/fog/storage/google_xml/models/files.rb +2 -2
  355. data/lib/fog/storage/google_xml/real.rb +1 -1
  356. data/lib/fog/storage/google_xml/requests/copy_object.rb +1 -1
  357. data/lib/fog/storage/google_xml/requests/get_bucket.rb +3 -3
  358. data/lib/fog/storage/google_xml/requests/get_object.rb +5 -5
  359. data/lib/fog/storage/google_xml/requests/get_service.rb +2 -2
  360. data/lib/fog/storage/google_xml/requests/put_bucket_acl.rb +1 -1
  361. data/lib/fog/storage/google_xml/requests/put_object_acl.rb +1 -1
  362. data/test/helpers/client_helper.rb +44 -16
  363. data/test/helpers/integration_test_helper.rb +10 -4
  364. data/test/helpers/test_collection.rb +3 -3
  365. data/test/integration/compute/addresses/addresses_shared.rb +59 -0
  366. data/test/integration/compute/addresses/test_compute_address_models.rb +105 -0
  367. data/test/integration/compute/addresses/test_compute_address_requests.rb +52 -0
  368. data/test/integration/compute/{test_disks.rb → disks/test_compute_disk_models.rb} +0 -0
  369. data/test/integration/compute/disks/test_compute_disk_requests.rb +92 -0
  370. data/test/integration/compute/test_compute_addresses_collection.rb +5 -5
  371. data/test/integration/compute/test_compute_networks_collection.rb +11 -23
  372. data/test/integration/compute/test_disk_types.rb +3 -3
  373. data/test/integration/compute/test_regions.rb +6 -6
  374. data/test/integration/compute/test_servers.rb +0 -17
  375. data/test/integration/compute/test_target_pools.rb +5 -0
  376. data/test/integration/factories/collection_factory.rb +8 -4
  377. data/test/integration/factories/disks_factory.rb +4 -0
  378. data/test/integration/factories/forwarding_rules_factory.rb +1 -0
  379. data/test/integration/factories/global_forwarding_rules_factory.rb +1 -0
  380. data/test/integration/factories/servers_factory.rb +3 -2
  381. data/test/integration/factories/target_instances_factory.rb +1 -1
  382. data/test/integration/monitoring/test_metric_descriptors.rb +129 -0
  383. data/test/integration/monitoring/test_monitored_resource_descriptors.rb +37 -0
  384. data/test/integration/monitoring/test_timeseries.rb +202 -0
  385. data/test/integration/pubsub/pubsub_shared.rb +75 -0
  386. data/test/integration/pubsub/test_pubsub_models.rb +135 -0
  387. data/test/integration/pubsub/test_pubsub_requests.rb +49 -110
  388. data/test/integration/sql/sql_instances_shared.rb +57 -0
  389. data/test/integration/sql/test_flags.rb +31 -0
  390. data/test/integration/sql/test_instances.rb +97 -0
  391. data/test/integration/sql/test_instances_second_gen.rb +88 -0
  392. data/test/integration/sql/test_tiers.rb +34 -0
  393. data/test/integration/storage/storage_shared.rb +96 -0
  394. data/test/integration/storage/test_buckets.rb +93 -36
  395. data/test/integration/storage/test_directories.rb +48 -41
  396. data/test/integration/storage/test_files.rb +134 -98
  397. data/test/integration/storage/test_objects.rb +137 -75
  398. metadata +90 -110
  399. data/lib/fog/compute/google/models/flavors.rb +0 -28
  400. data/lib/fog/compute/google/models/resource_view.rb +0 -108
  401. data/lib/fog/compute/google/models/resource_views.rb +0 -54
  402. data/lib/fog/compute/google/requests/add_region_view_resources.rb +0 -27
  403. data/lib/fog/compute/google/requests/add_url_map_host_rules.rb +0 -25
  404. data/lib/fog/compute/google/requests/add_url_map_path_matchers.rb +0 -29
  405. data/lib/fog/compute/google/requests/add_zone_view_resources.rb +0 -27
  406. data/lib/fog/compute/google/requests/delete_region_view.rb +0 -24
  407. data/lib/fog/compute/google/requests/delete_zone_view.rb +0 -24
  408. data/lib/fog/compute/google/requests/get_backend_services.rb +0 -23
  409. data/lib/fog/compute/google/requests/get_region_view.rb +0 -24
  410. data/lib/fog/compute/google/requests/get_zone_view.rb +0 -24
  411. data/lib/fog/compute/google/requests/insert_region_view.rb +0 -25
  412. data/lib/fog/compute/google/requests/insert_snapshot.rb +0 -40
  413. data/lib/fog/compute/google/requests/insert_zone_view.rb +0 -26
  414. data/lib/fog/compute/google/requests/list_region_view_resources.rb +0 -24
  415. data/lib/fog/compute/google/requests/list_region_views.rb +0 -23
  416. data/lib/fog/compute/google/requests/list_zone_view_resources.rb +0 -24
  417. data/lib/fog/compute/google/requests/list_zone_views.rb +0 -23
  418. data/lib/fog/compute/google/requests/set_metadata.rb +0 -39
  419. data/lib/fog/compute/google/requests/set_tags.rb +0 -24
  420. data/lib/fog/google/requests/sql/set_instance_root_password.rb +0 -54
  421. data/lib/fog/storage/google_json/requests/head_object.rb +0 -54
  422. data/test/integration/compute/requests/test_compute_address_requests.rb +0 -84
  423. data/test/unit/compute/test_server.rb +0 -20
  424. data/tests/helper.rb +0 -124
  425. data/tests/helpers/collection_helper.rb +0 -88
  426. data/tests/helpers/compute/flavors_helper.rb +0 -28
  427. data/tests/helpers/compute/server_helper.rb +0 -21
  428. data/tests/helpers/compute/servers_helper.rb +0 -8
  429. data/tests/helpers/formats_helper.rb +0 -98
  430. data/tests/helpers/formats_helper_tests.rb +0 -106
  431. data/tests/helpers/mock_helper.rb +0 -16
  432. data/tests/helpers/model_helper.rb +0 -29
  433. data/tests/helpers/responds_to_helper.rb +0 -11
  434. data/tests/helpers/schema_validator_tests.rb +0 -101
  435. data/tests/helpers/succeeds_helper.rb +0 -9
  436. data/tests/lorem.txt +0 -1
  437. data/tests/models/dns/change_tests.rb +0 -26
  438. data/tests/models/dns/changes_tests.rb +0 -32
  439. data/tests/models/dns/projects_tests.rb +0 -9
  440. data/tests/models/dns/record_tests.rb +0 -41
  441. data/tests/models/dns/records_tests.rb +0 -32
  442. data/tests/models/dns/zone_tests.rb +0 -28
  443. data/tests/models/dns/zones_tests.rb +0 -14
  444. data/tests/models/pubsub/received_message_tests.rb +0 -18
  445. data/tests/models/pubsub/subscription_tests.rb +0 -26
  446. data/tests/models/pubsub/subscriptions_tests.rb +0 -33
  447. data/tests/models/pubsub/topic_tests.rb +0 -18
  448. data/tests/models/pubsub/topics_tests.rb +0 -27
  449. data/tests/models/sql/flags_tests.rb +0 -9
  450. data/tests/models/sql/instance_tests.rb +0 -53
  451. data/tests/models/sql/instances_tests.rb +0 -27
  452. data/tests/models/sql/operation_tests.rb +0 -22
  453. data/tests/models/sql/operations_tests.rb +0 -33
  454. data/tests/models/sql/ssl_cert_tests.rb +0 -21
  455. data/tests/models/sql/ssl_certs_tests.rb +0 -34
  456. data/tests/models/sql/tiers_tests.rb +0 -9
  457. data/tests/requests/compute/backend_service_tests.rb +0 -79
  458. data/tests/requests/compute/disk_tests.rb +0 -70
  459. data/tests/requests/compute/disk_type_tests.rb +0 -42
  460. data/tests/requests/compute/firewall_tests.rb +0 -85
  461. data/tests/requests/compute/forwarding_rules_tests.rb +0 -79
  462. data/tests/requests/compute/global_forwarding_rules_tests.rb +0 -79
  463. data/tests/requests/compute/http_health_checks_tests.rb +0 -79
  464. data/tests/requests/compute/image_tests.rb +0 -79
  465. data/tests/requests/compute/network_tests.rb +0 -72
  466. data/tests/requests/compute/operation_tests.rb +0 -19
  467. data/tests/requests/compute/region_tests.rb +0 -39
  468. data/tests/requests/compute/server_tests.rb +0 -82
  469. data/tests/requests/compute/target_http_proxies_test.rb +0 -75
  470. data/tests/requests/compute/target_instances_tests.rb +0 -79
  471. data/tests/requests/compute/target_pools_tests.rb +0 -78
  472. data/tests/requests/compute/url_maps_tests.rb +0 -78
  473. data/tests/requests/compute/zone_tests.rb +0 -33
  474. data/tests/requests/dns/change_tests.rb +0 -82
  475. data/tests/requests/dns/managed_zone_tests.rb +0 -63
  476. data/tests/requests/dns/project_tests.rb +0 -26
  477. data/tests/requests/dns/record_tests.rb +0 -46
  478. data/tests/requests/sql/flag_tests.rb +0 -24
  479. data/tests/requests/sql/instance_tests.rb +0 -126
  480. data/tests/requests/sql/operation_tests.rb +0 -39
  481. data/tests/requests/sql/ssl_cert_tests.rb +0 -58
  482. data/tests/requests/sql/tier_tests.rb +0 -22
  483. data/tests/requests/storage/bucket_tests.rb +0 -71
  484. data/tests/requests/storage/object_tests.rb +0 -78
@@ -53,10 +53,10 @@ module Fog
53
53
  requires :identity, :zone
54
54
 
55
55
  instance_list = []
56
- data = service.list_instance_group_instances(identity, zone_name).body
57
- if data["items"]
58
- data["items"].each do |instance|
59
- instance_list << service.servers.get(instance["instance"].split("/")[-1], zone_name)
56
+ data = service.list_instance_group_instances(identity, zone_name)
57
+ if data.items
58
+ data.items.each do |instance|
59
+ instance_list << service.servers.get(instance.instance.split("/")[-1], zone_name)
60
60
  end
61
61
  end
62
62
  instance_list
@@ -6,36 +6,38 @@ module Fog
6
6
 
7
7
  def all(filters = {})
8
8
  if filters[:zone]
9
- data = service.list_instance_groups(filters[:zone]).body
9
+ data = Array(service.list_instance_groups(filters[:zone]))
10
10
  else
11
11
  data = []
12
- service.list_aggregated_instance_groups.body["items"].each_value do |group|
13
- data.concat(group["instanceGroups"]) if group["instanceGroups"]
12
+ service.list_aggregated_instance_groups.items.each_value do |group|
13
+ data.concat(group.instance_groups) if group.instance_groups
14
14
  end
15
15
  end
16
16
 
17
- load(data)
17
+ load(data.map(&:to_h))
18
18
  end
19
19
 
20
20
  def get(identity, zone = nil)
21
21
  if zone.nil?
22
- zones = service.list_aggregated_instance_groups(:filter => "name eq .*#{identity}").body["items"]
23
- target_zone = zones.each_value.select { |zone| zone.key?("instanceGroups") }
24
- response = target_zone.first["instanceGroups"].first unless target_zone.empty?
25
- zone = response["zone"].split("/")[-1]
22
+ zones = service.list_aggregated_instance_groups(:filter => "name eq .*#{identity}").items
23
+ instance_groups = zones.each_value.map(&:instance_groups).compact.first
24
+ if instance_groups
25
+ zone = instance_groups.first.zone.split("/")[-1]
26
+ end
26
27
  end
27
28
 
28
- if instance_group = service.get_instance_group(identity, zone).body
29
- new(instance_group)
29
+ if instance_group = service.get_instance_group(identity, zone)
30
+ new(instance_group.to_h)
30
31
  end
31
- rescue Fog::Errors::NotFound
32
+ rescue ::Google::Apis::ClientError => e
33
+ raise e unless e.status_code == 404
32
34
  nil
33
35
  end
34
36
 
35
37
  # TODO: To be deprecated
36
38
  def add_instance(params)
37
39
  Fog::Logger.deprecation(
38
- "#{self.class}.#{__method__} is deprecated, use Fog::Compute::Google::InstanceGroup.#{__method__} instead [light_black](#{caller.first})[/]"
40
+ "#{self.class}.#{__method__} is deprecated, use Fog::Compute::Google::InstanceGroup.#{__method__} instead [light_black](#{caller(0..0)})[/]"
39
41
  )
40
42
  params[:instance] = [params[:instance]] unless params[:instance] == Array
41
43
  service.add_instance_group_instances(params[:group], params[:zone], params[:instance])
@@ -44,7 +46,7 @@ module Fog
44
46
  # TODO: To be deprecated
45
47
  def remove_instance(params)
46
48
  Fog::Logger.deprecation(
47
- "#{self.class}.#{__method__} is deprecated, use Fog::Compute::Google::InstanceGroup.#{__method__} instead [light_black](#{caller.first})[/]"
49
+ "#{self.class}.#{__method__} is deprecated, use Fog::Compute::Google::InstanceGroup.#{__method__} instead [light_black](#{caller(0..0)})[/]"
48
50
  )
49
51
  params[:instance] = [params[:instance]] unless params[:instance] == Array
50
52
  service.remove_instance_group_instances(params[:group], params[:zone], params[:instance])
@@ -1,30 +1,22 @@
1
1
  module Fog
2
2
  module Compute
3
3
  class Google
4
- class Flavor < Fog::Model
4
+ class MachineType < Fog::Model
5
5
  identity :name
6
6
 
7
- attribute :kind
8
- attribute :id
9
7
  attribute :creation_timestamp, :aliases => "creationTimestamp"
10
8
  attribute :deprecated
11
9
  attribute :description
12
10
  attribute :guest_cpus, :aliases => "guestCpus"
13
- attribute :image_space_gb, :aliases => "imageSpaceGb"
11
+ attribute :id
12
+ attribute :is_shared_cpu, :aliases => "isSharedCpu"
13
+ attribute :kind
14
14
  attribute :maximum_persistent_disks, :aliases => "maximumPersistentDisks"
15
- attribute :maximum_persistent_disks_size, :aliases => "maximumPersistentDisksSizeGb"
15
+ attribute :maximum_persistent_disks_size_gb, :aliases => "maximumPersistentDisksSizeGb"
16
16
  attribute :memory_mb, :aliases => "memoryMb"
17
- attribute :scratch_disks, aliases => "scratchDisks"
17
+ attribute :scratch_disks, :aliases => "scratchDisks"
18
18
  attribute :self_link, :aliases => "selfLink"
19
19
  attribute :zone
20
-
21
- def reload
22
- requires :identity, :zone
23
-
24
- data = collection.get(identity, zone)
25
- merge_attributes(data.attributes)
26
- self
27
- end
28
20
  end
29
21
  end
30
22
  end
@@ -0,0 +1,37 @@
1
+ module Fog
2
+ module Compute
3
+ class Google
4
+ class MachineTypes < Fog::Collection
5
+ model Fog::Compute::Google::MachineType
6
+
7
+ def all(zone: nil, filter: nil, max_results: nil, order_by: nil, page_token: nil)
8
+ opts = {
9
+ :filter => filter,
10
+ :max_results => max_results,
11
+ :order_by => order_by,
12
+ :page_token => page_token
13
+ }
14
+
15
+ if zone
16
+ data = service.list_machine_types(zone, opts).items
17
+ else
18
+ data = []
19
+ service.list_aggregated_machine_types(opts).items.each_value do |scoped_list|
20
+ data.concat(scoped_list.machine_types) if scoped_list && scoped_list.machine_types
21
+ end
22
+ end
23
+ load(data.map(&:to_h) || [])
24
+ end
25
+
26
+ def get(identity, zone)
27
+ machine_type = service.get_machine_type(identity, zone).to_h
28
+ return nil if machine_type.nil?
29
+ new(machine_type)
30
+ rescue ::Google::Apis::ClientError => e
31
+ raise e unless e.status_code == 404
32
+ nil
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -8,19 +8,24 @@ module Fog
8
8
  class Network < Fog::Model
9
9
  identity :name
10
10
 
11
- attribute :kind
12
- attribute :id
13
- attribute :ipv4_range, :aliases => "IPv4Range"
14
- attribute :creation_timestamp, :aliases => "creationTimestamp"
11
+ attribute :auto_create_subnetworks, aliases => "autoCreateSubnetworks"
12
+ attribute :creation_timestamp, aliases => "creationTimestamp"
15
13
  attribute :description
16
- attribute :gateway_ipv4, :aliases => "gatewayIPv4"
17
- attribute :self_link, :aliases => "selfLink"
14
+ attribute :gateway_ipv4, aliases => %w(gateway_i_pv4 gatewayIPv4)
15
+ attribute :ipv4_range, aliases => %w(i_pv4_range IPv4Range)
16
+ attribute :id
17
+ attribute :kind
18
+ attribute :peerings
19
+ attribute :routing_config, aliases => "routingConfig"
20
+ attribute :self_link, aliases => "selfLink"
21
+ attribute :subnetworks
18
22
 
19
23
  def save
20
24
  requires :identity, :ipv4_range
21
25
 
22
- data = service.insert_network(identity, ipv4_range, attributes)
23
- operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"])
26
+ data = service.insert_network(identity, attributes)
27
+ operation = Fog::Compute::Google::Operations.new(:service => service)
28
+ .get(data.name)
24
29
  # Since network has no "state" we can query, we have to wait for the operation to finish
25
30
  # TODO: change back to async when there's a proper state API
26
31
  operation.wait_for { ready? }
@@ -31,15 +36,16 @@ module Fog
31
36
  requires :identity
32
37
 
33
38
  data = service.delete_network(identity)
34
- operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"])
39
+ operation = Fog::Compute::Google::Operations.new(:service => service)
40
+ .get(data.name)
35
41
  operation.wait_for { ready? } unless async
36
42
  operation
37
43
  end
38
44
 
39
45
  # Returns a ready API structure for insert_instance, used in insert_server request.
40
46
  def get_as_interface_config(access_config = nil)
41
- network_interface = { "network" => self_link }
42
- network_interface["accessConfigs"] = [access_config] if access_config
47
+ network_interface = { :network => self_link }
48
+ network_interface[:access_configs] = [access_config] if access_config
43
49
  network_interface
44
50
  end
45
51
  end
@@ -5,15 +5,16 @@ module Fog
5
5
  model Fog::Compute::Google::Network
6
6
 
7
7
  def all
8
- data = service.list_networks.body
9
- load(data["items"] || [])
8
+ data = service.list_networks.to_h[:items]
9
+ load(data || [])
10
10
  end
11
11
 
12
12
  def get(identity)
13
- if network = service.get_network(identity).body
13
+ if network = service.get_network(identity).to_h
14
14
  new(network)
15
15
  end
16
- rescue Fog::Errors::NotFound
16
+ rescue ::Google::Apis::ClientError => e
17
+ raise e unless e.status_code == 404
17
18
  nil
18
19
  end
19
20
  end
@@ -64,9 +64,9 @@ module Fog
64
64
  self
65
65
  end
66
66
 
67
- PENDING_STATE = "PENDING"
68
- RUNNING_STATE = "RUNNING"
69
- DONE_STATE = "DONE"
67
+ PENDING_STATE = "PENDING".freeze
68
+ RUNNING_STATE = "RUNNING".freeze
69
+ DONE_STATE = "DONE".freeze
70
70
  end
71
71
  end
72
72
  end
@@ -4,15 +4,24 @@ module Fog
4
4
  class Operations < Fog::Collection
5
5
  model Fog::Compute::Google::Operation
6
6
 
7
- def all(filters = {})
8
- if filters["zone"]
9
- data = service.list_zone_operations(filters["zone"]).body
10
- elsif filters["region"]
11
- data = service.list_region_operations(filters["region"]).body
7
+ def all(zone: nil, region: nil, filter: nil, max_results: nil,
8
+ order_by: nil, page_token: nil)
9
+ opts = {
10
+ :filter => filter,
11
+ :max_results => max_results,
12
+ :order_by => order_by,
13
+ :page_token => page_token
14
+ }
15
+
16
+ if zone
17
+ data = service.list_zone_operations(zone, opts).to_h[:items]
18
+ elsif region
19
+ data = service.list_region_operations(regions, opts).to_h[:items]
12
20
  else
13
- data = service.list_global_operations.body
21
+ data = service.list_global_operations(opts).to_h[:items]
14
22
  end
15
- load(data["items"] || [])
23
+
24
+ load(data || [])
16
25
  end
17
26
 
18
27
  def get(identity, zone = nil, region = nil)
@@ -23,9 +32,11 @@ module Fog
23
32
  else
24
33
  response = service.get_global_operation(identity)
25
34
  end
35
+
26
36
  return nil if response.nil?
27
- new(response.body)
28
- rescue Fog::Errors::NotFound
37
+ new(response.to_h)
38
+ rescue ::Google::Apis::ClientError => e
39
+ raise e unless e.status_code == 404
29
40
  nil
30
41
  end
31
42
  end
@@ -19,8 +19,8 @@ module Fog
19
19
  def set_metadata(metadata = {})
20
20
  requires :identity
21
21
 
22
- data = service.set_common_instance_metadata(identity, common_instance_metadata["fingerprint"], metadata)
23
- Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"])
22
+ operation = service.set_common_instance_metadata(identity, common_instance_metadata["fingerprint"], metadata)
23
+ Fog::Compute::Google::Operations.new(:service => service).get(operation.id)
24
24
  end
25
25
  end
26
26
  end
@@ -5,10 +5,11 @@ module Fog
5
5
  model Fog::Compute::Google::Project
6
6
 
7
7
  def get(identity)
8
- if project = service.get_project(identity).body
8
+ if project = service.get_project(identity).to_h
9
9
  new(project)
10
10
  end
11
- rescue Fog::Errors::NotFound
11
+ rescue ::Google::Apis::ClientError => e
12
+ raise e unless e.status_code == 404
12
13
  nil
13
14
  end
14
15
  end
@@ -18,8 +18,8 @@ module Fog
18
18
  attribute :status
19
19
  attribute :zones
20
20
 
21
- DOWN_STATE = "DOWN"
22
- UP_STATE = "UP"
21
+ DOWN_STATE = "DOWN".freeze
22
+ UP_STATE = "UP".freeze
23
23
 
24
24
  def up?
25
25
  status == UP_STATE
@@ -5,15 +5,16 @@ module Fog
5
5
  model Fog::Compute::Google::Region
6
6
 
7
7
  def all
8
- data = service.list_regions.body
9
- load(data["items"] || [])
8
+ data = service.list_regions.to_h
9
+ load(data[:items] || [])
10
10
  end
11
11
 
12
12
  def get(identity)
13
- if region = service.get_region(identity).body
13
+ if region = service.get_region(identity).to_h
14
14
  new(region)
15
15
  end
16
- rescue Fog::Errors::NotFound
16
+ rescue ::Google::Apis::ClientError => e
17
+ raise e unless e.status_code == 404
17
18
  nil
18
19
  end
19
20
  end
@@ -18,6 +18,7 @@ module Fog
18
18
  attribute :next_hop_instance, :aliases => "nextHopInstance"
19
19
  attribute :next_hop_ip, :aliases => "nextHopIp"
20
20
  attribute :next_hop_network, :aliases => "nextHopNetwork"
21
+ attribute :next_hop_vpn_tunnel, :aliases => "nextHopVpnTunnel"
21
22
  attribute :priority
22
23
  attribute :self_link, :aliases => "selfLink"
23
24
  attribute :tags
@@ -27,7 +28,8 @@ module Fog
27
28
  requires :identity, :network, :dest_range, :priority
28
29
 
29
30
  data = service.insert_route(identity, network, dest_range, priority, attributes)
30
- operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"])
31
+ operation = Fog::Compute::Google::Operations.new(:service => service)
32
+ .get(data.name)
31
33
  operation.wait_for { !pending? }
32
34
  reload
33
35
  end
@@ -36,7 +38,8 @@ module Fog
36
38
  requires :identity
37
39
 
38
40
  data = service.delete_route(identity)
39
- operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"])
41
+ operation = Fog::Compute::Google::Operations.new(:service => service)
42
+ .get(data.name)
40
43
  operation.wait_for { ready? } unless async
41
44
  operation
42
45
  end
@@ -5,15 +5,16 @@ module Fog
5
5
  model Fog::Compute::Google::Route
6
6
 
7
7
  def all
8
- data = service.list_routes.body
9
- load(data["items"] || [])
8
+ data = service.list_routes.to_h
9
+ load(data[:items] || [])
10
10
  end
11
11
 
12
12
  def get(identity)
13
- if route = service.get_route(identity).body
13
+ if route = service.get_route(identity).to_h
14
14
  new(route)
15
15
  end
16
- rescue Fog::Errors::NotFound
16
+ rescue ::Google::Apis::ClientError => e
17
+ raise e unless e.status_code == 404
17
18
  nil
18
19
  end
19
20
  end
@@ -6,301 +6,488 @@ module Fog
6
6
  class Server < Fog::Compute::Server
7
7
  identity :name
8
8
 
9
- attribute :kind
10
- attribute :id
9
+ # @return [Boolean]
11
10
  attribute :can_ip_forward, :aliases => "canIpForward"
11
+
12
+ # @return [String]
13
+ attribute :cpu_platform, :aliases => "cpuPlatform"
14
+
15
+ # @return [String]
12
16
  attribute :creation_timestamp, :aliases => "creationTimestamp"
17
+
18
+ # @return [Boolean]
19
+ attribute :deletion_protection, :aliases => "deletionProtection"
20
+
21
+ # @return [String]
13
22
  attribute :description
23
+
24
+ # New disks may include :initialize_params before save.
25
+ #
26
+ # @example Minimal disks pre-creation:
27
+ # [
28
+ # {
29
+ # :initialize_params => {
30
+ # :source_image => "projects/debian-cloud/global/images/family/debian-8"
31
+ # }
32
+ # }
33
+ # ]
34
+ #
35
+ # @example disks post-creation:
36
+ # [
37
+ # {
38
+ # :auto_delete => false,
39
+ # :boot => true,
40
+ # :device_name => "persistent-disk-0",
41
+ # :index => 0,
42
+ # :interface => "SCSI",
43
+ # :kind => "compute#attachedDisk",
44
+ # :licenses => ["https://www.googleapis.com/compute/v1/..."],
45
+ # :mode => "READ_WRITE",
46
+ # :source => "https://www.googleapis.com/compute/v1/.../mydisk",
47
+ # :type => "PERSISTENT"
48
+ # }
49
+ # ]
50
+ # @return [Array<Hash>]
14
51
  attribute :disks
52
+
53
+ # @example Guest accelerators
54
+ # [
55
+ # {
56
+ # :accelerator_count => 1,
57
+ # :accelerator_type => "...my/accelerator/type"
58
+ # }
59
+ # ]
60
+ # @return [Array<Hash>]
61
+ attribute :guest_accelerators, :aliases => "guestAccelerators"
62
+
63
+ # @return [Fixnum]
64
+ attribute :id
65
+
66
+ # @return [String]
67
+ attribute :kind
68
+
69
+ # @return [String]
70
+ attribute :label_fingerprint, :aliases => "labelFingerprint"
71
+
72
+ # @return [Hash<String,String>]
73
+ attribute :labels
74
+
75
+ # @return [String]
15
76
  attribute :machine_type, :aliases => "machineType"
77
+
78
+ # If set initially before save, the expected format
79
+ # is the API format as shown below.
80
+ #
81
+ # If you want to pass in a Hash, see {#set_metadata}.
82
+ # If you want to access the metadata items as a Hash, see
83
+ # {#metadata_as_h}.
84
+ #
85
+ # @example Metadata in API format
86
+ #
87
+ # {
88
+ # :fingerprint => "...",
89
+ # :items => [
90
+ # { :key => "foo", :value => "bar" },
91
+ # ]
92
+ # }
93
+ # @return [Hash]
16
94
  attribute :metadata
95
+
96
+ # @return [String]
97
+ attribute :min_cpu_platform, :aliases => "minCpuPlatform"
98
+
99
+ # @example Network interfaces
100
+ # [
101
+ # {
102
+ # :kind => "compute#networkInterface",
103
+ # :name => "nic0",
104
+ # :network => "https://www.googleapis.com/compute/v1/.../my-network/"
105
+ # :network_ip => "0.0.0.0",
106
+ # :subnetwork => "https://www.googleapis.com/compute/v1/.../my-subnetwork"
107
+ # }
108
+ # ],
109
+ # @return [Array<Hash>]
17
110
  attribute :network_interfaces, :aliases => "networkInterfaces"
111
+
112
+ # @example Scheduling object
113
+ # {
114
+ # :automatic_restart => true,
115
+ # :on_host_maintenance => "MIGRATE",
116
+ # :preemptible=>false
117
+ # }
118
+ # @return [Hash]
18
119
  attribute :scheduling
120
+
121
+ # @return [String]
19
122
  attribute :self_link, :aliases => "selfLink"
123
+
124
+ # @example Service accounts in API format
125
+ # [
126
+ # {
127
+ # :email => "my-service-account@developer.gserviceaccount.com",
128
+ # :scopes => [],
129
+ # }
130
+ # ]
131
+ # @return [Array<Hash>]
20
132
  attribute :service_accounts, :aliases => "serviceAccounts"
21
- attribute :state, :aliases => "status"
133
+
134
+ # @return [Boolean]
135
+ attribute :start_restricted, :aliases => "startRestricted"
136
+
137
+ # @return [String]
138
+ attribute :status, :aliases => "status"
139
+
140
+ # @return [String]
22
141
  attribute :status_message, :aliases => "statusMessage"
142
+
143
+ # @example Tags in API format
144
+ # @return [Hash]
23
145
  attribute :tags
24
- attribute :zone, :aliases => :zone_name
25
-
26
- # These attributes are not available in the representation of an 'instance' returned by the GCE API.
27
- # They are useful only for the create process
28
- attribute :network, :aliases => "network"
29
- attribute :subnetwork, :aliases => "subnetwork"
30
- attribute :external_ip, :aliases => "externalIP"
31
- attribute :auto_restart
32
- attribute :on_host_maintenance
33
- attribute :preemptible
34
-
35
- # Security account scope aliases used by official gcloud utility
36
- # List derived from 'gcloud compute instances create --help'
146
+
147
+ # @return [String]
148
+ attribute :zone
149
+
37
150
  GCE_SCOPE_ALIASES = {
38
- "compute-ro" => "compute.readonly",
39
- "compute-rw" => "compute",
40
- "computeaccounts-ro" => "computeaccounts.readonly",
41
- "computeaccounts-rw" => "computeaccounts",
42
- "logging-write" => "logging.write",
43
- "sql" => "sqlservice",
44
- "sql-admin" => "sqlservice.admin",
45
- "storage-full" => "devstorage.full_control",
46
- "storage-ro" => "devstorage.read_only",
47
- "storage-rw" => "devstorage.read_write"
48
- }
49
-
50
- def image_name=(_args)
51
- Fog::Logger.deprecation("image_name= is no longer used [light_black](#{caller.first})[/]")
52
- end
151
+ "default" => %w(
152
+ https://www.googleapis.com/auth/cloud.useraccounts.readonly
153
+ https://www.googleapis.com/auth/devstorage.read_only
154
+ https://www.googleapis.com/auth/logging.write
155
+ https://www.googleapis.com/auth/monitoring.write
156
+ https://www.googleapis.com/auth/pubsub
157
+ https://www.googleapis.com/auth/service.management.readonly
158
+ https://www.googleapis.com/auth/servicecontrol
159
+ https://www.googleapis.com/auth/trace.append
160
+ ),
161
+ "bigquery" => ["https://www.googleapis.com/auth/bigquery"],
162
+ "cloud-platform" => ["https://www.googleapis.com/auth/cloud-platform"],
163
+ "compute-ro" => ["https://www.googleapis.com/auth/compute.readonly"],
164
+ "compute-rw" => ["https://www.googleapis.com/auth/compute"],
165
+ "datastore" => ["https://www.googleapis.com/auth/datastore"],
166
+ "logging-write" => ["https://www.googleapis.com/auth/logging.write"],
167
+ "monitoring" => ["https://www.googleapis.com/auth/monitoring"],
168
+ "monitoring-write" => ["https://www.googleapis.com/auth/monitoring.write"],
169
+ "service-control" => ["https://www.googleapis.com/auth/servicecontrol"],
170
+ "service-management" => ["https://www.googleapis.com/auth/service.management.readonly"],
171
+ "sql" => ["https://www.googleapis.com/auth/sqlservice"],
172
+ "sql-admin" => ["https://www.googleapis.com/auth/sqlservice.admin"],
173
+ "storage-full" => ["https://www.googleapis.com/auth/devstorage.full_control"],
174
+ "storage-ro" => ["https://www.googleapis.com/auth/devstorage.read_only"],
175
+ "storage-rw" => ["https://www.googleapis.com/auth/devstorage.read_write"],
176
+ "taskqueue" => ["https://www.googleapis.com/auth/taskqueue"],
177
+ "useraccounts-ro" => ["https://www.googleapis.com/auth/cloud.useraccounts.readonly"],
178
+ "useraccounts-rw" => ["https://www.googleapis.com/auth/cloud.useraccounts"],
179
+ "userinfo-email" => ["https://www.googleapis.com/auth/userinfo.email"]
180
+ }.freeze
53
181
 
54
182
  def image_name
55
183
  boot_disk = disks.first
56
184
  unless boot_disk.is_a?(Disk)
57
- source = boot_disk["source"]
185
+ source = boot_disk[:source]
58
186
  match = source.match(%r{/zones/(.*)/disks/(.*)$})
59
- boot_disk = service.disks.get match[2], match[1]
187
+ boot_disk = service.disks.get(match[2], match[1])
60
188
  end
61
189
  boot_disk.source_image.nil? ? nil : boot_disk.source_image
62
190
  end
63
191
 
64
- def kernel=(_args)
65
- Fog::Logger.deprecation("kernel= is no longer used [light_black](#{caller.first})[/]")
66
- end
67
-
68
- def kernel
69
- Fog::Logger.deprecation("kernel is no longer used [light_black](#{caller.first})[/]")
70
- nil
71
- end
72
-
73
- def flavor_id
74
- machine_type
75
- end
76
-
77
- def flavor_id=(flavor_id)
78
- machine_type = flavor_id
79
- end
80
-
81
192
  def destroy(async = true)
82
193
  requires :name, :zone
83
194
 
84
195
  data = service.delete_server(name, zone_name)
85
- operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
196
+ operation = Fog::Compute::Google::Operations
197
+ .new(:service => service)
198
+ .get(data.name, data.zone)
86
199
  operation.wait_for { ready? } unless async
87
200
  operation
88
201
  end
89
202
 
90
- # not used since v1
91
- def image
92
- Fog::Logger.deprecation("Server.image is deprecated, get source_image from boot disk")
93
- service.get_image(image_name.split("/")[-1])
94
- end
95
-
96
- def public_ip_address
97
- ip = nil
98
- if network_interfaces.respond_to? :each
99
- network_interfaces.each do |netif|
100
- next unless netif["accessConfigs"].respond_to? :each
101
- netif["accessConfigs"].each do |access_config|
102
- if access_config["name"] == "External NAT"
103
- ip = access_config["natIP"]
104
- end
203
+ def public_ip_addresses
204
+ addresses = []
205
+ if network_interfaces.respond_to? :flatMap
206
+ addresses = network_interfaces.flatMap do |nic|
207
+ if nic[:access_configs].respond_to? :each
208
+ nic[:access_configs].select { |config| config[:name] == "External NAT" }
209
+ .map { |config| config[:nat_ip] }
210
+ else
211
+ []
105
212
  end
106
213
  end
107
214
  end
108
-
109
- ip
215
+ addresses
110
216
  end
111
217
 
112
- def private_ip_address
113
- ip = nil
114
- if network_interfaces.respond_to? :first
115
- ip = network_interfaces.first["networkIP"]
218
+ def private_ip_addresses
219
+ addresses = []
220
+ if network_interfaces.respond_to? :map
221
+ addresses = network_interfaces.map { |nic| nic[:network_ip] }
116
222
  end
117
- ip
223
+ addresses
118
224
  end
119
225
 
120
226
  def addresses
121
- [private_ip_address, public_ip_address]
227
+ private_ip_addresses + public_ip_addresses
122
228
  end
123
229
 
124
- def attach_disk(disk, options = {})
230
+ def attach_disk(disk, async = true, options = {})
125
231
  requires :identity, :zone
126
232
 
127
- data = service.attach_disk(identity, zone_name, disk, options)
128
- Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
233
+ if disk.is_a? Disk
234
+ disk_obj = disk.get_attached_disk
235
+ elsif disk.is_a? String
236
+ disk_obj = service.disks.attached_disk_obj(disk, options)
237
+ end
238
+
239
+ data = service.attach_disk(identity, zone_name, disk_obj)
240
+ operation = Fog::Compute::Google::Operations
241
+ .new(:service => service)
242
+ .get(data.name, data.zone)
243
+ operation.wait_for { ready? } unless async
244
+ reload
129
245
  end
130
246
 
131
- def detach_disk(device_name)
247
+ def detach_disk(device_name, async = true)
132
248
  requires :identity, :zone
133
249
 
134
250
  data = service.detach_disk(identity, zone, device_name)
135
- Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
251
+ operation = Fog::Compute::Google::Operations
252
+ .new(:service => service)
253
+ .get(data.name, data.zone)
254
+ operation.wait_for { ready? } unless async
255
+ reload
256
+ end
257
+
258
+ # Returns metadata items as a Hash.
259
+ # @return [Hash<String, String>] items
260
+ def metadata_as_h
261
+ if metadata.nil? || metadata[:items].nil? || metadata[:items].empty?
262
+ return {}
263
+ end
264
+
265
+ Hash[metadata[:items].map { |item| [item[:key], item[:value]] }]
136
266
  end
137
267
 
138
- def reboot
268
+ def reboot(async = true)
139
269
  requires :identity, :zone
140
270
 
141
271
  data = service.reset_server(identity, zone_name)
142
- Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
272
+ operation = Fog::Compute::Google::Operations
273
+ .new(:service => service)
274
+ .get(data.name, data.zone)
275
+ operation.wait_for { ready? } unless async
276
+ operation
143
277
  end
144
278
 
145
- def start
279
+ def start(async = true)
146
280
  requires :identity, :zone
147
281
 
148
282
  data = service.start_server(identity, zone_name)
149
- Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
283
+ operation = Fog::Compute::Google::Operations
284
+ .new(:service => service)
285
+ .get(data.name, data.zone)
286
+ operation.wait_for { ready? } unless async
287
+ operation
150
288
  end
151
289
 
152
- def stop
290
+ def stop(async = true)
153
291
  requires :identity, :zone
154
292
 
155
293
  data = service.stop_server(identity, zone_name)
156
- Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
294
+ operation = Fog::Compute::Google::Operations
295
+ .new(:service => service)
296
+ .get(data.name, data.zone)
297
+ operation.wait_for { ready? } unless async
298
+ operation
157
299
  end
158
300
 
159
301
  def serial_port_output
160
302
  requires :identity, :zone
161
303
 
162
- data = service.get_server_serial_port_output(identity, zone_name)
163
- data.body["contents"]
304
+ service.get_server_serial_port_output(identity, zone_name).to_h[:contents]
164
305
  end
165
306
 
166
- def set_disk_auto_delete(auto_delete, device_name = nil)
307
+ def set_disk_auto_delete(auto_delete, device_name = nil, async = true)
167
308
  requires :identity, :zone
168
309
 
169
- unless device_name
170
- if disks.count <= 1
171
- device_name = disks[0]["deviceName"]
172
- else
173
- raise ArgumentError.new("Device name required if multiple disks are attached")
174
- end
310
+ if device_name.nil? && disks.count > 1
311
+ raise ArgumentError.new("Device name is required if multiple disks are attached")
175
312
  end
176
313
 
177
- data = service.set_server_disk_auto_delete(identity, zone_name, auto_delete, device_name)
178
- Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
314
+ device_name ||= disks.first[:device_name]
315
+ data = service.set_server_disk_auto_delete(
316
+ identity, zone_name, auto_delete, device_name
317
+ )
318
+
319
+ operation = Fog::Compute::Google::Operations
320
+ .new(:service => service)
321
+ .get(data.name, data.zone)
322
+ operation.wait_for { ready? } unless async
323
+ reload
179
324
  end
180
325
 
181
- def set_scheduling(on_host_maintenance, automatic_restart, preemptible)
326
+ def set_scheduling(async = true,
327
+ on_host_maintenance: nil,
328
+ automatic_restart: nil,
329
+ preemptible: nil)
182
330
  requires :identity, :zone
183
-
184
- data = service.set_server_scheduling(identity, zone_name, on_host_maintenance, automatic_restart, preemptible)
185
- Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
331
+ data = service.set_server_scheduling(
332
+ identity, zone_name,
333
+ :on_host_maintenance => on_host_maintenance,
334
+ :automatic_restart => automatic_restart,
335
+ :preemptible => preemptible
336
+ )
337
+
338
+ operation = Fog::Compute::Google::Operations
339
+ .new(:service => service)
340
+ .get(data.name, data.zone)
341
+ operation.wait_for { ready? } unless async
342
+ reload
186
343
  end
187
344
 
188
- def set_metadata(metadata = {})
345
+ def set_metadata(new_metadata = {}, async = true)
189
346
  requires :identity, :zone
190
347
 
191
- data = service.set_metadata(identity, zone_name, self.metadata["fingerprint"], metadata)
192
- Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
348
+ if new_metadata[:items] && new_metadata[:items].is_a?(Hash)
349
+ new_metadata[:items] = new_metadata[:items].map { |k, v| { :key => k, :value => v } }
350
+ end
351
+
352
+ data = service.set_server_metadata(
353
+ identity, zone_name, metadata[:fingerprint], new_metadata
354
+ )
355
+ operation = Fog::Compute::Google::Operations
356
+ .new(:service => service)
357
+ .get(data.name, data.zone)
358
+ operation.wait_for { ready? } unless async
359
+ reload
193
360
  end
194
361
 
195
- def set_tags(tags = [])
362
+ def set_tags(new_tags = [], async = true)
196
363
  requires :identity, :zone
197
364
 
198
- data = service.set_tags(identity, zone_name, self.tags["fingerprint"], tags)
199
- Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
365
+ data = service.set_server_tags(
366
+ identity, zone_name, tags[:fingerprint], new_tags
367
+ )
368
+ operation = Fog::Compute::Google::Operations
369
+ .new(:service => service)
370
+ .get(data.name, data.zone)
371
+ operation.wait_for { ready? } unless async
372
+ reload
200
373
  end
201
374
 
202
375
  def provisioning?
203
- state == PROVISIONING
376
+ status == PROVISIONING
204
377
  end
205
378
 
206
379
  def ready?
207
- state == RUNNING
380
+ status == RUNNING
208
381
  end
209
382
 
210
383
  def zone_name
211
384
  zone.nil? ? nil : zone.split("/")[-1]
212
385
  end
213
386
 
214
- def add_ssh_key(username, key)
215
- set_metadata(generate_ssh_key_metadata(username, key))
216
- end
217
-
218
- def map_service_accounts(scope_array)
219
- scope_array_expanded = scope_array.map do |e|
220
- if GCE_SCOPE_ALIASES[e]
221
- GCE_SCOPE_ALIASES[e]
222
- else
223
- e
224
- end
225
- end
387
+ def add_ssh_key(username, key, async = true)
388
+ metadata = generate_ssh_key_metadata(username, key)
226
389
 
227
- scope_array_finalized = scope_array_expanded.map do |e|
228
- if e.start_with?("https://")
229
- e
230
- else
231
- "https://www.googleapis.com/auth/#{e}"
232
- end
233
- end
390
+ data = service.set_server_metadata(
391
+ identity, zone_name, metadata[:fingerprint], metadata[:items]
392
+ )
234
393
 
235
- scope_array_finalized
394
+ operation = Fog::Compute::Google::Operations
395
+ .new(:service => service)
396
+ .get(data.name, data.zone)
397
+ operation.wait_for { ready? } unless async
398
+ reload
236
399
  end
237
400
 
238
401
  def reload
239
- data = service.get_server(name, zone_name).body
402
+ data = service.get_server(name, zone_name).to_h
240
403
  merge_attributes(data)
241
404
  end
242
405
 
243
- def save
406
+ def map_scopes(scopes)
407
+ return [] if scopes.nil?
408
+ scopes.flat_map do |scope|
409
+ if GCE_SCOPE_ALIASES.key? scope
410
+ # Expand scope alias to list of related scopes
411
+ GCE_SCOPE_ALIASES[scope]
412
+ else
413
+ [scope_url(scope)]
414
+ end
415
+ end
416
+ end
417
+
418
+ def save(username: nil, public_key: nil)
244
419
  requires :name
245
420
  requires :machine_type
246
- requires :zone_name
247
421
  requires :disks
422
+ requires :zone
423
+
424
+ generate_ssh_key_metadata(username, public_key) if public_key
248
425
 
249
- unless service.zones.detect { |zone| zone.name == zone_name }
250
- raise ArgumentError.new "#{zone_name.inspect} is either down or you don't have permission to use it."
426
+ options = attributes.reject { |_, v| v.nil? }
427
+
428
+ if service_accounts && service_accounts[:scopes]
429
+ options[:service_accounts] = service_accounts.merge(
430
+ :scopes => map_scopes(service_accounts[:scopes])
431
+ )
251
432
  end
252
433
 
253
- generate_ssh_key_metadata(username, public_key) if public_key
434
+ if attributes[:external_ip]
435
+ if options[:network_interfaces].nil? || options[:network_interfaces].empty?
436
+ options[:network_interfaces] = [
437
+ {
438
+ :network => "global/networks/#{GOOGLE_COMPUTE_DEFAULT_NETWORK}"
439
+ }
440
+ ]
441
+ end
254
442
 
255
- options = {
256
- "machineType" => machine_type,
257
- "networkInterfaces" => network_interfaces,
258
- "network" => network,
259
- "subnetwork" => subnetwork,
260
- "externalIp" => external_ip,
261
- "disks" => disks,
262
- "metadata" => metadata,
263
- "serviceAccounts" => service_accounts,
264
- "tags" => tags,
265
- "auto_restart" => auto_restart,
266
- "on_host_maintenance" => on_host_maintenance,
267
- "preemptible" => preemptible,
268
- "can_ip_forward" => can_ip_forward
269
- }.delete_if { |_key, value| value.nil? }
270
-
271
- if service_accounts
272
- options["serviceAccounts"] = [{
273
- "kind" => "compute#serviceAccount",
274
- "email" => "default",
275
- "scopes" => map_service_accounts(service_accounts)
276
- }]
443
+ # Add external IP as default access config if given
444
+ options[:network_interfaces][0][:access_configs] = [
445
+ {
446
+ :name => "External NAT",
447
+ :type => "ONE_TO_ONE_NAT",
448
+ :nat_ip => attributes[:external_ip]
449
+ }
450
+ ]
277
451
  end
278
452
 
279
453
  data = service.insert_server(name, zone_name, options)
280
- operation = Fog::Compute::Google::Operations.new(:service => service).get(data.body["name"], data.body["zone"])
454
+
455
+ operation = Fog::Compute::Google::Operations
456
+ .new(:service => service)
457
+ .get(data.name, data.zone)
281
458
  operation.wait_for { !pending? }
282
459
  reload
283
460
  end
284
461
 
285
- private
286
-
287
462
  def generate_ssh_key_metadata(username, key)
288
- self.metadata = Hash.new("") if metadata.nil?
289
-
290
- # The key "sshKeys" is deprecated and will be unsupported in the
291
- # future - for now defer to using 'ssh-keys' unless the user is
292
- # already using the deprecated version
293
- # https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys#deprecated
294
- metadata_key = metadata.key?("sshKeys") ? "sshKeys" : "ssh-keys"
463
+ if metadata.nil?
464
+ self.metadata = Hash.new
465
+ end
466
+ metadata[:items] = [] if metadata[:items].nil?
467
+ metadata_map = Hash[metadata[:items].map { |item| [item[:key], item[:value]] }]
295
468
 
296
- # You can have multiple SSH keys, seperated by newlines.
297
- # https://developers.google.com/compute/docs/console?hl=en#sshkeys
298
- metadata[metadata_key] = "" unless metadata[metadata_key]
299
- metadata[metadata_key] += "\n" unless metadata[metadata_key].empty?
300
- metadata[metadata_key] += "#{username}:#{key.strip}"
469
+ ssh_keys = metadata_map["ssh-keys"] || metadata_map["sshKeys"] || ""
470
+ ssh_keys += "\n" unless ssh_keys.empty?
471
+ ssh_keys += "#{username}:#{key.strip}"
301
472
 
473
+ metadata_map["ssh-keys"] = ssh_keys
474
+ metadata[:items] = metadata_to_item_list(metadata_map)
302
475
  metadata
303
476
  end
477
+
478
+ private
479
+
480
+ def metadata_to_item_list(metadata)
481
+ metadata.map { |k, v| { :key => k, :value => v } }
482
+ end
483
+
484
+ def scope_url(scope)
485
+ if scope.start_with?("https://")
486
+ scope
487
+ else
488
+ "https://www.googleapis.com/auth/#{scope}"
489
+ end
490
+ end
304
491
  end
305
492
  end
306
493
  end