fog 1.27.0 → 1.28.0

Sign up to get free protection for your applications and to get access to all the features.
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
  )