fog-core 1.21.1 → 1.22.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Build Status](https://secure.travis-ci.org/fog/fog-core.png?branch=master)](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
|
-
|