fog-core 1.21.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 (54) hide show
  1. checksums.yaml +15 -0
  2. data/lib/fog/account.rb +25 -0
  3. data/lib/fog/billing.rb +23 -0
  4. data/lib/fog/cdn.rb +23 -0
  5. data/lib/fog/compute.rb +80 -0
  6. data/lib/fog/compute/models/server.rb +104 -0
  7. data/lib/fog/core.rb +51 -0
  8. data/lib/fog/core/attributes.rb +227 -0
  9. data/lib/fog/core/class_from_string.rb +26 -0
  10. data/lib/fog/core/collection.rb +161 -0
  11. data/lib/fog/core/connection.rb +72 -0
  12. data/lib/fog/core/credentials.rb +70 -0
  13. data/lib/fog/core/current_machine.rb +34 -0
  14. data/lib/fog/core/deprecated_connection_accessors.rb +41 -0
  15. data/lib/fog/core/deprecation.rb +23 -0
  16. data/lib/fog/core/errors.rb +118 -0
  17. data/lib/fog/core/hmac.rb +35 -0
  18. data/lib/fog/core/logger.rb +44 -0
  19. data/lib/fog/core/mock.rb +115 -0
  20. data/lib/fog/core/model.rb +80 -0
  21. data/lib/fog/core/provider.rb +34 -0
  22. data/lib/fog/core/scp.rb +96 -0
  23. data/lib/fog/core/service.rb +223 -0
  24. data/lib/fog/core/ssh.rb +137 -0
  25. data/lib/fog/core/time.rb +32 -0
  26. data/lib/fog/core/uuid.rb +23 -0
  27. data/lib/fog/core/wait_for.rb +15 -0
  28. data/lib/fog/core/wait_for_defaults.rb +21 -0
  29. data/lib/fog/dns.rb +40 -0
  30. data/lib/fog/identity.rb +28 -0
  31. data/lib/fog/image.rb +23 -0
  32. data/lib/fog/metering.rb +25 -0
  33. data/lib/fog/monitoring.rb +24 -0
  34. data/lib/fog/network.rb +28 -0
  35. data/lib/fog/orchestration.rb +25 -0
  36. data/lib/fog/schema/data_validator.rb +154 -0
  37. data/lib/fog/storage.rb +80 -0
  38. data/lib/fog/support.rb +26 -0
  39. data/lib/fog/test_helpers.rb +12 -0
  40. data/lib/fog/test_helpers/collection_helper.rb +102 -0
  41. data/lib/fog/test_helpers/compute/flavors_helper.rb +34 -0
  42. data/lib/fog/test_helpers/compute/server_helper.rb +27 -0
  43. data/lib/fog/test_helpers/compute/servers_helper.rb +12 -0
  44. data/lib/fog/test_helpers/formats_helper.rb +99 -0
  45. data/lib/fog/test_helpers/helper.rb +25 -0
  46. data/lib/fog/test_helpers/mock_helper.rb +107 -0
  47. data/lib/fog/test_helpers/model_helper.rb +35 -0
  48. data/lib/fog/test_helpers/responds_to_helper.rb +13 -0
  49. data/lib/fog/test_helpers/succeeds_helper.rb +11 -0
  50. data/lib/fog/version.rb +3 -0
  51. data/lib/fog/volume.rb +25 -0
  52. data/lib/fog/vpn.rb +25 -0
  53. data/lib/tasks/test_task.rb +46 -0
  54. metadata +267 -0
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OTE4YzMxODZiYTk3ZTk1ZmRkMTQyZjliNzBhYTcyYTdjZWY3M2U4OQ==
5
+ data.tar.gz: !binary |-
6
+ OWIyMTkzMTU0NjkzNzkyMGUxYzFhM2MzZDY3MzkwOTNlNzFlYjNhNw==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MGIxYTNmNzA1YmRhNDZmYTllNjk5Zjk4YTdlMDRlZmE5ZGM2ZmRhMDllZGMz
10
+ YzRmOTQzYzEyMDFlNDk1MTQ4YmQ0OTQ4NDljZmViNmI0YjY3N2Q1M2E5ZDA2
11
+ MGM0OWMxYTNhMzQ1NmNmODcwMjYyZDQyNWRjZDY4ZDhkN2EzMzg=
12
+ data.tar.gz: !binary |-
13
+ MDBhMWUxZDRkZjA5Yzg2ZTIzNjMyNDBlMWViMTkwMDBlMjZlM2M4NDYxNjAy
14
+ NGM5OWYzMzhhN2JlOWQ1YzZlODYyMzg4NTkzYzg0NGUxOGRhMWIxMzhhZTc0
15
+ ZDYxMmFjY2ZhMDY0NDM1YjNmNWEzN2NlYTcyNDVhMGZmNzY1NTc=
@@ -0,0 +1,25 @@
1
+ module Fog
2
+ module Account
3
+
4
+ def self.[](provider)
5
+ self.new(:provider => provider)
6
+ end
7
+
8
+ def self.new(attributes)
9
+ attributes = attributes.dup
10
+ provider = attributes.delete(:provider).to_s.downcase.to_sym
11
+
12
+ if provider == :stormondemand
13
+ require 'fog/storm_on_demand/account'
14
+ Fog::Account::StormOnDemand.new(attributes)
15
+ else
16
+ raise ArgumentError.new("#{provider} has no account service")
17
+ end
18
+ end
19
+
20
+ def self.providers
21
+ Fog.services[:account]
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ module Fog
2
+ module Billing
3
+
4
+ def self.[](provider)
5
+ self.new(:provider => provider)
6
+ end
7
+
8
+ def self.new(attributes)
9
+ attributes = attributes.dup
10
+ provider = attributes.delete(:provider).to_s.downcase.to_sym
11
+ if provider == :stormondemand
12
+ require 'fog/storm_on_demand/billing'
13
+ Fog::Billing::StormOnDemand.new(attributes)
14
+ else
15
+ raise ArgumentError.new("#{provider} has no billing service")
16
+ end
17
+ end
18
+
19
+ def self.providers
20
+ Fog.services[:billing]
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ module Fog
2
+ module CDN
3
+
4
+ def self.[](provider)
5
+ self.new(:provider => provider)
6
+ end
7
+
8
+ def self.new(attributes)
9
+ attributes = attributes.dup # prevent delete from having side effects
10
+ provider = attributes.delete(:provider).to_s.downcase.to_sym
11
+ if self.providers.include?(provider)
12
+ require "fog/#{provider}/cdn"
13
+ return Fog::CDN.const_get(Fog.providers[provider]).new(attributes)
14
+ end
15
+ raise ArgumentError.new("#{provider} is not a recognized cdn provider")
16
+ end
17
+
18
+ def self.providers
19
+ Fog.services[:cdn]
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,80 @@
1
+ module Fog
2
+ module Compute
3
+
4
+ def self.[](provider)
5
+ self.new(:provider => provider)
6
+ end
7
+
8
+ def self.new(attributes)
9
+ attributes = attributes.dup # prevent delete from having side effects
10
+ provider = attributes.delete(:provider).to_s.downcase.to_sym
11
+
12
+
13
+ case provider
14
+ when :gogrid
15
+ require 'fog/go_grid/compute'
16
+ Fog::Compute::GoGrid.new(attributes)
17
+ when :hp
18
+ version = attributes.delete(:version)
19
+ version = version.to_s.downcase.to_sym unless version.nil?
20
+ if version == :v2
21
+ require 'fog/hp/compute_v2'
22
+ Fog::Compute::HPV2.new(attributes)
23
+ else
24
+ Fog::Logger.deprecation "HP Cloud Compute V1 service will be soon deprecated. Please use `:version => v2` attribute to use HP Cloud Compute V2 service."
25
+ require 'fog/hp/compute'
26
+ Fog::Compute::HP.new(attributes)
27
+ end
28
+ when :new_servers
29
+ require 'fog/bare_metal_cloud/compute'
30
+ Fog::Logger.deprecation "`new_servers` is deprecated. Please use `bare_metal_cloud` instead."
31
+ Fog::Compute::BareMetalCloud.new(attributes)
32
+ when :baremetalcloud
33
+ require 'fog/bare_metal_cloud/compute'
34
+ Fog::Compute::BareMetalCloud.new(attributes)
35
+ when :rackspace
36
+ version = attributes.delete(:version)
37
+ version = version.to_s.downcase.to_sym unless version.nil?
38
+ if version == :v1
39
+ Fog::Logger.deprecation "First Gen Cloud Servers are deprecated. Please use `:version => :v2` attribute to use Next Gen Cloud Servers."
40
+ require 'fog/rackspace/compute'
41
+ Fog::Compute::Rackspace.new(attributes)
42
+ else
43
+ require 'fog/rackspace/compute_v2'
44
+ Fog::Compute::RackspaceV2.new(attributes)
45
+ end
46
+ when :stormondemand
47
+ require 'fog/storm_on_demand/compute'
48
+ Fog::Compute::StormOnDemand.new(attributes)
49
+ when :vcloud
50
+ require 'fog/vcloud/compute'
51
+ Fog::Vcloud::Compute.new(attributes)
52
+ when :vclouddirector
53
+ require 'fog/vcloud_director/compute'
54
+ Fog::Compute::VcloudDirector.new(attributes)
55
+ else
56
+ if self.providers.include?(provider)
57
+ require "fog/#{provider}/compute"
58
+ return Fog::Compute.const_get(Fog.providers[provider]).new(attributes)
59
+ end
60
+ raise ArgumentError.new("#{provider} is not a recognized compute provider")
61
+ end
62
+ end
63
+
64
+ def self.providers
65
+ Fog.services[:compute]
66
+ end
67
+
68
+ def self.servers
69
+ servers = []
70
+ for provider in self.providers
71
+ begin
72
+ servers.concat(self[provider].servers)
73
+ rescue # ignore any missing credentials/etc
74
+ end
75
+ end
76
+ servers
77
+ end
78
+
79
+ end
80
+ end
@@ -0,0 +1,104 @@
1
+ require 'fog/core/model'
2
+
3
+ module Fog
4
+ module Compute
5
+ class Server < Fog::Model
6
+
7
+ attr_writer :username, :private_key, :private_key_path, :public_key, :public_key_path, :ssh_port, :ssh_options
8
+
9
+ def username
10
+ @username ||= 'root'
11
+ end
12
+
13
+ def private_key_path
14
+ @private_key_path ||= Fog.credentials[:private_key_path]
15
+ @private_key_path &&= File.expand_path(@private_key_path)
16
+ end
17
+
18
+ def private_key
19
+ @private_key ||= private_key_path && File.read(private_key_path)
20
+ end
21
+
22
+ def public_key_path
23
+ @public_key_path ||= Fog.credentials[:public_key_path]
24
+ @public_key_path &&= File.expand_path(@public_key_path)
25
+ end
26
+
27
+ def public_key
28
+ @public_key ||= public_key_path && File.read(public_key_path)
29
+ end
30
+
31
+ # Port used for ssh/scp interactions with server.
32
+ # @return [Integer] IP port
33
+ # @note By default this returns 22
34
+ def ssh_port
35
+ @ssh_port ||= 22
36
+ end
37
+
38
+ # Sets the proc used to determine the IP Address used for ssh/scp interactions.
39
+ # @example
40
+ # service.servers.bootstrap :name => 'bootstrap-server',
41
+ # :flavor_id => service.flavors.first.id,
42
+ # :image_id => service.images.find {|img| img.name =~ /Ubuntu/}.id,
43
+ # :public_key_path => '~/.ssh/fog_rsa.pub',
44
+ # :private_key_path => '~/.ssh/fog_rsa',
45
+ # :ssh_ip_address => Proc.new {|server| server.private_ip_address }
46
+ #
47
+ # @note By default scp/ssh will use the public_ip_address if this proc is not set.
48
+ def ssh_ip_address=(proc)
49
+ @ssh_ip_address = proc
50
+ end
51
+
52
+ # IP Address used for ssh/scp interactions with server.
53
+ # @return [String] IP Address
54
+ # @note By default this returns the public_ip_address
55
+ def ssh_ip_address
56
+ return public_ip_address unless @ssh_ip_address
57
+ return @ssh_ip_address.call(self) if @ssh_ip_address.is_a?(Proc)
58
+ @ssh_ip_address
59
+ end
60
+
61
+ def ssh_options
62
+ @ssh_options ||= {}
63
+ ssh_options = @ssh_options.merge({:port => ssh_port})
64
+ if private_key
65
+ ssh_options[:key_data] = [private_key]
66
+ ssh_options[:auth_methods] = ["publickey"]
67
+ end
68
+ ssh_options
69
+ end
70
+
71
+ def scp(local_path, remote_path, upload_options = {})
72
+ require 'net/scp'
73
+ requires :ssh_ip_address, :username
74
+
75
+ Fog::SCP.new(ssh_ip_address, username, ssh_options).upload(local_path, remote_path, upload_options)
76
+ end
77
+
78
+ alias_method :scp_upload, :scp
79
+
80
+ def scp_download(remote_path, local_path, download_options = {})
81
+ require 'net/scp'
82
+ requires :ssh_ip_address, :username
83
+
84
+ Fog::SCP.new(ssh_ip_address, username, ssh_options).download(remote_path, local_path, download_options)
85
+ end
86
+
87
+ def ssh(commands, options={}, &blk)
88
+ require 'net/ssh'
89
+ requires :ssh_ip_address, :username
90
+
91
+ options = ssh_options.merge(options)
92
+
93
+ Fog::SSH.new(ssh_ip_address, username, options).run(commands, &blk)
94
+ end
95
+
96
+ def sshable?(options={})
97
+ ready? && !ssh_ip_address.nil? && !!Timeout::timeout(8) { ssh('pwd', options) }
98
+ rescue SystemCallError, Net::SSH::AuthenticationFailed, Net::SSH::Disconnect, Timeout::Error
99
+ false
100
+ end
101
+
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,51 @@
1
+ # external core dependencies
2
+ require 'base64'
3
+ require 'cgi'
4
+ require 'uri'
5
+ require 'excon'
6
+ require 'fileutils'
7
+ require 'formatador'
8
+ require 'openssl'
9
+ require 'time'
10
+ require 'timeout'
11
+ require 'ipaddr'
12
+
13
+ # internal core dependencies
14
+ require "fog/version"
15
+ require 'fog/core/attributes'
16
+ require 'fog/core/collection'
17
+ require 'fog/core/connection'
18
+ require 'fog/core/credentials'
19
+ require 'fog/core/current_machine'
20
+ require 'fog/core/deprecation'
21
+ require 'fog/core/errors'
22
+ require 'fog/core/hmac'
23
+ require 'fog/core/logger'
24
+ require 'fog/core/model'
25
+ require 'fog/core/mock'
26
+ require 'fog/core/provider'
27
+ require 'fog/core/service'
28
+ require 'fog/core/ssh'
29
+ require 'fog/core/scp'
30
+ require 'fog/core/time'
31
+ require 'fog/core/wait_for'
32
+ require 'fog/core/wait_for_defaults'
33
+ require 'fog/core/class_from_string'
34
+ require 'fog/core/uuid'
35
+
36
+ # service wrappers
37
+ require 'fog/account'
38
+ require 'fog/billing'
39
+ require 'fog/cdn'
40
+ require 'fog/compute'
41
+ require 'fog/dns'
42
+ require 'fog/identity'
43
+ require 'fog/image'
44
+ require 'fog/metering'
45
+ require 'fog/monitoring'
46
+ require 'fog/network'
47
+ require 'fog/orchestration'
48
+ require 'fog/storage'
49
+ require 'fog/support'
50
+ require 'fog/volume'
51
+ require 'fog/vpn'
@@ -0,0 +1,227 @@
1
+ module Fog
2
+ module Attributes
3
+ module ClassMethods
4
+
5
+ def _load(marshalled)
6
+ new(Marshal.load(marshalled))
7
+ end
8
+
9
+ def aliases
10
+ @aliases ||= {}
11
+ end
12
+
13
+ def attributes
14
+ @attributes ||= []
15
+ end
16
+
17
+ def attribute(name, options = {})
18
+ class_eval <<-EOS, __FILE__, __LINE__
19
+ def #{name}
20
+ attributes[:#{name}]
21
+ end
22
+ EOS
23
+ case options[:type]
24
+ when :boolean
25
+ class_eval <<-EOS, __FILE__, __LINE__
26
+ def #{name}=(new_#{name})
27
+ attributes[:#{name}] = case new_#{name}
28
+ when true,'true'
29
+ true
30
+ when false,'false'
31
+ false
32
+ end
33
+ end
34
+ EOS
35
+ when :float
36
+ class_eval <<-EOS, __FILE__, __LINE__
37
+ def #{name}=(new_#{name})
38
+ attributes[:#{name}] = new_#{name}.to_f
39
+ end
40
+ EOS
41
+ when :integer
42
+ class_eval <<-EOS, __FILE__, __LINE__
43
+ def #{name}=(new_#{name})
44
+ attributes[:#{name}] = new_#{name}.to_i
45
+ end
46
+ EOS
47
+ when :string
48
+ class_eval <<-EOS, __FILE__, __LINE__
49
+ def #{name}=(new_#{name})
50
+ attributes[:#{name}] = new_#{name}.to_s
51
+ end
52
+ EOS
53
+ when :time
54
+ class_eval <<-EOS, __FILE__, __LINE__
55
+ def #{name}=(new_#{name})
56
+ attributes[:#{name}] = if new_#{name}.nil? || new_#{name} == "" || new_#{name}.is_a?(Time)
57
+ new_#{name}
58
+ else
59
+ Time.parse(new_#{name})
60
+ end
61
+ end
62
+ EOS
63
+ when :timestamp
64
+ class_eval <<-EOS, __FILE__, __LINE__
65
+ def #{name}=(new_#{name})
66
+ attributes[:#{name}] = Time.at(new_#{name}.to_i)
67
+ end
68
+ EOS
69
+ when :array
70
+ class_eval <<-EOS, __FILE__, __LINE__
71
+ def #{name}=(new_#{name})
72
+ attributes[:#{name}] = [*new_#{name}]
73
+ end
74
+ EOS
75
+ else
76
+ if squash = options[:squash]
77
+ class_eval <<-EOS, __FILE__, __LINE__
78
+ def #{name}=(new_data)
79
+ if new_data.is_a?(Hash)
80
+ if new_data.has_key?(:'#{squash}')
81
+ attributes[:#{name}] = new_data[:'#{squash}']
82
+ elsif new_data.has_key?("#{squash}")
83
+ attributes[:#{name}] = new_data["#{squash}"]
84
+ else
85
+ attributes[:#{name}] = [ new_data ]
86
+ end
87
+ else
88
+ attributes[:#{name}] = new_data
89
+ end
90
+ end
91
+ EOS
92
+ else
93
+ class_eval <<-EOS, __FILE__, __LINE__
94
+ def #{name}=(new_#{name})
95
+ attributes[:#{name}] = new_#{name}
96
+ end
97
+ EOS
98
+ end
99
+ end
100
+ @attributes ||= []
101
+ @attributes |= [name]
102
+ for new_alias in [*options[:aliases]]
103
+ aliases[new_alias] = name
104
+ end
105
+ end
106
+
107
+ def identity(name, options = {})
108
+ @identity = name
109
+ self.attribute(name, options)
110
+ end
111
+
112
+ def ignore_attributes(*args)
113
+ @ignored_attributes = args.collect {|attr| attr.to_s }
114
+ end
115
+
116
+ def ignored_attributes
117
+ @ignored_attributes ||= []
118
+ end
119
+
120
+ end
121
+
122
+ module InstanceMethods
123
+
124
+ def _dump(level)
125
+ Marshal.dump(attributes)
126
+ end
127
+
128
+ def attributes
129
+ @attributes ||= {}
130
+ end
131
+
132
+ def dup
133
+ copy = super
134
+ copy.dup_attributes!
135
+ copy
136
+ end
137
+
138
+ def identity
139
+ send(self.class.instance_variable_get('@identity'))
140
+ end
141
+
142
+ def identity=(new_identity)
143
+ send("#{self.class.instance_variable_get('@identity')}=", new_identity)
144
+ end
145
+
146
+ def merge_attributes(new_attributes = {})
147
+ for key, value in new_attributes
148
+ unless self.class.ignored_attributes.include?(key)
149
+ if aliased_key = self.class.aliases[key]
150
+ send("#{aliased_key}=", value)
151
+ elsif self.respond_to?("#{key}=",true)
152
+ send("#{key}=", value)
153
+ else
154
+ attributes[key] = value
155
+ end
156
+ end
157
+ end
158
+ self
159
+ end
160
+
161
+ # Returns true if a remote resource has been assigned an
162
+ # identity and we can assume it has been persisted.
163
+ #
164
+ # @return [Boolean]
165
+ def persisted?
166
+ !!identity
167
+ end
168
+
169
+ # Returns true if a remote resource has not been assigned an
170
+ # identity.
171
+ #
172
+ # This was added for a ActiveRecord like feel but has been
173
+ # outdated by ActiveModel API using {#persisted?}
174
+ #
175
+ # @deprecated Use inverted form of {#persisted?}
176
+ # @return [Boolean]
177
+ def new_record?
178
+ Fog::Logger.deprecation("#new_record? is deprecated, use !persisted? instead [light_black](#{caller.first})[/]")
179
+ !persisted?
180
+ end
181
+
182
+ # check that the attributes specified in args exist and is not nil
183
+ def requires(*args)
184
+ missing = missing_attributes(args)
185
+ if missing.length == 1
186
+ raise(ArgumentError, "#{missing.first} is required for this operation")
187
+ elsif missing.any?
188
+ raise(ArgumentError, "#{missing[0...-1].join(", ")} and #{missing[-1]} are required for this operation")
189
+ end
190
+ end
191
+
192
+ def requires_one(*args)
193
+ missing = missing_attributes(args)
194
+ if missing.length == args.length
195
+ raise(ArgumentError, "#{missing[0...-1].join(", ")} or #{missing[-1]} are required for this operation")
196
+ end
197
+ end
198
+
199
+ protected
200
+
201
+ def missing_attributes(args)
202
+ missing = []
203
+ for arg in [:service] | args
204
+ unless send("#{arg}") || attributes.has_key?(arg)
205
+ missing << arg
206
+ end
207
+ end
208
+ missing
209
+ end
210
+
211
+ def dup_attributes!
212
+ @attributes = @attributes.dup if @attributes
213
+ end
214
+
215
+ private
216
+
217
+ def remap_attributes(attributes, mapping)
218
+ for key, value in mapping
219
+ if attributes.key?(key)
220
+ attributes[value] = attributes.delete(key)
221
+ end
222
+ end
223
+ end
224
+
225
+ end
226
+ end
227
+ end