fog 1.27.0 → 1.28.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 (142) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +71 -0
  3. data/Rakefile +2 -2
  4. data/bin/fog +2 -2
  5. data/fog.gemspec +4 -3
  6. data/lib/fog/bin/clodo.rb +1 -1
  7. data/lib/fog/bin/openstack.rb +5 -0
  8. data/lib/fog/digitalocean/examples/getting_started.md +46 -4
  9. data/lib/fog/digitalocean/models/compute/server.rb +1 -3
  10. data/lib/fog/digitalocean/models/compute/servers.rb +30 -0
  11. data/lib/fog/fogdocker/compute.rb +3 -2
  12. data/lib/fog/fogdocker/requests/compute/container_action.rb +1 -1
  13. data/lib/fog/fogdocker/requests/compute/container_all.rb +1 -1
  14. data/lib/fog/fogdocker/requests/compute/container_commit.rb +1 -1
  15. data/lib/fog/fogdocker/requests/compute/container_create.rb +1 -1
  16. data/lib/fog/fogdocker/requests/compute/container_delete.rb +1 -1
  17. data/lib/fog/fogdocker/requests/compute/container_get.rb +1 -1
  18. data/lib/fog/fogdocker/requests/compute/image_all.rb +1 -1
  19. data/lib/fog/fogdocker/requests/compute/image_create.rb +1 -1
  20. data/lib/fog/fogdocker/requests/compute/image_delete.rb +1 -1
  21. data/lib/fog/fogdocker/requests/compute/image_get.rb +1 -1
  22. data/lib/fog/fogdocker/requests/compute/image_search.rb +1 -1
  23. data/lib/fog/google/compute.rb +2 -1
  24. data/lib/fog/google/core.rb +42 -12
  25. data/lib/fog/google/dns.rb +2 -1
  26. data/lib/fog/google/monitoring.rb +1 -1
  27. data/lib/fog/google/sql.rb +1 -1
  28. data/lib/fog/hp/requests/storage/get_object.rb +5 -3
  29. data/lib/fog/joyent/compute.rb +2 -0
  30. data/lib/fog/openstack.rb +1 -0
  31. data/lib/fog/openstack/baremetal.rb +370 -0
  32. data/lib/fog/openstack/core.rb +1 -0
  33. data/lib/fog/openstack/docs/orchestration.md +318 -0
  34. data/lib/fog/openstack/docs/storage.md +1 -7
  35. data/lib/fog/openstack/models/baremetal/chassis.rb +60 -0
  36. data/lib/fog/openstack/models/baremetal/chassis_collection.rb +38 -0
  37. data/lib/fog/openstack/models/baremetal/driver.rb +30 -0
  38. data/lib/fog/openstack/models/baremetal/drivers.rb +21 -0
  39. data/lib/fog/openstack/models/baremetal/node.rb +85 -0
  40. data/lib/fog/openstack/models/baremetal/nodes.rb +38 -0
  41. data/lib/fog/openstack/models/baremetal/port.rb +61 -0
  42. data/lib/fog/openstack/models/baremetal/ports.rb +38 -0
  43. data/lib/fog/openstack/models/orchestration/event.rb +20 -0
  44. data/lib/fog/openstack/models/orchestration/events.rb +28 -0
  45. data/lib/fog/openstack/models/orchestration/resource.rb +32 -0
  46. data/lib/fog/openstack/models/orchestration/resource_schemas.rb +17 -0
  47. data/lib/fog/openstack/models/orchestration/resources.rb +35 -0
  48. data/lib/fog/openstack/models/orchestration/stack.rb +91 -24
  49. data/lib/fog/openstack/models/orchestration/stacks.rb +38 -4
  50. data/lib/fog/openstack/models/orchestration/template.rb +15 -0
  51. data/lib/fog/openstack/models/orchestration/templates.rb +44 -0
  52. data/lib/fog/openstack/orchestration.rb +48 -2
  53. data/lib/fog/openstack/requests/baremetal/create_chassis.rb +44 -0
  54. data/lib/fog/openstack/requests/baremetal/create_node.rb +54 -0
  55. data/lib/fog/openstack/requests/baremetal/create_port.rb +46 -0
  56. data/lib/fog/openstack/requests/baremetal/delete_chassis.rb +25 -0
  57. data/lib/fog/openstack/requests/baremetal/delete_node.rb +25 -0
  58. data/lib/fog/openstack/requests/baremetal/delete_port.rb +25 -0
  59. data/lib/fog/openstack/requests/baremetal/get_chassis.rb +24 -0
  60. data/lib/fog/openstack/requests/baremetal/get_driver.rb +24 -0
  61. data/lib/fog/openstack/requests/baremetal/get_driver_properties.rb +40 -0
  62. data/lib/fog/openstack/requests/baremetal/get_node.rb +24 -0
  63. data/lib/fog/openstack/requests/baremetal/get_port.rb +24 -0
  64. data/lib/fog/openstack/requests/baremetal/list_chassis.rb +48 -0
  65. data/lib/fog/openstack/requests/baremetal/list_chassis_detailed.rb +31 -0
  66. data/lib/fog/openstack/requests/baremetal/list_drivers.rb +24 -0
  67. data/lib/fog/openstack/requests/baremetal/list_nodes.rb +40 -0
  68. data/lib/fog/openstack/requests/baremetal/list_nodes_detailed.rb +31 -0
  69. data/lib/fog/openstack/requests/baremetal/list_ports.rb +48 -0
  70. data/lib/fog/openstack/requests/baremetal/list_ports_detailed.rb +31 -0
  71. data/lib/fog/openstack/requests/baremetal/patch_chassis.rb +42 -0
  72. data/lib/fog/openstack/requests/baremetal/patch_node.rb +41 -0
  73. data/lib/fog/openstack/requests/baremetal/patch_port.rb +41 -0
  74. data/lib/fog/openstack/requests/compute/create_server.rb +1 -0
  75. data/lib/fog/openstack/requests/orchestration/abandon_stack.rb +15 -0
  76. data/lib/fog/openstack/requests/orchestration/build_info.rb +15 -0
  77. data/lib/fog/openstack/requests/orchestration/create_stack.rb +31 -12
  78. data/lib/fog/openstack/requests/orchestration/delete_stack.rb +28 -5
  79. data/lib/fog/openstack/requests/orchestration/get_stack_template.rb +20 -0
  80. data/lib/fog/openstack/requests/orchestration/list_resource_events.rb +23 -0
  81. data/lib/fog/openstack/requests/orchestration/list_resource_types.rb +26 -0
  82. data/lib/fog/openstack/requests/orchestration/list_resources.rb +23 -0
  83. data/lib/fog/openstack/requests/orchestration/list_stack_data.rb +27 -0
  84. data/lib/fog/openstack/requests/orchestration/list_stack_events.rb +23 -0
  85. data/lib/fog/openstack/requests/orchestration/preview_stack.rb +16 -0
  86. data/lib/fog/openstack/requests/orchestration/show_event_details.rb +26 -0
  87. data/lib/fog/openstack/requests/orchestration/show_resource_data.rb +26 -0
  88. data/lib/fog/openstack/requests/orchestration/show_resource_metadata.rb +26 -0
  89. data/lib/fog/openstack/requests/orchestration/show_resource_schema.rb +15 -0
  90. data/lib/fog/openstack/requests/orchestration/show_resource_template.rb +20 -0
  91. data/lib/fog/openstack/requests/orchestration/show_stack_details.rb +26 -0
  92. data/lib/fog/openstack/requests/orchestration/update_stack.rb +34 -7
  93. data/lib/fog/openstack/requests/orchestration/validate_template.rb +16 -0
  94. data/lib/fog/openstack/volume.rb +0 -1
  95. data/lib/fog/ovirt/compute.rb +6 -0
  96. data/lib/fog/ovirt/models/compute/server.rb +10 -0
  97. data/lib/fog/ovirt/models/compute/template.rb +1 -0
  98. data/lib/fog/ovirt/models/compute/volumes.rb +1 -2
  99. data/lib/fog/ovirt/requests/compute/attach_volume.rb +22 -0
  100. data/lib/fog/ovirt/requests/compute/detach_volume.rb +22 -0
  101. data/lib/fog/ovirt/requests/compute/list_volumes.rb +19 -0
  102. data/lib/fog/ovirt/requests/compute/mock_files/disks.xml +58 -0
  103. data/lib/fog/vcloud_director/models/compute/task.rb +2 -2
  104. data/lib/fog/version.rb +1 -1
  105. data/lib/fog/vsphere/compute.rb +3 -0
  106. data/lib/fog/vsphere/requests/compute/cloudinit_to_customspec.rb +20 -11
  107. data/lib/fog/vsphere/requests/compute/get_compute_resource.rb +41 -0
  108. data/lib/fog/vsphere/requests/compute/get_network.rb +35 -6
  109. data/lib/fog/vsphere/requests/compute/get_resource_pool.rb +1 -1
  110. data/lib/fog/vsphere/requests/compute/get_virtual_machine.rb +19 -13
  111. data/lib/fog/vsphere/requests/compute/list_compute_resources.rb +92 -0
  112. data/lib/fog/vsphere/requests/compute/list_virtual_machines.rb +16 -11
  113. data/lib/fog/vsphere/requests/compute/vm_clone.rb +6 -5
  114. data/lib/fog/xenserver/requests/compute/create_sr.rb +3 -4
  115. data/lib/tasks/changelog_task.rb +1 -0
  116. data/tests/helper.rb +3 -3
  117. data/tests/helpers/mock_helper.rb +0 -4
  118. data/tests/openstack/requests/baremetal/chassis_tests.rb +48 -0
  119. data/tests/openstack/requests/baremetal/driver_tests.rb +40 -0
  120. data/tests/openstack/requests/baremetal/node_tests.rb +65 -0
  121. data/tests/openstack/requests/baremetal/port_tests.rb +56 -0
  122. data/tests/openstack/requests/compute/server_tests.rb +2 -0
  123. data/tests/openstack/requests/orchestration/stack_tests.rb +2 -2
  124. data/tests/vsphere/requests/compute/get_network_tests.rb +48 -0
  125. metadata +88 -23
  126. data/lib/fog/aws.rb +0 -23
  127. data/lib/fog/bin/riakcs.rb +0 -25
  128. data/lib/fog/openstack/requests/orchestration/list_stacks.rb +0 -47
  129. data/lib/fog/riakcs.rb +0 -2
  130. data/lib/fog/riakcs/core.rb +0 -121
  131. data/lib/fog/riakcs/provisioning.rb +0 -98
  132. data/lib/fog/riakcs/requests/provisioning/create_user.rb +0 -77
  133. data/lib/fog/riakcs/requests/provisioning/disable_user.rb +0 -23
  134. data/lib/fog/riakcs/requests/provisioning/enable_user.rb +0 -23
  135. data/lib/fog/riakcs/requests/provisioning/get_user.rb +0 -41
  136. data/lib/fog/riakcs/requests/provisioning/list_users.rb +0 -43
  137. data/lib/fog/riakcs/requests/provisioning/regrant_secret.rb +0 -23
  138. data/lib/fog/riakcs/requests/provisioning/update_user.rb +0 -23
  139. data/lib/fog/riakcs/requests/usage/get_usage.rb +0 -68
  140. data/lib/fog/riakcs/usage.rb +0 -62
  141. data/tests/riakcs/requests/provisioning/provisioning_tests.rb +0 -174
  142. data/tests/riakcs/requests/usage/usage_tests.rb +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4a15d39677eecae6d623de5fd8458293158bed12
4
- data.tar.gz: ab9d1bcd8ee755956c97747b739ea0a10e84fd43
3
+ metadata.gz: 3aa5a136d7d98de58ebd9860c1891362d1ef444f
4
+ data.tar.gz: e98e9f10aa44217d7c77f6dd0b4b8c77d4a25dfa
5
5
  SHA512:
6
- metadata.gz: e3fea3a592c2789418b5e03c54935916055257dd0bdc0e6356853841b137ed3a4a345513e66e6bcf726cec8618ba0aaa4220e0fa74c5f24ca5d81ceb15e7aff0
7
- data.tar.gz: 573e952db5240c598ba9803efcd1b4f2ea2cef6e2b8c9cdebfd3e2760476417f209ff81c463fcf6447f26e3d4f32d93e143cb2860faf526f23260b54bd9ab7c8
6
+ metadata.gz: d98bf176c48f72fc7201af9d50153ef42ad4b8409aef525b341e67e7367ef3e6222f7893220372e98e2b69b207ea21f19b18ea2c21f1d083cd25c2e0f72f20c1
7
+ data.tar.gz: 9b455f7ba0790da24d906a36247dc4f3c28d64cd2a8094b4433200bc0ffc7bc96ee45ff1c98871b210b412448475c52c1e2ddfaf6915bd2628be79914fc13d9c
@@ -1,3 +1,74 @@
1
+ ## 1.28.0 02/19/2015
2
+ *Hash* d023ee520bcf52072f50f03e22efde344caef936
3
+
4
+ Statistic | Value
5
+ ------------- | --------:
6
+ Collaborators | 2
7
+ Downloads | 8526269
8
+ Forks | 1402
9
+ Open Issues | 86
10
+ Watchers | 3382
11
+
12
+ **MVP!** Peter Souter
13
+
14
+ #### [HP|storage]
15
+ * Add support for headers to get_object. thanks Bruz Marzolf
16
+
17
+ #### [Openstack|Servers|Create]
18
+ * Allow :volume_size in block_device_mapping_v2. thanks Brandon Dunne
19
+
20
+ #### [google]
21
+ * Add support for JSON key format. thanks Ferran Rodenas
22
+
23
+ #### [joyent|compute]
24
+ * support for gracefully handling 400 error responses from api Fixes #3434. thanks Kevin Chan
25
+
26
+ #### [misc]
27
+ * Port Rackspace Orchestration implementation to OpenStack. thanks Bill Wei
28
+ * Pass options when get resources from a stack. thanks Bill Wei
29
+ * Add ubuntu-os-cloud to list of global projects. thanks Chris Gianelloni
30
+ * get resource pool without name. thanks Chris Thompson
31
+ * Add nic_type option. thanks Darren Foo
32
+ * Adding multiple server support for Docker. thanks David Davis
33
+ * Fixes "Error - undefined method 'delete' for nil:NilClass" when attempting to stop a container. thanks Dmitri Dolguikh
34
+ * Remove duplicate openstack_region key. thanks Kyle Tolle
35
+ * Add OpenStack Ironic support. thanks Ladislav Smola
36
+ * Ming Jin: added list/get compute_resource functions. thanks Ming Jin
37
+ * Ming Jin: expose effective attribute. thanks Ming Jin
38
+ * Ming Jin: add isSingleHost attribute to compute resource. thanks Ming Jin
39
+ * Ming Jin: fix nil usage issue of host. thanks Ming Jin
40
+ * Ming Jin: added appropriate mocked response. thanks Ming Jin
41
+ * Fix RDoc build. thanks Paulo Henrique Lopes Ribeiro
42
+ * Fix small typo. thanks Paulo Henrique Lopes Ribeiro
43
+ * Remove RiakCS. thanks Paulo Henrique Lopes Ribeiro
44
+ * Remove tests. thanks Paulo Henrique Lopes Ribeiro
45
+ * Remove unused credentials. thanks Paulo Henrique Lopes Ribeiro
46
+ * Remove Bin. thanks Paulo Henrique Lopes Ribeiro
47
+ * Add Fog::RiakCS as dependency. thanks Paulo Henrique Lopes Ribeiro
48
+ * Add floating disks manipulation in rbovirt provider. thanks Pavol Dilung
49
+ * Fix method names errors in exception. thanks Pavol Dilung
50
+ * Add missing braces. thanks Pavol Dilung
51
+ * Updates location to get API keys from. thanks Peter Souter
52
+ * Adds section about SSH key management. thanks Peter Souter
53
+ * Adds notes about how to bootstrap a server. thanks Peter Souter
54
+ * Fix typo. thanks Peter Souter
55
+ * Adds RDoc for #bootstrap, #get(id) and #all(). thanks Peter Souter
56
+ * Removes not about not being documented. thanks Peter Souter
57
+ * adding option to set ovirt to use filtered API. thanks Tom Caspy
58
+ * adding version attribute for ovirt template. thanks Tom Caspy
59
+ * Remove duplicate lines from code example. thanks Tomas Varaneckas
60
+ * Use correct variable in code example. thanks Tomas Varaneckas
61
+ * remove redundant requires. thanks geemus
62
+ * cloudinit to customspec support. thanks karmab
63
+ * Use Fog::Formatador. thanks starbelly
64
+
65
+ #### [vsphere]
66
+ * new default dest_folder in vm_clone. thanks Chris Thompson
67
+ * find network by name and dvswitch. thanks Chris Thompson
68
+ * Supplied a mock implementation for cloudinit_to_customspec. thanks Kevin Menard
69
+ * searching for VM improved to search whole cluster instead of current folder. thanks Matthew Black
70
+
71
+
1
72
  ## 1.27.0 01/12/2015
2
73
  *Hash* 8a8f9a366be09de646536f06e2bcc84eb9229087
3
74
 
data/Rakefile CHANGED
@@ -102,7 +102,7 @@ task :nuke do
102
102
  begin
103
103
  compute = Fog::Compute.new(:provider => provider)
104
104
  for server in compute.servers
105
- Formatador.display_line("[#{provider}] destroying server #{server.identity}")
105
+ Fog::Formatador.display_line("[#{provider}] destroying server #{server.identity}")
106
106
  server.destroy rescue nil
107
107
  end
108
108
  rescue
@@ -113,7 +113,7 @@ task :nuke do
113
113
  for record in zone.records
114
114
  record.destroy rescue nil
115
115
  end
116
- Formatador.display_line("[#{provider}] destroying zone #{zone.identity}")
116
+ Fog::Formatador.display_line("[#{provider}] destroying zone #{zone.identity}")
117
117
  zone.destroy rescue nil
118
118
  end
119
119
  rescue
data/bin/fog CHANGED
@@ -63,8 +63,8 @@ else
63
63
  @irb.signal_handle
64
64
  end
65
65
 
66
- Formatador.display_line('Welcome to fog interactive!')
67
- Formatador.display_line(":#{Fog.credential} provides #{providers}")
66
+ Fog::Formatador.display_line('Welcome to fog interactive!')
67
+ Fog::Formatador.display_line(":#{Fog.credential} provides #{providers}")
68
68
  providers = Fog.providers
69
69
 
70
70
  # FIXME: hacks until we can `include Fog` in bin
@@ -11,8 +11,8 @@ Gem::Specification.new do |s|
11
11
  ## If your rubyforge_project name is different, then edit it and comment out
12
12
  ## the sub! line in the Rakefile
13
13
  s.name = 'fog'
14
- s.version = '1.27.0'
15
- s.date = '2015-01-12'
14
+ s.version = '1.28.0'
15
+ s.date = '2015-02-19'
16
16
  s.rubyforge_project = 'fog'
17
17
 
18
18
  ## Make sure your summary is short. The description may be as long
@@ -67,6 +67,7 @@ Gem::Specification.new do |s|
67
67
  s.add_dependency("fog-storm_on_demand")
68
68
  s.add_dependency("fog-atmos")
69
69
  s.add_dependency("fog-serverlove")
70
+ s.add_dependency("fog-riakcs")
70
71
 
71
72
  # Disabled until Rackspace isn't broken, see fog-rackspace#10
72
73
  #s.add_dependency("fog-rackspace")
@@ -78,7 +79,7 @@ Gem::Specification.new do |s|
78
79
  s.add_development_dependency('rbvmomi')
79
80
  s.add_development_dependency('yard')
80
81
  s.add_development_dependency('thor')
81
- s.add_development_dependency('rbovirt', '0.0.31')
82
+ s.add_development_dependency('rbovirt', '0.0.32')
82
83
  s.add_development_dependency('shindo', '~> 0.3.4')
83
84
  s.add_development_dependency('fission')
84
85
  s.add_development_dependency('opennebula')
@@ -13,7 +13,7 @@ class Clodo < Fog::Bin
13
13
  @@connections ||= Hash.new do |hash, key|
14
14
  hash[key] = case key
15
15
  when :compute
16
- Formatador.display_line("[yellow][WARN] Clodo[:compute] is deprecated, use Compute[:clodo] instead[/]")
16
+ Fog::Formatador.display_line("[yellow][WARN] Clodo[:compute] is deprecated, use Compute[:clodo] instead[/]")
17
17
  Fog::Compute.new(:provider => 'Clodo')
18
18
  else
19
19
  raise ArgumentError, "Unrecognized service: #{key.inspect}"
@@ -18,6 +18,8 @@ class OpenStack < Fog::Bin
18
18
  Fog::Metering::OpenStack
19
19
  when :orchestration
20
20
  Fog::Orchestration::OpenStack
21
+ when :baremetal
22
+ Fog::Baremetal::OpenStack
21
23
  else
22
24
  raise ArgumentError, "Unrecognized service: #{key}"
23
25
  end
@@ -50,6 +52,9 @@ class OpenStack < Fog::Bin
50
52
  when :orchestration
51
53
  Fog::Logger.warning("OpenStack[:orchestration] is not recommended, use Orchestration[:openstack] for portability")
52
54
  Fog::Orchestration.new(:provider => 'OpenStack')
55
+ when :baremetal
56
+ Fog::Logger.warning("OpenStack[:baremetal] is not recommended, use Baremetal[:openstack] for portability")
57
+ Fog::Baremetal.new(:provider => 'OpenStack')
53
58
  else
54
59
  raise ArgumentError, "Unrecognized service: #{key.inspect}"
55
60
  end
@@ -2,10 +2,7 @@
2
2
 
3
3
  You'll need a DigitalOcean account and API key to use this provider.
4
4
 
5
- Get one from http://www.digitalocean.com.
6
-
7
- To generate the API key, login to the DigitalOcean web panel and go to
8
- 'My Settings -> API Access -> Generate a new API key'.
5
+ Get one from https://cloud.digitalocean.com/api_access (fog currently uses the v1 API)
9
6
 
10
7
  Write down the Client Key and API Key, you'll need both to use the service.
11
8
 
@@ -29,6 +26,51 @@ docean = Fog::Compute.new({
29
26
  })
30
27
  ```
31
28
 
29
+ ## SSH Key Management
30
+
31
+ Access to DigitalOcean servers can be managed with SSH keys. These can be assigned to servers at creation time so you can access them without having to use a password.
32
+
33
+ Creating a key:
34
+
35
+ ```ruby
36
+ docean.ssh_keys.create(
37
+ :name => 'Default SSH Key',
38
+ :ssh_pub_key => File.read('~/.ssh/id_rsa.pub'))
39
+ )
40
+ ```
41
+
42
+ Listing all keys:
43
+
44
+ ```ruby
45
+ docean.ssh_keys.each do | key |
46
+ key.name
47
+ key.ssh_pub_key
48
+ end
49
+ ```
50
+
51
+ Destroying a key:
52
+
53
+ ```ruby
54
+ docean.ssh_keys.destroy(:id => '27100')
55
+ ```
56
+
57
+ ## Boostrapping a server
58
+
59
+ Fog can be used to bootstrap a server, which will create an SSH key to be assigned to a server at boot.
60
+
61
+ ```ruby
62
+ server = connection.servers.bootstrap({
63
+ :name => 'test',
64
+ :image_id => 1505447,
65
+ :size_id => 33,
66
+ :region_id => 4,
67
+ :flavor_id => 66,
68
+ :public_key_path => File.expand_path('~/.ssh/id_rsa.pub'),
69
+ :private_key_path => File.expand_path('~/.ssh/id_rsa'),
70
+ })
71
+ server.wait_for { ready? }
72
+ ```
73
+
32
74
  ## Listing servers
33
75
 
34
76
  Listing servers and attributes:
@@ -12,8 +12,6 @@ module Fog
12
12
  attribute :image_id
13
13
  attribute :region_id
14
14
  attribute :flavor_id, :aliases => 'size_id'
15
- # Not documented in their API, but
16
- # available nevertheless
17
15
  attribute :public_ip_address, :aliases => 'ip_address'
18
16
  attribute :private_ip_address
19
17
  attribute :private_networking
@@ -94,7 +92,7 @@ module Fog
94
92
  commands << %{echo "#{public_key}" >> ~/.ssh/authorized_keys}
95
93
  end
96
94
 
97
- # wait for aws to be ready
95
+ # wait for DigitalOcean to be ready
98
96
  wait_for { sshable?(credentials) }
99
97
 
100
98
  Fog::SSH.new(ssh_ip_address, username, credentials).run(commands)
@@ -7,11 +7,33 @@ module Fog
7
7
  class Servers < Fog::Collection
8
8
  model Fog::Compute::DigitalOcean::Server
9
9
 
10
+ # Returns list of servers
11
+ # @return [Fog::Compute::DigitalOcean::Servers] Retrieves a list of servers.
12
+ # @raise [Fog::Compute::DigitalOcean::NotFound] - HTTP 404
13
+ # @raise [Fog::Compute::DigitalOcean::BadRequest] - HTTP 400
14
+ # @raise [Fog::Compute::DigitalOcean::InternalServerError] - HTTP 500
15
+ # @raise [Fog::Compute::DigitalOcean::ServiceError]
16
+ # @see https://developers.digitalocean.com/v1/droplets/
10
17
  def all(filters = {})
11
18
  data = service.list_servers.body['droplets']
12
19
  load(data)
13
20
  end
14
21
 
22
+ # Creates a new server and populates ssh keys
23
+ #
24
+ # @return [Fog::Compute::DigitalOcean::Server]
25
+ # @raise [Fog::Compute::DigitalOcean::NotFound] - HTTP 404
26
+ # @raise [Fog::Compute::DigitalOcean::BadRequest] - HTTP 400
27
+ # @raise [Fog::Compute::DigitalOcean::InternalServerError] - HTTP 500
28
+ # @raise [Fog::Compute::DigitalOcean::ServiceError]
29
+ # @note This creates an SSH public key object and assigns it to the server on creation
30
+ # @example
31
+ # service.servers.bootstrap :name => 'bootstrap-server',
32
+ # :flavor_ref => service.flavors.first.id,
33
+ # :image_ref => service.images.find {|img| img.name =~ /Ubuntu/}.id,
34
+ # :public_key_path => '~/.ssh/fog_rsa.pub',
35
+ # :private_key_path => '~/.ssh/fog_rsa'
36
+ #
15
37
  def bootstrap(new_attributes = {})
16
38
  server = new(new_attributes)
17
39
 
@@ -40,6 +62,14 @@ module Fog
40
62
  server
41
63
  end
42
64
 
65
+ # Retrieves server
66
+ # @param [String] id for server to be returned
67
+ # @return [Fog::Compute::DigitalOcean:Server]
68
+ # @raise [Fog::Compute::DigitalOcean::NotFound] - HTTP 404
69
+ # @raise [Fog::Compute::DigitalOcean::BadRequest] - HTTP 400
70
+ # @raise [Fog::Compute::DigitalOcean::InternalServerError] - HTTP 500
71
+ # @raise [Fog::Compute::DigitalOcean::ServiceError]
72
+ # @see https://developers.digitalocean.com/v1/droplets/
43
73
  def get(id)
44
74
  server = service.get_server_details(id).body['droplet']
45
75
  new(server) if server
@@ -40,8 +40,9 @@ module Fog
40
40
  email = options[:docker_email]
41
41
  url = options[:docker_url]
42
42
 
43
- Docker.url = url
44
- Docker.authenticate!('username' => username, 'password' => password, 'email' => email) unless username.nil? || username.empty?
43
+ connection_options = {:username => username, :password => password, :email => email}
44
+ @connection = Docker::Connection.new(url, connection_options)
45
+ Docker.authenticate!(connection_options, @connection) if username || email || password
45
46
  rescue Docker::Error::AuthenticationError => e
46
47
  raise Fog::Errors::Fogdocker::AuthenticationError.new(e.message)
47
48
  end
@@ -5,7 +5,7 @@ module Fog
5
5
  def container_action(options = {})
6
6
  raise ArgumentError, "instance id is a required parameter" unless options.key? :id
7
7
  raise ArgumentError, "action is a required parameter" unless options.key? :action
8
- result = Docker::Container.get(options[:id]).send(options[:action], options[:options])
8
+ result = Docker::Container.get(options[:id], {}, @connection).send(options[:action], options[:options] || {})
9
9
 
10
10
  if result.is_a?(Hash)
11
11
  downcase_hash_keys(result)
@@ -9,7 +9,7 @@ module Fog
9
9
  # before – Show only containers created before Id, include non-running ones.
10
10
  # size – true or false, Show the containers sizes
11
11
  def container_all(filters = {})
12
- Docker::Container.all(filters.merge(:all => true)).map do |container|
12
+ Docker::Container.all(filters.merge(:all => true), @connection).map do |container|
13
13
  downcase_hash_keys(container.json)
14
14
  end
15
15
  end
@@ -4,7 +4,7 @@ module Fog
4
4
  class Real
5
5
  def container_commit(options)
6
6
  raise ArgumentError, "instance id is a required parameter" unless options.key? :id
7
- container = Docker::Container.get(options[:id])
7
+ container = Docker::Container.get(options[:id], {}, @connection)
8
8
  downcase_hash_keys container.commit(camelize_hash_keys(options)).json
9
9
  end
10
10
  end
@@ -27,7 +27,7 @@ module Fog
27
27
  #}
28
28
  class Real
29
29
  def container_create(attrs)
30
- downcase_hash_keys Docker::Container.create(camelize_hash_keys(attrs)).json
30
+ downcase_hash_keys Docker::Container.create(camelize_hash_keys(attrs), @connection).json
31
31
  end
32
32
  end
33
33
 
@@ -4,7 +4,7 @@ module Fog
4
4
  class Real
5
5
  def container_delete(options = {})
6
6
  raise ArgumentError, "instance id is a required parameter" unless options.key? :id
7
- container = Docker::Container.get(options[:id])
7
+ container = Docker::Container.get(options[:id], {}, @connection)
8
8
  container.delete()
9
9
  true
10
10
  end
@@ -3,7 +3,7 @@ module Fog
3
3
  class Fogdocker
4
4
  class Real
5
5
  def container_get(id)
6
- raw_container = Docker::Container.get(id).json
6
+ raw_container = Docker::Container.get(id, {}, @connection).json
7
7
  processed_container = downcase_hash_keys(raw_container)
8
8
  processed_container['hostconfig_port_bindings'] = raw_container['HostConfig']['PortBindings']
9
9
  processed_container['hostconfig_links'] = raw_container['HostConfig']['Links']
@@ -3,7 +3,7 @@ module Fog
3
3
  class Fogdocker
4
4
  class Real
5
5
  def image_all(filters = {})
6
- Docker::Image.all.map do |image|
6
+ Docker::Image.all({}, @connection).map do |image|
7
7
  downcase_hash_keys(image.json)
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@ module Fog
3
3
  class Fogdocker
4
4
  class Real
5
5
  def image_create(attrs)
6
- downcase_hash_keys Docker::Image.create(attrs).json
6
+ downcase_hash_keys Docker::Image.create(attrs, nil, @connection).json
7
7
  end
8
8
  end
9
9
 
@@ -4,7 +4,7 @@ module Fog
4
4
  class Real
5
5
  def image_delete(options = {})
6
6
  raise ArgumentError, "instance id is a required parameter" unless options.key? :id
7
- image = Docker::Image.get(options[:id])
7
+ image = Docker::Image.get(options[:id], {}, @connection)
8
8
  image.remove()
9
9
  end
10
10
  end
@@ -3,7 +3,7 @@ module Fog
3
3
  class Fogdocker
4
4
  class Real
5
5
  def image_get(id)
6
- downcase_hash_keys Docker::Image.get(id).json
6
+ downcase_hash_keys Docker::Image.get(id, {}, @connection).json
7
7
  end
8
8
  end
9
9
  class Mock
@@ -3,7 +3,7 @@ module Fog
3
3
  class Fogdocker
4
4
  class Real
5
5
  def image_search(query = {})
6
- Docker::Util.parse_json(Docker.connection.get('/images/search', query)).map do |image|
6
+ Docker::Util.parse_json(@connection.get('/images/search', query)).map do |image|
7
7
  downcase_hash_keys(image)
8
8
  end
9
9
  end
@@ -4,7 +4,8 @@ module Fog
4
4
  module Compute
5
5
  class Google < Fog::Service
6
6
  requires :google_project
7
- recognizes :app_name, :app_version, :google_client_email, :google_key_location, :google_key_string, :google_client
7
+ recognizes :app_name, :app_version, :google_client_email, :google_key_location, :google_key_string,
8
+ :google_client, :google_json_key_location, :google_json_key_string
8
9
 
9
10
  GOOGLE_COMPUTE_API_VERSION = 'v1'
10
11
  GOOGLE_COMPUTE_BASE_URL = 'https://www.googleapis.com/compute/'
@@ -45,6 +45,8 @@ module Fog
45
45
  # @option options [String] :google_client_email A @developer.gserviceaccount.com email address to use
46
46
  # @option options [String] :google_key_location The location of a pkcs12 key file
47
47
  # @option options [String] :google_key_string The content of the pkcs12 key file
48
+ # @option options [String] :google_json_key_location The location of a JSON key file
49
+ # @option options [String] :google_json_key_string The content of the JSON key file
48
50
  # @option options [String] :google_api_scope_url The access scope URLs
49
51
  # @option options [String] :app_name The app name to set in the user agent
50
52
  # @option options [String] :app_version The app version to set in the user agent
@@ -64,19 +66,14 @@ module Fog
64
66
  client = options[:google_client]
65
67
  return client unless client.nil?
66
68
 
69
+ # Create a signing key
70
+ signing_key = create_signing_key(options)
71
+
67
72
  # Validate required arguments
68
73
  unless options[:google_client_email]
69
74
  raise ArgumentError.new('Missing required arguments: google_client_email')
70
75
  end
71
76
 
72
- if options[:google_key_location]
73
- google_key = File.expand_path(options[:google_key_location])
74
- elsif options[:google_key_string]
75
- google_key = options[:google_key_string]
76
- else
77
- raise ArgumentError.new('Missing required arguments: google_key_location or google_key_string')
78
- end
79
-
80
77
  unless options[:google_api_scope_url]
81
78
  raise ArgumentError.new('Missing required arguments: google_api_scope_url')
82
79
  end
@@ -84,23 +81,56 @@ module Fog
84
81
  # Create a new Google API Client
85
82
  self.new_pk12_google_client(
86
83
  options[:google_client_email],
87
- google_key,
84
+ signing_key,
88
85
  options[:google_api_scope_url],
89
86
  options[:app_name],
90
87
  options[:app_version]
91
88
  )
92
89
  end
93
90
 
91
+ ##
92
+ # Creates a Google signing key
93
+ #
94
+ def create_signing_key(options)
95
+ if options[:google_json_key_location] || options[:google_json_key_string]
96
+ if options[:google_json_key_location]
97
+ json_key_location = File.expand_path(options[:google_json_key_location])
98
+ json_key = File.open(json_key_location, 'r') { |file| file.read }
99
+ else
100
+ json_key = options[:google_json_key_string]
101
+ end
102
+
103
+ json_key_hash = Fog::JSON.decode(json_key)
104
+ unless json_key_hash.has_key?('client_email') || json_key_hash.has_key?('private_key')
105
+ raise ArgumentError.new('Invalid Google JSON key')
106
+ end
107
+
108
+ options[:google_client_email] = json_key_hash['client_email']
109
+ ::Google::APIClient::KeyUtils.load_from_pem(json_key_hash['private_key'], 'notasecret')
110
+ elsif options[:google_key_location] || options[:google_key_string]
111
+ if options[:google_key_location]
112
+ google_key = File.expand_path(options[:google_key_location])
113
+ else
114
+ google_key = options[:google_key_string]
115
+ end
116
+
117
+ ::Google::APIClient::KeyUtils.load_from_pkcs12(google_key, 'notasecret')
118
+ else
119
+ raise ArgumentError.new('Missing required arguments: google_key_location, google_key_string, ' \
120
+ 'google_json_key_location or google_json_key_string')
121
+ end
122
+ end
123
+
94
124
  ##
95
125
  # Create a Google API Client with a user email and a pkcs12 key
96
126
  #
97
127
  # @param [String] google_client_email A @developer.gserviceaccount.com email address to use
98
- # @param [String] google_key An absolute location to a pkcs12 key file or the content of the file itself
128
+ # @param [OpenSSL::PKey] signing_key The private key for signing
99
129
  # @param [String] google_api_scope_url Access scope URLs
100
130
  # @param [String] app_name The app name to set in the user agent
101
131
  # @param [String] app_version The app version to set in the user agent
102
132
  # @return [Google::APIClient] Google API Client
103
- def new_pk12_google_client(google_client_email, google_key, google_api_scope_url, app_name = nil, app_version = nil)
133
+ def new_pk12_google_client(google_client_email, signing_key, google_api_scope_url, app_name = nil, app_version = nil)
104
134
  application_name = app_name.nil? ? 'fog' : "#{app_name}/#{app_version || '0.0.0'} fog"
105
135
  api_client_options = {
106
136
  :application_name => application_name,
@@ -115,7 +145,7 @@ module Fog
115
145
  :client_x509_cert_url => "https://www.googleapis.com/robot/v1/metadata/x509/#{google_client_email}",
116
146
  :issuer => google_client_email,
117
147
  :scope => google_api_scope_url,
118
- :signing_key => ::Google::APIClient::KeyUtils.load_from_pkcs12(google_key, 'notasecret'),
148
+ :signing_key => signing_key,
119
149
  :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
120
150
  }
121
151
  )