fog-core 1.21.1 → 1.22.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.
- checksums.yaml +8 -8
- data/.gitignore +18 -0
- data/.travis.yml +59 -0
- data/CONTRIBUTING.md +22 -0
- data/CONTRIBUTORS.md +9 -0
- data/Gemfile +4 -0
- data/Gemfile.1.8.7 +12 -0
- data/LICENSE.md +20 -0
- data/README.md +31 -0
- data/Rakefile +33 -0
- data/changelog.md +7 -0
- data/fog-core.gemspec +35 -0
- data/lib/fog/compute.rb +7 -2
- data/lib/fog/core.rb +1 -1
- data/lib/fog/core/credentials.rb +41 -22
- data/lib/fog/core/model.rb +5 -4
- data/lib/fog/core/service.rb +128 -41
- data/lib/fog/core/utils.rb +24 -0
- data/lib/fog/core/wait_for.rb +2 -1
- data/lib/fog/core/wait_for_defaults.rb +16 -2
- data/lib/fog/identity.rb +10 -10
- data/lib/fog/storage.rb +7 -3
- data/lib/fog/version.rb +1 -1
- data/spec/compute_spec.rb +97 -0
- data/spec/connection_spec.rb +33 -0
- data/spec/credentials_spec.rb +88 -0
- data/spec/current_machine_spec.rb +34 -0
- data/spec/fog_attribute_spec.rb +69 -0
- data/spec/identity_spec.rb +97 -0
- data/spec/mocking_spec.rb +85 -0
- data/spec/service_spec.rb +186 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/storage_spec.rb +97 -0
- data/spec/test_helpers/formats_helper_spec.rb +120 -0
- data/spec/test_helpers/schema_validator_spec.rb +101 -0
- data/spec/timeout_spec.rb +21 -0
- data/spec/utils_spec.rb +29 -0
- data/spec/uuid_spec.rb +11 -0
- data/spec/wait_for_spec.rb +19 -0
- metadata +71 -14
- data/lib/fog/core/class_from_string.rb +0 -26
checksums.yaml
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
!binary "U0hBMQ==":
|
|
3
3
|
metadata.gz: !binary |-
|
|
4
|
-
|
|
4
|
+
YTNmYzY5ZmZiYjA4OTVkZWU2MTA0OTQ3ZmVmZmYxM2M0Y2UxY2ZkMA==
|
|
5
5
|
data.tar.gz: !binary |-
|
|
6
|
-
|
|
6
|
+
MGJmMDEwODNmZjRiYjA5MTYzMmNkZjA3OTY4NTAzNzAzZGJkZjE0ZQ==
|
|
7
7
|
SHA512:
|
|
8
8
|
metadata.gz: !binary |-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
NTNmYzVjYzdjMmJiN2NjMjU3ZmFmYTYxZGJiYTA1MTEzZjBmNWFmMWY3Zjg0
|
|
10
|
+
NDU0YTcxYWY5ZTU0ODViMGIwMTYyN2IzMWI4YWFlOTVhZjgyYjM5ODU0MTcx
|
|
11
|
+
ZTY2MGZkZTVmYmFlMDI4NmVlZGFkNWMxMmY1YTcyOWZhNjJlYTc=
|
|
12
12
|
data.tar.gz: !binary |-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
YTgyMTQ0MWQzOWI5NWM5OWYwNjcxZTE3NWExNWNhZmM1ODU0Y2RlNTNmMDlm
|
|
14
|
+
NGFjOThlNDNkNDNmMjA4YTlkNTU4NmU0YjRjNmE4Mzk0ZTExODYyODQzMzg4
|
|
15
|
+
OWVlZmQxNDRlM2U2YzViY2ZhOTA0MGY2YzUwOTFjNjFiZWQ2OWI=
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
language: ruby
|
|
2
|
+
|
|
3
|
+
gemfile:
|
|
4
|
+
- Gemfile
|
|
5
|
+
- Gemfile.1.8.7
|
|
6
|
+
|
|
7
|
+
rvm:
|
|
8
|
+
- 1.8.7
|
|
9
|
+
- 1.9.2
|
|
10
|
+
- 1.9.3
|
|
11
|
+
- 2.0.0
|
|
12
|
+
- 2.1.0
|
|
13
|
+
- jruby-18mode
|
|
14
|
+
- jruby-19mode
|
|
15
|
+
- jruby-head
|
|
16
|
+
|
|
17
|
+
script: bundle exec rake travis
|
|
18
|
+
|
|
19
|
+
matrix:
|
|
20
|
+
include:
|
|
21
|
+
- rvm: 2.1.0
|
|
22
|
+
gemfile: Gemfile
|
|
23
|
+
env: COVERAGE=true
|
|
24
|
+
exclude:
|
|
25
|
+
- rvm: 1.8.7
|
|
26
|
+
gemfile: Gemfile
|
|
27
|
+
- rvm: 1.9.2
|
|
28
|
+
gemfile: Gemfile.1.8.7
|
|
29
|
+
- rvm: 1.9.3
|
|
30
|
+
gemfile: Gemfile.1.8.7
|
|
31
|
+
- rvm: 2.0.0
|
|
32
|
+
gemfile: Gemfile.1.8.7
|
|
33
|
+
- rvm: 2.1.0
|
|
34
|
+
gemfile: Gemfile.1.8.7
|
|
35
|
+
- rvm: jruby-18mode
|
|
36
|
+
gemfile: Gemfile
|
|
37
|
+
- rvm: jruby-19mode
|
|
38
|
+
gemfile: Gemfile.1.8.7
|
|
39
|
+
- rvm: jruby-head
|
|
40
|
+
gemfile: Gemfile.1.8.7
|
|
41
|
+
|
|
42
|
+
allow_failures:
|
|
43
|
+
- rvm: jruby-head
|
|
44
|
+
|
|
45
|
+
notifications:
|
|
46
|
+
email: false
|
|
47
|
+
irc:
|
|
48
|
+
channels:
|
|
49
|
+
- "irc.freenode.org#ruby-fog"
|
|
50
|
+
template:
|
|
51
|
+
- "[#%{build_number}] %{message} %{build_url}"
|
|
52
|
+
- "[#%{build_number}] %{commit} on %{branch} by %{author}"
|
|
53
|
+
- "[#%{build_number}] %{compare_url}"
|
|
54
|
+
on_success: always
|
|
55
|
+
on_failure: always
|
|
56
|
+
use_notice: false
|
|
57
|
+
|
|
58
|
+
before_install:
|
|
59
|
+
- gem update --system # todo: workaround for https://github.com/rubygems/rubygems/pull/763
|
data/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
## Getting Involved
|
|
2
|
+
|
|
3
|
+
New contributors are always welcome, when it doubt please ask questions. We strive to be an open and welcoming community. Please be nice to one another.
|
|
4
|
+
|
|
5
|
+
### Coding
|
|
6
|
+
|
|
7
|
+
* Pick a task:
|
|
8
|
+
* Offer feedback on open [pull requests](https://github.com/fog/fog-core/pulls).
|
|
9
|
+
* Review open [issues](https://github.com/fog/fog-core/issues) for things to help on.
|
|
10
|
+
* [Create an issue](https://github.com/fog/fog-core/issues/new) to start a discussion on additions or features.
|
|
11
|
+
* Fork the project, add your changes and tests to cover them in a topic branch.
|
|
12
|
+
* Commit your changes and rebase against `fog/fog-core` to ensure everything is up to date.
|
|
13
|
+
* [Submit a pull request](https://github.com/fog/fog-core/compare/)
|
|
14
|
+
|
|
15
|
+
### Non-Coding
|
|
16
|
+
|
|
17
|
+
* Offer feedback on open [issues](https://github.com/fog/fog-core/issues).
|
|
18
|
+
* Write and help edit [documentation](https://github.com/fog/fog.github.com).
|
|
19
|
+
* Translate [documentation](https://github.com/fog/fog.github.com) in to other languages.
|
|
20
|
+
* Organize or volunteer at events.
|
|
21
|
+
* [Donate](https://www.gittip.com/geemus/)
|
|
22
|
+
* Discuss other ideas for contribution with [geemus](mailto:geemus+fog@gmail.com).
|
data/CONTRIBUTORS.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
* Anatol <anatol.pomozov@gmail.com>
|
|
2
|
+
* Chris Johnson <wchrisjohnson@gmail.com>
|
|
3
|
+
* Dominic Cleal <dcleal@redhat.com>
|
|
4
|
+
* Evan Light <evan@tripledogdare.net>
|
|
5
|
+
* Paul Thornthwaite <paul@brightbox.co.uk>
|
|
6
|
+
* Paul Thornthwaite <tokengeek@gmail.com>
|
|
7
|
+
* Wesley Beary <geemus+github@gmail.com>
|
|
8
|
+
* geemus <geemus@gmail.com>
|
|
9
|
+
* mountkin <moutkin@gmail.com>
|
data/Gemfile
ADDED
data/Gemfile.1.8.7
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
source "https://rubygems.org"
|
|
2
|
+
|
|
3
|
+
gem 'nokogiri', '~>1.5.11'
|
|
4
|
+
gem 'mime-types', '~>1.16'
|
|
5
|
+
|
|
6
|
+
group :development, :test do
|
|
7
|
+
gem 'rake', '~> 10.1.0'
|
|
8
|
+
# This is here because gemspec doesn't support require: false
|
|
9
|
+
gem 'coveralls', :require => false
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
gemspec
|
data/LICENSE.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2014 [CONTRIBUTORS.md](https://github.com/fog/fog/blob/master/CONTRIBUTORS.md)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
7
|
+
the Software without restriction, including without limitation the rights to
|
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
10
|
+
subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Fog::Core
|
|
2
|
+
|
|
3
|
+
Shared classes and tests for fog providers and services.
|
|
4
|
+
|
|
5
|
+
[](http://travis-ci.org/fog/fog-core)
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
Add this line to your application's Gemfile:
|
|
10
|
+
|
|
11
|
+
gem 'fog-core'
|
|
12
|
+
|
|
13
|
+
And then execute:
|
|
14
|
+
|
|
15
|
+
$ bundle
|
|
16
|
+
|
|
17
|
+
Or install it yourself as:
|
|
18
|
+
|
|
19
|
+
$ gem install fog-core
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
TODO: Write usage instructions here
|
|
24
|
+
|
|
25
|
+
## Contributing
|
|
26
|
+
|
|
27
|
+
1. Fork it ( http://github.com/<my-github-username>/fog-core/fork )
|
|
28
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
29
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
30
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
31
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'bundler/setup'
|
|
2
|
+
|
|
3
|
+
task :travis => ['test:travis', 'coveralls_push_workaround']
|
|
4
|
+
task :default => [:test]
|
|
5
|
+
|
|
6
|
+
require "rake/testtask"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
Rake::TestTask.new do |t|
|
|
10
|
+
t.libs << "lib"
|
|
11
|
+
t.libs << "spec"
|
|
12
|
+
t.pattern = "spec/**/*_spec.rb"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
namespace :test do
|
|
16
|
+
mock = 'true' || ENV['FOG_MOCK']
|
|
17
|
+
task :travis do
|
|
18
|
+
# jruby coveralls causes an OOM in travis
|
|
19
|
+
ENV['COVERAGE'] = 'false' if RUBY_PLATFORM == 'java'
|
|
20
|
+
sh("export FOG_MOCK=#{mock} && rake")
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
#require "tasks/changelog_task"
|
|
25
|
+
#Fog::Rake::ChangelogTask.new
|
|
26
|
+
task :coveralls_push_workaround do
|
|
27
|
+
use_coveralls = (Gem::Version.new(RUBY_VERSION) > Gem::Version.new('1.9.2'))
|
|
28
|
+
if (ENV['COVERAGE'] != 'false') && use_coveralls
|
|
29
|
+
require 'coveralls/rake/task'
|
|
30
|
+
Coveralls::RakeTask.new
|
|
31
|
+
Rake::Task["coveralls:push"].invoke
|
|
32
|
+
end
|
|
33
|
+
end
|
data/changelog.md
ADDED
data/fog-core.gemspec
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'fog/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = "fog-core"
|
|
8
|
+
spec.version = Fog::VERSION
|
|
9
|
+
spec.authors = ["Evan Light", "Wesley Beary"]
|
|
10
|
+
spec.email = ["evan@tripledogdare.net", "geemus@gmail.com"]
|
|
11
|
+
spec.summary = %q{Shared classes and tests for fog providers and services.}
|
|
12
|
+
spec.description = %q{Shared classes and tests for fog providers and services.}
|
|
13
|
+
spec.homepage = "https://github.com/fog/fog-core"
|
|
14
|
+
spec.license = "MIT"
|
|
15
|
+
|
|
16
|
+
spec.files = `git ls-files`.split($/)
|
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
|
+
spec.require_paths = ["lib"]
|
|
20
|
+
|
|
21
|
+
spec.add_dependency('builder')
|
|
22
|
+
spec.add_dependency('excon', '~>0.33')
|
|
23
|
+
spec.add_dependency('formatador', '~>0.2')
|
|
24
|
+
spec.add_dependency('mime-types')
|
|
25
|
+
spec.add_dependency('net-scp', '~>1.1')
|
|
26
|
+
spec.add_dependency('net-ssh', '>=2.1.3')
|
|
27
|
+
|
|
28
|
+
spec.add_development_dependency('rake')
|
|
29
|
+
spec.add_development_dependency('yard')
|
|
30
|
+
spec.add_development_dependency('thor')
|
|
31
|
+
spec.add_development_dependency('minitest')
|
|
32
|
+
spec.add_development_dependency('minitest-stub-const')
|
|
33
|
+
spec.add_development_dependency('pry')
|
|
34
|
+
spec.add_development_dependency('coveralls')
|
|
35
|
+
end
|
data/lib/fog/compute.rb
CHANGED
|
@@ -55,9 +55,14 @@ module Fog
|
|
|
55
55
|
else
|
|
56
56
|
if self.providers.include?(provider)
|
|
57
57
|
require "fog/#{provider}/compute"
|
|
58
|
-
|
|
58
|
+
begin
|
|
59
|
+
Fog::Compute.const_get(Fog.providers[provider])
|
|
60
|
+
rescue
|
|
61
|
+
Fog::const_get(Fog.providers[provider])::Compute
|
|
62
|
+
end.new(attributes)
|
|
63
|
+
else
|
|
64
|
+
raise ArgumentError.new("#{provider} is not a recognized compute provider")
|
|
59
65
|
end
|
|
60
|
-
raise ArgumentError.new("#{provider} is not a recognized compute provider")
|
|
61
66
|
end
|
|
62
67
|
end
|
|
63
68
|
|
data/lib/fog/core.rb
CHANGED
|
@@ -28,9 +28,9 @@ require 'fog/core/service'
|
|
|
28
28
|
require 'fog/core/ssh'
|
|
29
29
|
require 'fog/core/scp'
|
|
30
30
|
require 'fog/core/time'
|
|
31
|
+
require 'fog/core/utils'
|
|
31
32
|
require 'fog/core/wait_for'
|
|
32
33
|
require 'fog/core/wait_for_defaults'
|
|
33
|
-
require 'fog/core/class_from_string'
|
|
34
34
|
require 'fog/core/uuid'
|
|
35
35
|
|
|
36
36
|
# service wrappers
|
data/lib/fog/core/credentials.rb
CHANGED
|
@@ -3,19 +3,49 @@ require 'yaml'
|
|
|
3
3
|
module Fog
|
|
4
4
|
require 'fog/core/deprecation'
|
|
5
5
|
|
|
6
|
+
# Sets the global configuration up from a Hash rather than using background loading from a file
|
|
7
|
+
#
|
|
8
|
+
# @example
|
|
9
|
+
# Fog.credentials = {
|
|
10
|
+
# :default => {
|
|
11
|
+
# :example_url => "https://example.com/"
|
|
12
|
+
# :example_username => "bob",
|
|
13
|
+
# :example_password => "obo"
|
|
14
|
+
# },
|
|
15
|
+
# :production => {
|
|
16
|
+
# :example_username => "bob",
|
|
17
|
+
# :example_password => "obo"
|
|
18
|
+
# }
|
|
19
|
+
# }
|
|
20
|
+
#
|
|
21
|
+
# @return [Hash] The newly assigned credentials
|
|
22
|
+
def self.credentials=(new_credentials)
|
|
23
|
+
@credentials = new_credentials
|
|
24
|
+
end
|
|
25
|
+
|
|
6
26
|
# Assign a new credential to use from configuration file
|
|
7
|
-
#
|
|
8
|
-
#
|
|
27
|
+
#
|
|
28
|
+
# @param [String, Symbol] new_credential name of new credential to use
|
|
29
|
+
# @return [Symbol] name of the new credential
|
|
9
30
|
def self.credential=(new_credential)
|
|
10
31
|
@credentials = nil
|
|
11
32
|
@credential = new_credential && new_credential.to_sym
|
|
12
33
|
end
|
|
13
34
|
|
|
14
|
-
#
|
|
35
|
+
# This is the named credential from amongst the configuration file being used or +:default+
|
|
36
|
+
#
|
|
37
|
+
# @note This can be set using the +FOG_CREDENTIAL+ environment variable
|
|
38
|
+
#
|
|
39
|
+
# @return [Symbol] The credential to use in Fog
|
|
15
40
|
def self.credential
|
|
16
41
|
@credential ||= ( ENV["FOG_CREDENTIAL"] && ENV["FOG_CREDENTIAL"].to_sym ) || :default
|
|
17
42
|
end
|
|
18
43
|
|
|
44
|
+
# This returns the path to the configuration file being used globally to look for sets of
|
|
45
|
+
# credentials
|
|
46
|
+
#
|
|
47
|
+
# @note This can be set using the +FOG_RC+ environment variable or defaults to +$HOME/.fog+
|
|
48
|
+
#
|
|
19
49
|
# @return [String] The path for configuration_file
|
|
20
50
|
def self.credentials_path
|
|
21
51
|
@credential_path ||= begin
|
|
@@ -35,9 +65,9 @@ module Fog
|
|
|
35
65
|
# @return [Hash] The credentials pulled from the configuration file
|
|
36
66
|
# @raise [LoadError] Configuration unavailable in configuration file
|
|
37
67
|
def self.credentials
|
|
38
|
-
@credentials
|
|
68
|
+
@credentials ||= begin
|
|
39
69
|
if credentials_path && File.exists?(credentials_path)
|
|
40
|
-
credentials =
|
|
70
|
+
credentials = Fog::Core::Utils.prepare_service_settings(YAML.load_file(credentials_path))
|
|
41
71
|
(credentials && credentials[credential]) || Fog::Errors.missing_credentials
|
|
42
72
|
else
|
|
43
73
|
{}
|
|
@@ -45,26 +75,15 @@ module Fog
|
|
|
45
75
|
end
|
|
46
76
|
end
|
|
47
77
|
|
|
48
|
-
# @
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
end
|
|
52
|
-
|
|
78
|
+
# @deprecated Don't use!
|
|
79
|
+
# @param [Object] key
|
|
80
|
+
# @return [true] if key == :headers
|
|
53
81
|
def self.symbolize_credential?(key)
|
|
54
82
|
![:headers].include?(key)
|
|
55
83
|
end
|
|
56
84
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
args.each do |key, value|
|
|
61
|
-
obj = symbolize_credential?(key) ? self.symbolize_credentials(value) : value
|
|
62
|
-
copy.push(key.to_sym, obj)
|
|
63
|
-
end
|
|
64
|
-
Hash[*copy]
|
|
65
|
-
else
|
|
66
|
-
args
|
|
67
|
-
end
|
|
85
|
+
# @deprecated Use {Fog::Core::Utils.prepare_service_settings} instead
|
|
86
|
+
def self.symbolize_credentials(hash)
|
|
87
|
+
Fog::Core::Utils.prepare_service_settings(hash)
|
|
68
88
|
end
|
|
69
|
-
|
|
70
89
|
end
|
data/lib/fog/core/model.rb
CHANGED
|
@@ -12,12 +12,13 @@ module Fog
|
|
|
12
12
|
|
|
13
13
|
def initialize(new_attributes = {})
|
|
14
14
|
# TODO Remove compatibility with old connection option
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
attribs = new_attributes.clone
|
|
16
|
+
@service = attribs.delete(:service)
|
|
17
|
+
if @service.nil? && attribs[:connection]
|
|
17
18
|
Fog::Logger.deprecation("Passing :connection option is deprecated, use :service instead [light_black](#{caller.first})[/]")
|
|
18
|
-
@service =
|
|
19
|
+
@service = attribs[:connection]
|
|
19
20
|
end
|
|
20
|
-
merge_attributes(
|
|
21
|
+
merge_attributes(attribs)
|
|
21
22
|
end
|
|
22
23
|
|
|
23
24
|
def inspect
|
data/lib/fog/core/service.rb
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
require "fog/core/utils"
|
|
2
2
|
|
|
3
|
+
module Fog
|
|
3
4
|
def self.services
|
|
4
5
|
@services ||= {}
|
|
5
6
|
end
|
|
6
7
|
|
|
7
8
|
class Service
|
|
8
|
-
|
|
9
9
|
class Error < Fog::Errors::Error; end
|
|
10
10
|
class NotFound < Fog::Errors::NotFound; end
|
|
11
11
|
|
|
@@ -16,7 +16,6 @@ module Fog
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
module Collections
|
|
19
|
-
|
|
20
19
|
def collections
|
|
21
20
|
service.collections
|
|
22
21
|
end
|
|
@@ -28,11 +27,9 @@ module Fog
|
|
|
28
27
|
def requests
|
|
29
28
|
service.requests
|
|
30
29
|
end
|
|
31
|
-
|
|
32
30
|
end
|
|
33
31
|
|
|
34
32
|
class << self
|
|
35
|
-
|
|
36
33
|
def inherited(child)
|
|
37
34
|
child.class_eval <<-EOS, __FILE__, __LINE__
|
|
38
35
|
class Error < Fog::Service::Error; end
|
|
@@ -52,27 +49,78 @@ module Fog
|
|
|
52
49
|
EOS
|
|
53
50
|
end
|
|
54
51
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
52
|
+
# {Fog::Service} is (unfortunately) both a builder class and the subclass for any fog service.
|
|
53
|
+
#
|
|
54
|
+
# Creating a {new} instance using the builder will return either an instance of
|
|
55
|
+
# +Fog::<Service>::<Provider>::Real+ or +Fog::<Service>::<Provider>::Mock+ based on the value
|
|
56
|
+
# of {Fog.mock?} when the builder is used.
|
|
57
|
+
#
|
|
58
|
+
# Each provider can require or recognize different settings (often prefixed with the providers
|
|
59
|
+
# name). These settings map to keys in the +~/.fog+ file.
|
|
60
|
+
#
|
|
61
|
+
# Settings can be passed as either a Hash or an object that responds to +config_service?+ with
|
|
62
|
+
# +true+. This object will be passed through unchanged to the +Real+ or +Mock+ service that is
|
|
63
|
+
# created. It is up to providers to adapt services to use these config objects.
|
|
64
|
+
#
|
|
65
|
+
# @abstract Subclass and implement real or mock code
|
|
66
|
+
#
|
|
67
|
+
# @param [Hash,#config_service?] config
|
|
68
|
+
# Settings or an object used to build a service instance
|
|
69
|
+
# @option config [Hash] :headers
|
|
70
|
+
# Passed to the underlying {Fog::Core::Connection} unchanged
|
|
71
|
+
#
|
|
72
|
+
# @return [Fog::Service::Provider::Real] if created while mocking is disabled
|
|
73
|
+
# @return [Fog::Service::Provider::Mock] if created while mocking is enabled
|
|
74
|
+
# @raise [ArgumentError] if a setting required by the provider was not passed in
|
|
75
|
+
#
|
|
76
|
+
# @example Minimal options (dependent on ~/.fog)
|
|
77
|
+
# @service = Fog::Compute::Example.new # => <#Fog::Compute::Example::Real>
|
|
78
|
+
#
|
|
79
|
+
# @example Mocked service
|
|
80
|
+
# Fog.mock!
|
|
81
|
+
# @service = Fog::Compute::Example.new # => <#Fog::Compute::Example::Mock>
|
|
82
|
+
#
|
|
83
|
+
# @example Configured using many options (options merged into ~/.fog)
|
|
84
|
+
# @options = {
|
|
85
|
+
# :example_username => "fog",
|
|
86
|
+
# :example_password => "fog"
|
|
87
|
+
# }
|
|
88
|
+
# @service = Fog::Compute::Example.new(@options)
|
|
89
|
+
#
|
|
90
|
+
# @example Configured using external config object (~/.fog ignored completely)
|
|
91
|
+
# @config = Fog::Example::Config.new(...)
|
|
92
|
+
# @service = Fog::Compute::Example.new(@config)
|
|
93
|
+
#
|
|
94
|
+
def new(config = {})
|
|
95
|
+
if config.respond_to?(:config_service?) && config.config_service?
|
|
96
|
+
cleaned_settings = config
|
|
97
|
+
else
|
|
98
|
+
cleaned_settings = handle_settings(config)
|
|
99
|
+
end
|
|
60
100
|
setup_requirements
|
|
61
101
|
|
|
102
|
+
svc = service
|
|
62
103
|
if Fog.mocking?
|
|
63
|
-
|
|
64
|
-
|
|
104
|
+
while svc != Fog::Service
|
|
105
|
+
service::Mock.send(:include, svc::Collections)
|
|
106
|
+
svc = svc.superclass
|
|
107
|
+
end
|
|
108
|
+
service::Mock.new(cleaned_settings)
|
|
65
109
|
else
|
|
66
|
-
|
|
110
|
+
while svc != Fog::Service
|
|
111
|
+
service::Real.send(:include, svc::Collections)
|
|
112
|
+
svc = svc.superclass
|
|
113
|
+
end
|
|
67
114
|
service::Real.send(:include, service::NoLeakInspector)
|
|
68
|
-
service::Real.new(
|
|
115
|
+
service::Real.new(cleaned_settings)
|
|
69
116
|
end
|
|
70
117
|
end
|
|
71
118
|
|
|
119
|
+
# @deprecated
|
|
72
120
|
def fetch_credentials(options)
|
|
73
121
|
# attempt to load credentials from config file
|
|
74
122
|
begin
|
|
75
|
-
Fog.credentials.reject {|key, value| !(recognized | requirements).include?(key)}
|
|
123
|
+
Fog.credentials.reject { |key, value| !(recognized | requirements).include?(key) }
|
|
76
124
|
rescue LoadError
|
|
77
125
|
# if there are no configured credentials, do nothing
|
|
78
126
|
{}
|
|
@@ -86,34 +134,14 @@ module Fog
|
|
|
86
134
|
|
|
87
135
|
@required ||= false
|
|
88
136
|
unless @required
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
service::Collections.module_eval <<-EOS, __FILE__, __LINE__
|
|
93
|
-
def #{collection}(attributes = {})
|
|
94
|
-
#{service}::#{constant}.new({:service => self}.merge(attributes))
|
|
95
|
-
end
|
|
96
|
-
EOS
|
|
97
|
-
end
|
|
98
|
-
for model in models
|
|
99
|
-
require [@model_path, model].join('/')
|
|
100
|
-
end
|
|
101
|
-
for request in requests
|
|
102
|
-
require [@request_path, request].join('/')
|
|
103
|
-
if service::Mock.method_defined?(request)
|
|
104
|
-
mocked_requests << request
|
|
105
|
-
else
|
|
106
|
-
service::Mock.module_eval <<-EOS, __FILE__, __LINE__
|
|
107
|
-
def #{request}(*args)
|
|
108
|
-
Fog::Mock.not_implemented
|
|
109
|
-
end
|
|
110
|
-
EOS
|
|
111
|
-
end
|
|
112
|
-
end
|
|
137
|
+
require_models
|
|
138
|
+
require_collections_and_define
|
|
139
|
+
require_requests_and_mock
|
|
113
140
|
@required = true
|
|
114
141
|
end
|
|
115
142
|
end
|
|
116
143
|
|
|
144
|
+
# @note This path is used to require model and collection files
|
|
117
145
|
def model_path(new_path)
|
|
118
146
|
@model_path = new_path
|
|
119
147
|
end
|
|
@@ -204,6 +232,7 @@ module Fog
|
|
|
204
232
|
end
|
|
205
233
|
end
|
|
206
234
|
missing = requirements - keys
|
|
235
|
+
|
|
207
236
|
unless missing.empty?
|
|
208
237
|
raise ArgumentError, "Missing required arguments: #{missing.join(', ')}"
|
|
209
238
|
end
|
|
@@ -216,8 +245,66 @@ module Fog
|
|
|
216
245
|
end
|
|
217
246
|
end
|
|
218
247
|
|
|
219
|
-
|
|
248
|
+
private
|
|
249
|
+
|
|
250
|
+
# This is the original way service settings were handled. Settings from +~/.fog+ were merged
|
|
251
|
+
# together with the passed options, keys are turned to symbols and coerced into Boolean or
|
|
252
|
+
# Fixnums.
|
|
253
|
+
#
|
|
254
|
+
# If the class has declared any required settings then {ArgumentError} will be raised.
|
|
255
|
+
#
|
|
256
|
+
# Any setting that is not whitelisted will cause a warning to be output.
|
|
257
|
+
#
|
|
258
|
+
def handle_settings(settings)
|
|
259
|
+
combined_settings = fetch_credentials(settings).merge(settings)
|
|
260
|
+
prepared_settings = Fog::Core::Utils.prepare_service_settings(combined_settings)
|
|
261
|
+
validate_options(prepared_settings)
|
|
262
|
+
coerce_options(prepared_settings)
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
# This will attempt to require all model files declared by the service using fog's DSL
|
|
266
|
+
def require_models
|
|
267
|
+
models.each do |model|
|
|
268
|
+
require File.join(@model_path, model.to_s)
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def require_collections_and_define
|
|
273
|
+
collections.each do |collection|
|
|
274
|
+
require File.join(@model_path, collection.to_s)
|
|
275
|
+
constant = camel_case_collection_name(collection)
|
|
276
|
+
service::Collections.module_eval <<-EOS, __FILE__, __LINE__
|
|
277
|
+
def #{collection}(attributes = {})
|
|
278
|
+
#{service}::#{constant}.new({ :service => self }.merge(attributes))
|
|
279
|
+
end
|
|
280
|
+
EOS
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
# This converts names of collections from Symbols as defined in the DSL (+:database_server+)
|
|
285
|
+
# into CamelCase version (+DatabaseServer+) for metaprogramming skulduggery.
|
|
286
|
+
#
|
|
287
|
+
# @param [String,Symbol] collection The name of the collection broken with underscores
|
|
288
|
+
# @return [String] in camel case
|
|
289
|
+
def camel_case_collection_name(collection)
|
|
290
|
+
collection.to_s.split('_').map(&:capitalize).join
|
|
291
|
+
end
|
|
220
292
|
|
|
293
|
+
# This will attempt to require all request files declared in the service using fog's DSL
|
|
294
|
+
def require_requests_and_mock
|
|
295
|
+
requests.each do |request|
|
|
296
|
+
require File.join(@request_path, request.to_s)
|
|
297
|
+
if service::Mock.method_defined?(request)
|
|
298
|
+
mocked_requests << request
|
|
299
|
+
else
|
|
300
|
+
service::Mock.module_eval <<-EOS, __FILE__, __LINE__
|
|
301
|
+
def #{request}(*args)
|
|
302
|
+
Fog::Mock.not_implemented
|
|
303
|
+
end
|
|
304
|
+
EOS
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
221
309
|
end
|
|
222
310
|
end
|
|
223
|
-
|