fog-core 2.0.0 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/stale.yml +17 -0
- data/CONTRIBUTING.md +5 -1
- data/Rakefile +2 -2
- data/changelog.md +182 -137
- data/fog-core.gemspec +1 -1
- data/lib/fog/account.rb +0 -16
- data/lib/fog/billing.rb +0 -11
- data/lib/fog/compute.rb +0 -22
- data/lib/fog/core/attributes.rb +14 -2
- data/lib/fog/core/connection.rb +3 -5
- data/lib/fog/core/errors.rb +4 -0
- data/lib/fog/core/model.rb +2 -0
- data/lib/fog/core/provider.rb +31 -1
- data/lib/fog/core/scp.rb +3 -1
- data/lib/fog/core/services_mixin.rb +55 -4
- data/lib/fog/core/ssh.rb +47 -23
- data/lib/fog/core/version.rb +1 -1
- data/lib/fog/dns.rb +0 -11
- data/lib/fog/monitoring.rb +0 -11
- data/lib/fog/network.rb +0 -12
- data/lib/fog/storage.rb +0 -14
- data/lib/fog/support.rb +0 -12
- data/lib/fog/test_helpers/mock_helper.rb +6 -4
- data/lib/fog/vpn.rb +0 -12
- data/spec/compute_spec.rb +13 -13
- data/spec/identity_spec.rb +14 -14
- data/spec/storage_spec.rb +15 -17
- metadata +9 -9
data/fog-core.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
|
23
23
|
spec.add_dependency("builder")
|
24
24
|
spec.add_dependency("mime-types")
|
25
|
-
spec.add_dependency("excon", "~> 0.
|
25
|
+
spec.add_dependency("excon", "~> 0.71")
|
26
26
|
spec.add_dependency("formatador", "~> 0.2")
|
27
27
|
|
28
28
|
# https://github.com/fog/fog-core/issues/206
|
data/lib/fog/account.rb
CHANGED
@@ -1,21 +1,5 @@
|
|
1
1
|
module Fog
|
2
2
|
module Account
|
3
3
|
extend Fog::ServicesMixin
|
4
|
-
|
5
|
-
def self.new(orig_attributes)
|
6
|
-
attributes = orig_attributes.dup
|
7
|
-
provider = attributes.delete(:provider).to_s.downcase.to_sym
|
8
|
-
|
9
|
-
if provider == :stormondemand
|
10
|
-
require "fog/account/storm_on_demand"
|
11
|
-
Fog::Account::StormOnDemand.new(attributes)
|
12
|
-
else
|
13
|
-
super(orig_attributes)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.providers
|
18
|
-
Fog.services[:account] || []
|
19
|
-
end
|
20
4
|
end
|
21
5
|
end
|
data/lib/fog/billing.rb
CHANGED
@@ -1,16 +1,5 @@
|
|
1
1
|
module Fog
|
2
2
|
module Billing
|
3
3
|
extend Fog::ServicesMixin
|
4
|
-
|
5
|
-
def self.new(orig_attributes)
|
6
|
-
attributes = orig_attributes.dup
|
7
|
-
provider = attributes.delete(:provider).to_s.downcase.to_sym
|
8
|
-
if provider == :stormondemand
|
9
|
-
require "fog/billing/storm_on_demand"
|
10
|
-
Fog::Billing::StormOnDemand.new(attributes)
|
11
|
-
else
|
12
|
-
super(orig_attributes)
|
13
|
-
end
|
14
|
-
end
|
15
4
|
end
|
16
5
|
end
|
data/lib/fog/compute.rb
CHANGED
@@ -7,16 +7,6 @@ module Fog
|
|
7
7
|
provider = attributes.delete(:provider).to_s.downcase.to_sym
|
8
8
|
|
9
9
|
case provider
|
10
|
-
when :gogrid
|
11
|
-
require "fog/go_grid/compute"
|
12
|
-
Fog::Compute::GoGrid.new(attributes)
|
13
|
-
when :new_servers
|
14
|
-
require "fog/bare_metal_cloud/compute"
|
15
|
-
Fog::Logger.deprecation "`new_servers` is deprecated. Please use `bare_metal_cloud` instead."
|
16
|
-
Fog::Compute::BareMetalCloud.new(attributes)
|
17
|
-
when :baremetalcloud
|
18
|
-
require "fog/bare_metal_cloud/compute"
|
19
|
-
Fog::Compute::BareMetalCloud.new(attributes)
|
20
10
|
when :rackspace
|
21
11
|
version = attributes.delete(:version)
|
22
12
|
version = version.to_s.downcase.to_sym unless version.nil?
|
@@ -38,18 +28,6 @@ module Fog
|
|
38
28
|
require 'fog/digitalocean/compute'
|
39
29
|
Fog::Compute::DigitalOcean.new(attributes)
|
40
30
|
end
|
41
|
-
when :stormondemand
|
42
|
-
require "fog/compute/storm_on_demand"
|
43
|
-
Fog::Compute::StormOnDemand.new(attributes)
|
44
|
-
when :vcloud
|
45
|
-
require "fog/vcloud/compute"
|
46
|
-
Fog::Vcloud::Compute.new(attributes)
|
47
|
-
when :vclouddirector
|
48
|
-
require "fog/vcloud_director/compute"
|
49
|
-
Fog::Compute::VcloudDirector.new(attributes)
|
50
|
-
when :cloudatcost
|
51
|
-
require "fog/cloudatcost/compute"
|
52
|
-
Fog::Compute::CloudAtCost.new(attributes)
|
53
31
|
else
|
54
32
|
super(orig_attributes)
|
55
33
|
end
|
data/lib/fog/core/attributes.rb
CHANGED
@@ -79,14 +79,26 @@ module Fog
|
|
79
79
|
|
80
80
|
def all_attributes
|
81
81
|
self.class.attributes.reduce({}) do |hash, attribute|
|
82
|
-
|
82
|
+
if masks[attribute].nil?
|
83
|
+
Fog::Logger.deprecation("Please define #{attribute} using the Fog DSL")
|
84
|
+
hash[attribute] = send(attribute)
|
85
|
+
else
|
86
|
+
hash[masks[attribute]] = send(attribute)
|
87
|
+
end
|
88
|
+
|
83
89
|
hash
|
84
90
|
end
|
85
91
|
end
|
86
92
|
|
87
93
|
def all_associations
|
88
94
|
self.class.associations.keys.reduce({}) do |hash, association|
|
89
|
-
|
95
|
+
if masks[association].nil?
|
96
|
+
Fog::Logger.deprecation("Please define #{association} using the Fog DSL")
|
97
|
+
hash[association] = associations[association] || send(association)
|
98
|
+
else
|
99
|
+
hash[masks[association]] = associations[association] || send(association)
|
100
|
+
end
|
101
|
+
|
90
102
|
hash
|
91
103
|
end
|
92
104
|
end
|
data/lib/fog/core/connection.rb
CHANGED
@@ -44,12 +44,10 @@ module Fog
|
|
44
44
|
# @option params [Class] :instrumentor Responds to #instrument as in ActiveSupport::Notifications
|
45
45
|
# @option params [String] :instrumentor_name Name prefix for #instrument events. Defaults to 'excon'
|
46
46
|
def initialize(url, persistent = false, params = {})
|
47
|
-
|
48
|
-
if params[:path]
|
49
|
-
raise ArgumentError, "optional arg 'path' is invalid when 'path_prefix' is provided"
|
50
|
-
end
|
47
|
+
@path_prefix = params.delete(:path_prefix)
|
51
48
|
|
52
|
-
|
49
|
+
if @path_prefix && params[:path]
|
50
|
+
raise ArgumentError, "optional arg 'path' is invalid when 'path_prefix' is provided"
|
53
51
|
end
|
54
52
|
|
55
53
|
params[:debug_response] = true unless params.key?(:debug_response)
|
data/lib/fog/core/errors.rb
CHANGED
@@ -112,6 +112,10 @@ An alternate file may be used by placing its path in the FOG_RC environment vari
|
|
112
112
|
:vcloud_director_host:
|
113
113
|
:vcloud_director_username:
|
114
114
|
:vcloud_director_password:
|
115
|
+
:kubevirt_hostname:
|
116
|
+
:kubevirt_port:
|
117
|
+
:kubevirt_token:
|
118
|
+
|
115
119
|
#
|
116
120
|
# End of Fog Credentials File
|
117
121
|
#######################################################
|
data/lib/fog/core/model.rb
CHANGED
data/lib/fog/core/provider.rb
CHANGED
@@ -11,6 +11,7 @@ module Fog
|
|
11
11
|
def self.extended(base)
|
12
12
|
provider = base.to_s.split("::").last
|
13
13
|
Fog.providers[provider.downcase.to_sym] = provider
|
14
|
+
Fog.providers[underscore_name(provider)] = provider
|
14
15
|
end
|
15
16
|
|
16
17
|
def [](service_key)
|
@@ -21,11 +22,40 @@ module Fog
|
|
21
22
|
Fog.services[new_service] ||= []
|
22
23
|
Fog.services[new_service] |= [to_s.split("::").last.downcase.to_sym]
|
23
24
|
@services_registry ||= {}
|
24
|
-
@services_registry[new_service] =
|
25
|
+
@services_registry[new_service] = service_klass(constant_string)
|
25
26
|
end
|
26
27
|
|
27
28
|
def services
|
28
29
|
@services_registry.keys
|
29
30
|
end
|
31
|
+
|
32
|
+
# Returns service constant path, with provider, as string. If
|
33
|
+
# "provider::service" is defined (the preferred format) then it returns that
|
34
|
+
# string, otherwise it returns the deprecated string "service::provider".
|
35
|
+
def service_klass(constant_string)
|
36
|
+
eval([to_s, constant_string].join("::"))
|
37
|
+
[to_s, constant_string].join("::")
|
38
|
+
rescue NameError
|
39
|
+
provider = to_s.split("::").last
|
40
|
+
Fog::Logger.deprecation("Unable to load #{[to_s, constant_string].join("::")}")
|
41
|
+
Fog::Logger.deprecation(
|
42
|
+
format(
|
43
|
+
Fog::ServicesMixin::E_SERVICE_PROVIDER_CONSTANT,
|
44
|
+
service: constant_string,
|
45
|
+
provider: provider
|
46
|
+
)
|
47
|
+
)
|
48
|
+
['Fog', constant_string, provider].join("::")
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def underscore_name(string)
|
54
|
+
string.gsub(/::/, '/').
|
55
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
56
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
57
|
+
tr("-", "_").
|
58
|
+
downcase
|
59
|
+
end
|
30
60
|
end
|
31
61
|
end
|
data/lib/fog/core/scp.rb
CHANGED
@@ -64,7 +64,9 @@ module Fog
|
|
64
64
|
|
65
65
|
@address = address
|
66
66
|
@username = username
|
67
|
-
@options = { :paranoid => false, :verify_host_key =>
|
67
|
+
@options = { :paranoid => false, :verify_host_key => :never }.merge(options)
|
68
|
+
@options.delete(:paranoid) if Net::SSH::VALID_OPTIONS.include? :verify_host_key
|
69
|
+
@options[:verify_host_key] = false unless Net::SSH::Verifiers.const_defined?(:Never)
|
68
70
|
end
|
69
71
|
|
70
72
|
def upload(local_path, remote_path, upload_options = {}, &block)
|
@@ -1,12 +1,25 @@
|
|
1
1
|
module Fog
|
2
2
|
module ServicesMixin
|
3
|
+
E_SERVICE_PROVIDER_CONSTANT = <<-EOS.gsub(/\s+/, ' ').strip.freeze
|
4
|
+
Falling back to deprecated constant Fog::%<service>s::%<provider>s. The
|
5
|
+
preferred format of service provider constants has changed from
|
6
|
+
service::provider to provider::service. Please update this service
|
7
|
+
provider to use the preferred format.
|
8
|
+
EOS
|
9
|
+
E_SERVICE_PROVIDER_PATH = <<-EOS.gsub(/\s+/, ' ').strip.freeze
|
10
|
+
Falling back to deprecated path fog/%<service>s/%<provider>s. The
|
11
|
+
preferred file path format has changed from service/provider to
|
12
|
+
provider/service. Please update this service provider to use the preferred
|
13
|
+
format.
|
14
|
+
EOS
|
15
|
+
|
3
16
|
def [](provider)
|
4
17
|
new(:provider => provider)
|
5
18
|
end
|
6
19
|
|
7
20
|
def new(attributes)
|
8
21
|
attributes = attributes.dup # Prevent delete from having side effects
|
9
|
-
provider = attributes.delete(:provider).to_s.downcase.to_sym
|
22
|
+
provider = check_provider_alias(attributes.delete(:provider).to_s.downcase.to_sym)
|
10
23
|
provider_name = Fog.providers[provider]
|
11
24
|
|
12
25
|
raise ArgumentError, "#{provider} is not a recognized provider" unless providers.include?(provider)
|
@@ -14,7 +27,9 @@ module Fog
|
|
14
27
|
require_service_provider_library(service_name.downcase, provider)
|
15
28
|
spc = service_provider_constant(service_name, provider_name)
|
16
29
|
spc.new(attributes)
|
17
|
-
rescue LoadError, NameError # Only rescue errors in finding the libraries, allow connection errors through to the caller
|
30
|
+
rescue LoadError, NameError => e # Only rescue errors in finding the libraries, allow connection errors through to the caller
|
31
|
+
Fog::Logger.warning("Error while loading provider #{provider}: #{e.message}")
|
32
|
+
Fog::Logger.debug("backtrace: #{e.backtrace.join("\n")}")
|
18
33
|
raise Fog::Service::NotFound, "#{provider} has no #{service_name.downcase} service"
|
19
34
|
end
|
20
35
|
|
@@ -24,16 +39,28 @@ module Fog
|
|
24
39
|
|
25
40
|
private
|
26
41
|
|
42
|
+
# This method should be removed once all providers are extracted.
|
43
|
+
# Bundler will correctly require all dependencies automatically and thus
|
44
|
+
# fog-core wont need to know any specifics providers. Each provider will
|
45
|
+
# have to load its dependencies.
|
27
46
|
def require_service_provider_library(service, provider)
|
28
47
|
require "fog/#{provider}/#{service}"
|
29
48
|
rescue LoadError # Try to require the service provider in an alternate location
|
49
|
+
Fog::Logger.deprecation("Unable to require fog/#{provider}/#{service}")
|
50
|
+
Fog::Logger.deprecation(
|
51
|
+
format(E_SERVICE_PROVIDER_PATH, service: service, provider: provider)
|
52
|
+
)
|
30
53
|
require "fog/#{service}/#{provider}"
|
31
54
|
end
|
32
55
|
|
33
56
|
def service_provider_constant(service_name, provider_name)
|
34
|
-
Fog.const_get(service_name).const_get(*const_get_args(provider_name))
|
35
|
-
rescue NameError # Try to find the constant from in an alternate location
|
36
57
|
Fog.const_get(provider_name).const_get(*const_get_args(service_name))
|
58
|
+
rescue NameError # Try to find the constant from in an alternate location
|
59
|
+
Fog::Logger.deprecation("Unable to load Fog::#{provider_name}::#{service_name}")
|
60
|
+
Fog::Logger.deprecation(
|
61
|
+
format(E_SERVICE_PROVIDER_CONSTANT, service: service_name, provider: provider_name)
|
62
|
+
)
|
63
|
+
Fog.const_get(service_name).const_get(*const_get_args(provider_name))
|
37
64
|
end
|
38
65
|
|
39
66
|
def const_get_args(*args)
|
@@ -43,5 +70,29 @@ module Fog
|
|
43
70
|
def service_name
|
44
71
|
name.split("Fog::").last
|
45
72
|
end
|
73
|
+
|
74
|
+
def check_provider_alias(provider)
|
75
|
+
case provider
|
76
|
+
when :baremetalcloud
|
77
|
+
Fog::Logger.deprecation(':baremetalcloud is deprecated. Use :bare_metal_cloud instead!')
|
78
|
+
:bare_metal_cloud
|
79
|
+
when :gogrid
|
80
|
+
Fog::Logger.deprecation(':gogrid is deprecated. Use :go_grid instead!')
|
81
|
+
:go_grid
|
82
|
+
when :internetarchive
|
83
|
+
Fog::Logger.deprecation(':internetarchive is deprecated. Use :internet_archive instead!')
|
84
|
+
:internet_archive
|
85
|
+
when :new_servers
|
86
|
+
Fog::Logger.deprecation(':new_servers is deprecated. Use :bare_metal_cloud instead!')
|
87
|
+
:bare_metal_cloud
|
88
|
+
when :stormondemand
|
89
|
+
Fog::Logger.deprecation(':stormondemand is deprecated. Use :storm_on_demand instead!')
|
90
|
+
:storm_on_demand
|
91
|
+
when :vclouddirector
|
92
|
+
Fog::Logger.deprecation(':vclouddirector is deprecated. Use :vcloud_director instead!')
|
93
|
+
:vcloud_director
|
94
|
+
else provider
|
95
|
+
end
|
96
|
+
end
|
46
97
|
end
|
47
98
|
end
|
data/lib/fog/core/ssh.rb
CHANGED
@@ -34,31 +34,10 @@ module Fog
|
|
34
34
|
|
35
35
|
class Real
|
36
36
|
def initialize(address, username, options)
|
37
|
-
|
38
|
-
require "net/ssh"
|
39
|
-
rescue LoadError
|
40
|
-
Fog::Logger.warning("'net/ssh' missing, please install and try again.")
|
41
|
-
exit(1)
|
42
|
-
end
|
43
|
-
|
44
|
-
key_manager = Net::SSH::Authentication::KeyManager.new(nil, options)
|
45
|
-
|
46
|
-
unless options[:key_data] || options[:keys] || options[:password] || key_manager.agent
|
47
|
-
raise ArgumentError, ":key_data, :keys, :password or a loaded ssh-agent is required to initialize SSH"
|
48
|
-
end
|
49
|
-
|
50
|
-
options[:timeout] ||= 30
|
51
|
-
if options[:key_data] || options[:keys]
|
52
|
-
options[:keys_only] = true
|
53
|
-
# Explicitly set these so net-ssh doesn"t add the default keys
|
54
|
-
# as seen at https://github.com/net-ssh/net-ssh/blob/master/lib/net/ssh/authentication/session.rb#L131-146
|
55
|
-
options[:keys] = [] unless options[:keys]
|
56
|
-
options[:key_data] = [] unless options[:key_data]
|
57
|
-
end
|
58
|
-
|
37
|
+
assert_net_ssh_loaded
|
59
38
|
@address = address
|
60
39
|
@username = username
|
61
|
-
@options
|
40
|
+
@options = build_options(options)
|
62
41
|
end
|
63
42
|
|
64
43
|
def run(commands, &blk)
|
@@ -106,6 +85,51 @@ module Fog
|
|
106
85
|
end
|
107
86
|
results
|
108
87
|
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def assert_net_ssh_loaded
|
92
|
+
begin
|
93
|
+
require "net/ssh"
|
94
|
+
rescue LoadError
|
95
|
+
Fog::Logger.warning("'net/ssh' missing, please install and try again.")
|
96
|
+
exit(1)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Modifies the given `options` hash AND returns a new hash.
|
101
|
+
# TODO: Probably shouldn't modify the given hash.
|
102
|
+
def build_options(options)
|
103
|
+
validate_options(options)
|
104
|
+
merge_default_options_into(options)
|
105
|
+
end
|
106
|
+
|
107
|
+
def merge_default_options_into(options)
|
108
|
+
options[:timeout] ||= 30
|
109
|
+
if options[:key_data] || options[:keys]
|
110
|
+
options[:keys_only] = true
|
111
|
+
# Explicitly set these so net-ssh doesn"t add the default keys
|
112
|
+
# as seen at https://github.com/net-ssh/net-ssh/blob/master/lib/net/ssh/authentication/session.rb#L131-146
|
113
|
+
options[:keys] = [] unless options[:keys]
|
114
|
+
options[:key_data] = [] unless options[:key_data]
|
115
|
+
end
|
116
|
+
|
117
|
+
# net-ssh has deprecated :paranoid in favor of :verify_host_key
|
118
|
+
# https://github.com/net-ssh/net-ssh/pull/524
|
119
|
+
opts = { :paranoid => false, :verify_host_key => :never }.merge(options)
|
120
|
+
if Net::SSH::VALID_OPTIONS.include? :verify_host_key
|
121
|
+
opts.delete(:paranoid)
|
122
|
+
end
|
123
|
+
opts[:verify_host_key] = false unless Net::SSH::Verifiers.const_defined?(:Never)
|
124
|
+
opts
|
125
|
+
end
|
126
|
+
|
127
|
+
def validate_options(options)
|
128
|
+
key_manager = Net::SSH::Authentication::KeyManager.new(nil, options)
|
129
|
+
unless options[:key_data] || options[:keys] || options[:password] || key_manager.agent
|
130
|
+
raise ArgumentError, ":key_data, :keys, :password or a loaded ssh-agent is required to initialize SSH"
|
131
|
+
end
|
132
|
+
end
|
109
133
|
end
|
110
134
|
|
111
135
|
class Result
|
data/lib/fog/core/version.rb
CHANGED
data/lib/fog/dns.rb
CHANGED
@@ -2,17 +2,6 @@ module Fog
|
|
2
2
|
module DNS
|
3
3
|
extend Fog::ServicesMixin
|
4
4
|
|
5
|
-
def self.new(orig_attributes)
|
6
|
-
attributes = orig_attributes.dup # prevent delete from having side effects
|
7
|
-
case attributes.delete(:provider).to_s.downcase.to_sym
|
8
|
-
when :stormondemand
|
9
|
-
require "fog/dns/storm_on_demand"
|
10
|
-
Fog::DNS::StormOnDemand.new(attributes)
|
11
|
-
else
|
12
|
-
super(orig_attributes)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
5
|
def self.zones
|
17
6
|
zones = []
|
18
7
|
providers.each do |provider|
|
data/lib/fog/monitoring.rb
CHANGED
@@ -1,16 +1,5 @@
|
|
1
1
|
module Fog
|
2
2
|
module Monitoring
|
3
3
|
extend Fog::ServicesMixin
|
4
|
-
|
5
|
-
def self.new(orig_attributes)
|
6
|
-
attributes = orig_attributes.dup
|
7
|
-
provider = attributes.delete(:provider).to_s.downcase.to_sym
|
8
|
-
if provider == :stormondemand
|
9
|
-
require "fog/monitoring/storm_on_demand"
|
10
|
-
Fog::Monitoring::StormOnDemand.new(attributes)
|
11
|
-
else
|
12
|
-
super(orig_attributes)
|
13
|
-
end
|
14
|
-
end
|
15
4
|
end
|
16
5
|
end
|
data/lib/fog/network.rb
CHANGED
@@ -1,17 +1,5 @@
|
|
1
1
|
module Fog
|
2
2
|
module Network
|
3
3
|
extend Fog::ServicesMixin
|
4
|
-
|
5
|
-
def self.new(orig_attributes)
|
6
|
-
attributes = orig_attributes.dup # Prevent delete from having side effects
|
7
|
-
provider = attributes.delete(:provider).to_s.downcase.to_sym
|
8
|
-
|
9
|
-
if provider == :stormondemand
|
10
|
-
require "fog/network/storm_on_demand"
|
11
|
-
return Fog::Network::StormOnDemand.new(attributes)
|
12
|
-
else
|
13
|
-
super(orig_attributes)
|
14
|
-
end
|
15
|
-
end
|
16
4
|
end
|
17
5
|
end
|