fog 1.35.0 → 1.36.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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +50 -0
  4. data/fog.gemspec +6 -6
  5. data/lib/fog/digitalocean/models/compute/server.rb +0 -1
  6. data/lib/fog/digitalocean/requests/compute_v2/create_ssh_key.rb +10 -8
  7. data/lib/fog/digitalocean/requests/compute_v2/delete_ssh_key.rb +5 -1
  8. data/lib/fog/digitalocean/requests/compute_v2/list_ssh_keys.rb +6 -1
  9. data/lib/fog/glesys/models/compute/server.rb +0 -1
  10. data/lib/fog/joyent/compute.rb +6 -1
  11. data/lib/fog/linode/compute.rb +3 -0
  12. data/lib/fog/linode/models/compute/data_center.rb +1 -0
  13. data/lib/fog/linode/models/compute/flavor.rb +3 -0
  14. data/lib/fog/linode/models/compute/flavors.rb +8 -1
  15. data/lib/fog/linode/models/compute/image.rb +2 -0
  16. data/lib/fog/linode/models/compute/images.rb +2 -1
  17. data/lib/fog/linode/models/compute/kernel.rb +3 -0
  18. data/lib/fog/linode/models/compute/kernels.rb +14 -8
  19. data/lib/fog/linode/models/compute/node_balancer_flavor.rb +13 -0
  20. data/lib/fog/linode/models/compute/node_balancer_flavors.rb +27 -0
  21. data/lib/fog/linode/requests/compute/avail_kernels.rb +17 -18
  22. data/lib/fog/linode/requests/compute/avail_linodeplans.rb +4 -2
  23. data/lib/fog/linode/requests/compute/avail_nodebalancers.rb +42 -0
  24. data/lib/fog/linode/requests/compute/avail_stackscripts.rb +6 -11
  25. data/lib/fog/openstack/core.rb +22 -21
  26. data/lib/fog/openstack/models/baremetal/nodes.rb +1 -1
  27. data/lib/fog/openstack/models/identity_v3/domain.rb +6 -0
  28. data/lib/fog/openstack/models/identity_v3/domains.rb +19 -4
  29. data/lib/fog/openstack/models/identity_v3/project.rb +10 -0
  30. data/lib/fog/openstack/models/identity_v3/projects.rb +16 -3
  31. data/lib/fog/openstack/models/identity_v3/tokens.rb +1 -0
  32. data/lib/fog/openstack/models/storage/file.rb +9 -0
  33. data/lib/fog/openstack/requests/baremetal/delete_node.rb +1 -1
  34. data/lib/fog/rackspace/requests/load_balancers/create_node.rb +1 -1
  35. data/lib/fog/version.rb +1 -1
  36. data/lib/fog/vsphere/compute.rb +8 -0
  37. data/lib/fog/vsphere/models/compute/network.rb +1 -0
  38. data/lib/fog/vsphere/models/compute/process.rb +18 -0
  39. data/lib/fog/vsphere/models/compute/server.rb +29 -0
  40. data/lib/fog/vsphere/models/compute/snapshot.rb +35 -0
  41. data/lib/fog/vsphere/models/compute/snapshots.rb +27 -0
  42. data/lib/fog/vsphere/requests/compute/create_vm.rb +65 -2
  43. data/lib/fog/vsphere/requests/compute/list_child_snapshots.rb +71 -0
  44. data/lib/fog/vsphere/requests/compute/list_networks.rb +5 -4
  45. data/lib/fog/vsphere/requests/compute/list_processes.rb +41 -0
  46. data/lib/fog/vsphere/requests/compute/list_vm_snapshots.rb +66 -0
  47. data/lib/fog/vsphere/requests/compute/revert_to_snapshot.rb +30 -0
  48. data/lib/fog/vsphere/requests/compute/vm_clone.rb +2 -5
  49. data/lib/fog/vsphere/requests/compute/vm_take_snapshot.rb +37 -0
  50. data/lib/tasks/changelog_task.rb +1 -0
  51. data/spec/fog/openstack/identity_v3/authv3_a.yml +18 -18
  52. data/spec/fog/openstack/identity_v3/authv3_b.yml +18 -18
  53. data/spec/fog/openstack/identity_v3/authv3_c.yml +293 -55
  54. data/spec/fog/openstack/identity_v3/authv3_token.yml +89 -89
  55. data/spec/fog/openstack/identity_v3/authv3_unscoped.yml +325 -222
  56. data/spec/fog/openstack/identity_v3/authv3_unscoped_reauth.yml +587 -111
  57. data/spec/fog/openstack/identity_v3/common_setup.yml +30 -30
  58. data/spec/fog/openstack/identity_v3/idv3_credential.yml +17 -17
  59. data/spec/fog/openstack/identity_v3/idv3_credential_crud.yml +343 -106
  60. data/spec/fog/openstack/identity_v3/idv3_domain.yml +27 -122
  61. data/spec/fog/openstack/identity_v3/idv3_domain_crud.yml +75 -128
  62. data/spec/fog/openstack/identity_v3/idv3_domain_group_roles_mutation.yml +141 -141
  63. data/spec/fog/openstack/identity_v3/idv3_domain_roles_mutation.yml +326 -86
  64. data/spec/fog/openstack/identity_v3/idv3_endpoint.yml +221 -221
  65. data/spec/fog/openstack/identity_v3/idv3_endpoints_crud.yml +314 -314
  66. data/spec/fog/openstack/identity_v3/idv3_group_crud_mutation.yml +191 -188
  67. data/spec/fog/openstack/identity_v3/idv3_policy.yml +23 -23
  68. data/spec/fog/openstack/identity_v3/idv3_policy_crud.yml +67 -67
  69. data/spec/fog/openstack/identity_v3/idv3_project.yml +267 -161
  70. data/spec/fog/openstack/identity_v3/idv3_project_crud.yml +70 -145
  71. data/spec/fog/openstack/identity_v3/idv3_project_group_user_roles_mutation.yml +195 -243
  72. data/spec/fog/openstack/identity_v3/idv3_project_hier_crud_list.yml +203 -553
  73. data/spec/fog/openstack/identity_v3/idv3_role.yml +49 -49
  74. data/spec/fog/openstack/identity_v3/idv3_role_crud.yml +92 -92
  75. data/spec/fog/openstack/identity_v3/idv3_service.yml +61 -61
  76. data/spec/fog/openstack/identity_v3/idv3_services_crud.yml +111 -111
  77. data/spec/fog/openstack/identity_v3/idv3_token.yml +84 -84
  78. data/spec/fog/openstack/identity_v3/idv3_user_crud.yml +140 -125
  79. data/spec/fog/openstack/identity_v3/idv3_users.yml +98 -78
  80. data/spec/fog/openstack/network/common_setup.yml +84 -75
  81. data/spec/fog/openstack/network/subnets_crud.yml +75 -35
  82. data/spec/fog/openstack/shared_context.rb +5 -1
  83. data/tests/helper.rb +1 -0
  84. data/tests/linode/requests/compute/datacenter_tests.rb +2 -1
  85. data/tests/linode/requests/compute/kernel_tests.rb +2 -10
  86. data/tests/linode/requests/compute/linodeplans_tests.rb +10 -7
  87. data/tests/linode/requests/compute/nodebalancers_tests.rb +20 -0
  88. data/tests/openstack/models/storage/file_tests.rb +29 -0
  89. data/tests/rackspace/requests/load_balancers/node_tests.rb +7 -0
  90. data/tests/vsphere/models/compute/server_tests.rb +27 -1
  91. data/tests/vsphere/requests/compute/list_child_snapshots_tests.rb +10 -0
  92. data/tests/vsphere/requests/compute/list_vm_snapshots_tests.rb +10 -0
  93. data/tests/vsphere/requests/compute/revert_to_snapshot_tests.rb +15 -0
  94. data/tests/vsphere/requests/compute/vm_take_snapshot_tests.rb +19 -0
  95. metadata +41 -16
  96. data/spec/fog/openstack/identity_v3/authv3_project.yml +0 -98
@@ -56,8 +56,10 @@ module Fog
56
56
  "DISK" => 20,
57
57
  "CORES" => 1,
58
58
  "AVAIL" => {
59
- "3"=>48, "2"=>207, "7"=>161, "6"=>143, "4"=>108, "8"=>60
60
- }
59
+ "2" => 500, "3" => 500, "4" => 500, "6" => 500, "7" => 500,
60
+ "8" => 500, "9" => 500, "10" => 500
61
+ },
62
+ "HOURLY" => 0.03
61
63
  }
62
64
  end
63
65
  end
@@ -0,0 +1,42 @@
1
+ module Fog
2
+ module Compute
3
+ class Linode
4
+ class Real
5
+ # Get NodeBalancer pricing information.
6
+ #
7
+ # ==== Parameters
8
+ #
9
+ # ==== Returns
10
+ # * response<~Excon::Response>:
11
+ # * body<~Array>:
12
+ # * 'MONTHLY'<~Float> - Monthly price
13
+ # * 'HOURLY'<~Float>: - Hourly price
14
+ # * 'CONNECTIONS'<~Integer>: - Maximum concurrent connections
15
+ def avail_nodebalancers
16
+ request(
17
+ :expects => 200,
18
+ :method => 'GET',
19
+ :query => { :api_action => 'avail.nodebalancers' }
20
+ )
21
+ end
22
+ end
23
+
24
+ class Mock
25
+ def avail_nodebalancers
26
+ response = Excon::Response.new
27
+ response.status = 200
28
+ response.body = {
29
+ "ERRORARRAY" => [],
30
+ "ACTION" => "avail.nodebalancers",
31
+ "DATA" => [{
32
+ "MONTHLY" => 20.0,
33
+ "HOURLY" => 0.03,
34
+ "CONNECTIONS" => 10000
35
+ }]
36
+ }
37
+ response
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -14,7 +14,7 @@ module Fog
14
14
  end
15
15
 
16
16
  class Mock
17
- def avail_stackscripts(stackscript_id=nil)
17
+ def avail_stackscripts(options={})
18
18
  response = Excon::Response.new
19
19
  response.status = 200
20
20
 
@@ -22,17 +22,12 @@ module Fog
22
22
  "ERRORARRAY" => [],
23
23
  "ACTION" => "avail.stackscripts"
24
24
  }
25
- if stackscript_id
26
- mock_stackscript = create_mock_stackscript(stackscript_id)
27
- response.body = body.merge("DATA" => [mock_stackscript])
28
- else
29
- mock_stackscripts = []
30
- 10.times do
31
- stackscript_id = rand(1..200)
32
- mock_stackscripts << create_mock_stackscript(stackscript_id)
33
- end
34
- response.body = body.merge("DATA" => mock_stackscripts)
25
+ mock_stackscripts = []
26
+ 10.times do
27
+ stackscript_id = rand(1..200)
28
+ mock_stackscripts << create_mock_stackscript(stackscript_id)
35
29
  end
30
+ response.body = body.merge("DATA" => mock_stackscripts)
36
31
  response
37
32
  end
38
33
 
@@ -154,17 +154,16 @@ module Fog
154
154
  @port = @openstack_management_uri.port
155
155
  @scheme = @openstack_management_uri.scheme
156
156
 
157
- # Not all implementations have identity service in the catalog
158
- if @openstack_identity_public_endpoint || @openstack_management_url
159
- @identity_connection = Fog::Core::Connection.new(
160
- @openstack_identity_public_endpoint || @openstack_management_url,
161
- false, @connection_options)
162
- end
163
-
164
157
  true
165
158
  end
166
159
  end
167
160
 
161
+ @@token_cache = {}
162
+
163
+ def self.clear_token_cache
164
+ @@token_cache.clear
165
+ end
166
+
168
167
  def self.authenticate(options, connection_options = {})
169
168
  case options[:openstack_auth_uri].path
170
169
  when /v1(\.\d+)?/
@@ -261,9 +260,9 @@ module Fog
261
260
  raise Fog::Errors::NotFound, message
262
261
  end
263
262
 
264
- if service['endpoints'].count > 1
265
- regions = service["endpoints"].map{ |e| e['region'] }.uniq.join(',')
266
- raise Fog::Errors::NotFound.new("Multiple regions available choose one of these '#{regions}'")
263
+ regions = service["endpoints"].map{ |e| e['region'] }.uniq
264
+ if regions.count > 1
265
+ raise Fog::Errors::NotFound.new("Multiple regions available choose one of these '#{regions.join(',')}'")
267
266
  end
268
267
 
269
268
  identity_service = get_service(body, identity_service_type) if identity_service_type
@@ -410,7 +409,7 @@ module Fog
410
409
  auth_token = options[:openstack_auth_token] || options[:unscoped_token]
411
410
  uri = options[:openstack_auth_uri]
412
411
 
413
- connection = Fog::Core::Connection.new(uri.to_s, false, connection_options)
412
+ @identity_connection = Fog::Core::Connection.new(uri.to_s, false, connection_options)
414
413
  request_body = {:auth => Hash.new}
415
414
 
416
415
  if auth_token
@@ -425,7 +424,7 @@ module Fog
425
424
  end
426
425
  request_body[:auth][:tenantName] = tenant_name if tenant_name
427
426
 
428
- response = connection.request({
427
+ response = @identity_connection.request({
429
428
  :expects => [200, 204],
430
429
  :headers => {'Content-Type' => 'application/json'},
431
430
  :body => Fog::JSON.encode(request_body),
@@ -504,17 +503,19 @@ module Fog
504
503
  end
505
504
  request_body[:auth][:scope] = scope unless scope.empty?
506
505
 
507
- puts "request_body: #{request_body}" if user_domain=='Default2'
506
+ path = (uri.path and not uri.path.empty?) ? uri.path : 'v3'
508
507
 
509
- response = connection.request({
510
- :expects => [201],
511
- :headers => {'Content-Type' => 'application/json'},
512
- :body => Fog::JSON.encode(request_body),
513
- :method => 'POST',
514
- :path => (uri.path and not uri.path.empty?) ? uri.path : 'v2.0'
515
- })
508
+ response, expires = @@token_cache[{body: request_body, path: path}]
516
509
 
517
- puts "response.body: #{response.body}" if user_domain=='Default2'
510
+ unless response && expires > Time.now
511
+ response = connection.request({ :expects => [201],
512
+ :headers => {'Content-Type' => 'application/json'},
513
+ :body => Fog::JSON.encode(request_body),
514
+ :method => 'POST',
515
+ :path => path
516
+ })
517
+ @@token_cache[{body: request_body, path: path}] = response, Time.now + 30 # 30-second TTL, enough for most requests
518
+ end
518
519
 
519
520
  [response.headers["X-Subject-Token"], Fog::JSON.decode(response.body)]
520
521
  end
@@ -27,7 +27,7 @@ module Fog
27
27
  alias_method :get, :find_by_uuid
28
28
 
29
29
  def destroy(uuid)
30
- node = self.find_by_id(uuid)
30
+ node = self.find_by_uuid(uuid)
31
31
  node.destroy
32
32
  end
33
33
 
@@ -17,12 +17,14 @@ module Fog
17
17
  end
18
18
 
19
19
  def destroy
20
+ @@cache.clear if @@cache
20
21
  requires :id
21
22
  service.delete_domain(self.id)
22
23
  true
23
24
  end
24
25
 
25
26
  def update(attr = nil)
27
+ @@cache.clear if @@cache
26
28
  requires :id, :name
27
29
  merge_attributes(
28
30
  service.update_domain(self.id, attr || attributes).body['domain'])
@@ -30,12 +32,16 @@ module Fog
30
32
  end
31
33
 
32
34
  def create
35
+ @@cache.clear if @@cache
33
36
  requires :name
34
37
  merge_attributes(
35
38
  service.create_domain(attributes).body['domain'])
36
39
  self
37
40
  end
38
41
 
42
+ def self.use_cache(cache)
43
+ @@cache = cache
44
+ end
39
45
  end
40
46
  end
41
47
  end
@@ -8,8 +8,20 @@ module Fog
8
8
  class Domains < Fog::OpenStack::Collection
9
9
  model Fog::Identity::OpenStack::V3::Domain
10
10
 
11
+ @@cache = {}
12
+ Fog::Identity::OpenStack::V3::Domain.use_cache(@@cache)
13
+
11
14
  def all(options = {})
12
- load_response(service.list_domains(options), 'domains')
15
+ cached_domain, expires = @@cache[{token: service.auth_token, options: options}]
16
+ return cached_domain if cached_domain && expires > Time.now
17
+ domain_to_cache = load_response(service.list_domains(options), 'domains')
18
+ @@cache[{token: service.auth_token, options: options}] = domain_to_cache, Time.now + 30 # 30-second TTL
19
+ return domain_to_cache
20
+ end
21
+
22
+ def create(attributes)
23
+ @@cache.clear if @@cache
24
+ super(attributes)
13
25
  end
14
26
 
15
27
  def auth_domains(options = {})
@@ -17,14 +29,17 @@ module Fog
17
29
  end
18
30
 
19
31
  def find_by_id(id)
20
- cached_domain = self.find { |domain| domain.id == id }
21
- return cached_domain if cached_domain
32
+ cached_domain, expires = @@cache[{token: service.auth_token, id: id}]
33
+ return cached_domain if cached_domain && expires > Time.now
22
34
  domain_hash = service.get_domain(id).body['domain']
23
- Fog::Identity::OpenStack::V3::Domain.new(
35
+ domain_to_cache = Fog::Identity::OpenStack::V3::Domain.new(
24
36
  domain_hash.merge(:service => service))
37
+ @@cache[{token: service.auth_token, id: id}] = domain_to_cache, Time.now + 30 # 30-second TTL
38
+ return domain_to_cache
25
39
  end
26
40
 
27
41
  def destroy(id)
42
+ @@cache.clear if @@cache
28
43
  domain = self.find_by_id(id)
29
44
  domain.destroy
30
45
  end
@@ -21,12 +21,14 @@ module Fog
21
21
  end
22
22
 
23
23
  def destroy
24
+ @@cache.clear if @@cache
24
25
  requires :id
25
26
  service.delete_project(self.id)
26
27
  true
27
28
  end
28
29
 
29
30
  def update(attr = nil)
31
+ @@cache.clear if @@cache
30
32
  requires :id
31
33
  merge_attributes(
32
34
  service.update_project(self.id, attr || attributes).body['project'])
@@ -34,6 +36,7 @@ module Fog
34
36
  end
35
37
 
36
38
  def create
39
+ @@cache.clear if @@cache
37
40
  merge_attributes(
38
41
  service.create_project(attributes).body['project'])
39
42
  self
@@ -45,6 +48,7 @@ module Fog
45
48
  end
46
49
 
47
50
  def grant_role_to_user(role_id, user_id)
51
+ @@cache.clear if @@cache
48
52
  requires :id
49
53
  service.grant_project_user_role(self.id, user_id, role_id)
50
54
  end
@@ -60,6 +64,7 @@ module Fog
60
64
  end
61
65
 
62
66
  def revoke_role_from_user(role_id, user_id)
67
+ @@cache.clear if @@cache
63
68
  requires :id
64
69
  service.revoke_project_user_role(self.id, user_id, role_id)
65
70
  end
@@ -70,6 +75,7 @@ module Fog
70
75
  end
71
76
 
72
77
  def grant_role_to_group(role_id, group_id)
78
+ @@cache.clear if @@cache
73
79
  requires :id
74
80
  service.grant_project_group_role(self.id, group_id, role_id)
75
81
  end
@@ -85,10 +91,14 @@ module Fog
85
91
  end
86
92
 
87
93
  def revoke_role_from_group(role_id, group_id)
94
+ @@cache.clear if @@cache
88
95
  requires :id
89
96
  service.revoke_project_group_role(self.id, group_id, role_id)
90
97
  end
91
98
 
99
+ def self.use_cache(cache)
100
+ @@cache = cache
101
+ end
92
102
  end
93
103
  end
94
104
  end
@@ -8,8 +8,20 @@ module Fog
8
8
  class Projects < Fog::OpenStack::Collection
9
9
  model Fog::Identity::OpenStack::V3::Project
10
10
 
11
+ @@cache = {}
12
+ Fog::Identity::OpenStack::V3::Project.use_cache(@@cache)
13
+
11
14
  def all(options = {})
12
- load_response(service.list_projects(options), 'projects')
15
+ cached_project, expires = @@cache[{token: service.auth_token, options: options}]
16
+ return cached_project if cached_project && expires > Time.now
17
+ project_to_cache = load_response(service.list_projects(options), 'projects')
18
+ @@cache[{token: service.auth_token, options: options}] = project_to_cache, Time.now + 30 # 30-second TTL
19
+ return project_to_cache
20
+ end
21
+
22
+ def create(attributes)
23
+ @@cache.clear if @@cache
24
+ super(attributes)
13
25
  end
14
26
 
15
27
  def auth_projects(options = {})
@@ -20,8 +32,8 @@ module Fog
20
32
  if options.is_a? Symbol # Deal with a single option being passed on its own
21
33
  options = [options]
22
34
  end
23
- cached_project = self.find { |project| project.id == id } if options.empty?
24
- return cached_project if cached_project
35
+ cached_project, expires = @@cache[{token: service.auth_token, id: id, options: options}]
36
+ return cached_project if cached_project && expires > Time.now
25
37
  project_hash = service.get_project(id, options).body['project']
26
38
  top_project = project_from_hash(project_hash, service)
27
39
  if options.include? :subtree_as_list
@@ -30,6 +42,7 @@ module Fog
30
42
  if options.include? :parents_as_list
31
43
  top_project.parents.map! {|proj_hash| project_from_hash(proj_hash['project'], service)}
32
44
  end
45
+ @@cache[{token: service.auth_token, id: id, options: options}] = top_project, Time.now + 30 # 30-second TTL
33
46
  return top_project
34
47
  end
35
48
 
@@ -10,6 +10,7 @@ module Fog
10
10
 
11
11
 
12
12
  def authenticate(auth)
13
+ @@cache ||= {}
13
14
  response = service.token_authenticate(auth)
14
15
  token_hash = response.body['token']
15
16
  Fog::Identity::OpenStack::V3::Token.new(
@@ -26,6 +26,13 @@ module Fog
26
26
  # @see http://docs.openstack.org/developer/swift/overview_expiring_objects.html
27
27
  attribute :delete_after, :aliases => ['X-Delete-After']
28
28
 
29
+ # @!attribute [rw] content_encoding
30
+ # When you create an object or update its metadata, you can optionally set the Content-Encoding metadata.
31
+ # This metadata enables you to indicate that the object content is compressed without losing the identity of the
32
+ # underlying media type (Content-Type) of the file, such as a video.
33
+ # @see http://docs.openstack.org/developer/swift/api/use_content-encoding_metadata.html#use-content-encoding-metadata
34
+ attribute :content_encoding, :aliases => 'Content-Encoding'
35
+
29
36
  def body
30
37
  attributes[:body] ||= if last_modified
31
38
  collection.get(identity).body
@@ -47,6 +54,7 @@ module Fog
47
54
  options['Content-Type'] ||= content_type if content_type
48
55
  options['Access-Control-Allow-Origin'] ||= access_control_allow_origin if access_control_allow_origin
49
56
  options['Origin'] ||= origin if origin
57
+ options['Content-Encoding'] ||= content_encoding if content_encoding
50
58
  service.copy_object(directory.key, key, target_directory_key, target_file_key, options)
51
59
  target_directory = service.directories.new(:key => target_directory_key)
52
60
  target_directory.files.get(target_file_key)
@@ -101,6 +109,7 @@ module Fog
101
109
  options['Origin'] = origin if origin
102
110
  options['X-Delete-At'] = delete_at if delete_at
103
111
  options['X-Delete-After'] = delete_after if delete_after
112
+ options['Content-Encoding'] = content_encoding if content_encoding
104
113
  options.merge!(metadata_to_headers)
105
114
 
106
115
  data = service.put_object(directory.key, key, body, options)
@@ -3,7 +3,7 @@ module Fog
3
3
  class OpenStack
4
4
  class Real
5
5
  def delete_node(node_uuid)
6
- data = { :node_uuid => node_uuid }
6
+ data = { :node_ident => node_uuid }
7
7
  request(
8
8
  :body => Fog::JSON.encode(data),
9
9
  :expects => [200, 204],
@@ -15,7 +15,7 @@ module Fog
15
15
  data['nodes'][0]['weight'] = options[:weight]
16
16
  end
17
17
  if options.key? :type
18
- data['node']['type'] = options[:type]
18
+ data['nodes'][0]['type'] = options[:type]
19
19
  end
20
20
  request(
21
21
  :body => Fog::JSON.encode(data),
@@ -1,3 +1,3 @@
1
1
  module Fog
2
- VERSION = '1.35.0'
2
+ VERSION = '1.36.0'
3
3
  end
@@ -22,6 +22,8 @@ module Fog
22
22
  collection :interfacetypes
23
23
  model :volume
24
24
  collection :volumes
25
+ model :snapshot
26
+ collection :snapshots
25
27
  model :template
26
28
  collection :templates
27
29
  model :cluster
@@ -39,6 +41,7 @@ module Fog
39
41
  model :customfield
40
42
  collection :customfields
41
43
  model :scsicontroller
44
+ model :process
42
45
 
43
46
  request_path 'fog/vsphere/requests/compute'
44
47
  request :current_time
@@ -86,6 +89,11 @@ module Fog
86
89
  request :list_customfields
87
90
  request :get_vm_first_scsi_controller
88
91
  request :set_vm_customvalue
92
+ request :vm_take_snapshot
93
+ request :list_vm_snapshots
94
+ request :list_child_snapshots
95
+ request :revert_to_snapshot
96
+ request :list_processes
89
97
 
90
98
  module Shared
91
99
  attr_reader :vsphere_is_vcenter