fog-core 1.24.0 → 1.25.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +5 -13
  2. data/.rubocop.yml +20 -0
  3. data/changelog.md +17 -0
  4. data/fog-core.gemspec +2 -1
  5. data/lib/fog/account.rb +3 -5
  6. data/lib/fog/billing.rb +3 -4
  7. data/lib/fog/cdn.rb +3 -5
  8. data/lib/fog/compute.rb +17 -20
  9. data/lib/fog/compute/models/server.rb +21 -26
  10. data/lib/fog/core.rb +61 -60
  11. data/lib/fog/core/association.rb +15 -0
  12. data/lib/fog/core/associations/default.rb +21 -3
  13. data/lib/fog/core/associations/many_identities.rb +8 -2
  14. data/lib/fog/core/associations/many_models.rb +7 -2
  15. data/lib/fog/core/associations/one_identity.rb +6 -1
  16. data/lib/fog/core/associations/one_model.rb +5 -1
  17. data/lib/fog/core/attributes.rb +41 -44
  18. data/lib/fog/core/attributes/array.rb +5 -1
  19. data/lib/fog/core/attributes/boolean.rb +5 -1
  20. data/lib/fog/core/attributes/default.rb +12 -2
  21. data/lib/fog/core/attributes/float.rb +5 -1
  22. data/lib/fog/core/attributes/integer.rb +5 -1
  23. data/lib/fog/core/attributes/string.rb +5 -1
  24. data/lib/fog/core/attributes/time.rb +5 -1
  25. data/lib/fog/core/attributes/timestamp.rb +5 -1
  26. data/lib/fog/core/collection.rb +22 -27
  27. data/lib/fog/core/connection.rb +5 -6
  28. data/lib/fog/core/credentials.rb +7 -7
  29. data/lib/fog/core/current_machine.rb +10 -8
  30. data/lib/fog/core/deprecated_connection_accessors.rb +0 -1
  31. data/lib/fog/core/deprecation.rb +0 -2
  32. data/lib/fog/core/errors.rb +3 -5
  33. data/lib/fog/core/hmac.rb +4 -6
  34. data/lib/fog/core/logger.rb +10 -11
  35. data/lib/fog/core/mock.rb +19 -25
  36. data/lib/fog/core/model.rb +9 -20
  37. data/lib/fog/core/provider.rb +6 -9
  38. data/lib/fog/core/scp.rb +14 -24
  39. data/lib/fog/core/service.rb +28 -31
  40. data/lib/fog/core/ssh.rb +16 -24
  41. data/lib/fog/core/stringify_keys.rb +7 -9
  42. data/lib/fog/core/time.rb +5 -7
  43. data/lib/fog/core/utils.rb +24 -20
  44. data/lib/fog/core/uuid.rb +2 -3
  45. data/lib/fog/core/version.rb +3 -1
  46. data/lib/fog/core/wait_for.rb +2 -2
  47. data/lib/fog/core/wait_for_defaults.rb +13 -10
  48. data/lib/fog/core/whitelist_keys.rb +1 -1
  49. data/lib/fog/dns.rb +6 -8
  50. data/lib/fog/identity.rb +5 -6
  51. data/lib/fog/image.rb +3 -5
  52. data/lib/fog/metering.rb +3 -6
  53. data/lib/fog/monitoring.rb +3 -5
  54. data/lib/fog/network.rb +4 -6
  55. data/lib/fog/orchestration.rb +3 -5
  56. data/lib/fog/schema/data_validator.rb +17 -22
  57. data/lib/fog/storage.rb +22 -16
  58. data/lib/fog/support.rb +3 -6
  59. data/lib/fog/test_helpers.rb +10 -10
  60. data/lib/fog/test_helpers/collection_helper.rb +23 -43
  61. data/lib/fog/test_helpers/compute/flavors_helper.rb +4 -10
  62. data/lib/fog/test_helpers/compute/server_helper.rb +3 -9
  63. data/lib/fog/test_helpers/compute/servers_helper.rb +0 -4
  64. data/lib/fog/test_helpers/formats_helper.rb +13 -14
  65. data/lib/fog/test_helpers/helper.rb +9 -4
  66. data/lib/fog/test_helpers/mock_helper.rb +92 -94
  67. data/lib/fog/test_helpers/model_helper.rb +7 -15
  68. data/lib/fog/test_helpers/responds_to_helper.rb +1 -3
  69. data/lib/fog/test_helpers/succeeds_helper.rb +1 -3
  70. data/lib/fog/volume.rb +3 -6
  71. data/lib/fog/vpn.rb +3 -5
  72. data/lib/tasks/test_task.rb +2 -6
  73. data/spec/compute_spec.rb +11 -13
  74. data/spec/connection_spec.rb +24 -14
  75. data/spec/credentials_spec.rb +23 -23
  76. data/spec/current_machine_spec.rb +6 -6
  77. data/spec/fake_app/fake_service.rb +18 -0
  78. data/spec/fake_app/models/collection.rb +5 -0
  79. data/spec/fake_app/models/model.rb +2 -0
  80. data/spec/fake_app/requests/request.rb +11 -0
  81. data/spec/fog_attribute_spec.rb +178 -136
  82. data/spec/identity_spec.rb +11 -13
  83. data/spec/mocking_spec.rb +7 -8
  84. data/spec/service_spec.rb +21 -7
  85. data/spec/spec_helper.rb +14 -8
  86. data/spec/storage_spec.rb +25 -13
  87. data/spec/test_helpers/formats_helper_spec.rb +52 -52
  88. data/spec/test_helpers/schema_validator_spec.rb +45 -45
  89. data/spec/timeout_spec.rb +1 -2
  90. data/spec/utils_spec.rb +2 -2
  91. data/spec/uuid_spec.rb +1 -1
  92. data/spec/wait_for_spec.rb +7 -4
  93. metadata +57 -33
@@ -0,0 +1,15 @@
1
+ module Fog
2
+ class Association < Collection
3
+ def initialize(associations = [])
4
+ @loaded = true
5
+ load(associations)
6
+ end
7
+
8
+ def load(associations)
9
+ return unless associations.kind_of?(Array)
10
+ associations.each do |association|
11
+ self << association
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,15 +1,33 @@
1
1
  module Fog
2
2
  module Associations
3
+ # = Fog Default Association
4
+ #
5
+ # This class has the shared behavior between all association models.
3
6
  class Default
4
- attr_reader :model, :name
7
+ attr_reader :model, :name, :aliases, :as, :association_class
5
8
 
6
- def initialize(model, name, collection_name)
9
+ def initialize(model, name, collection_name, options)
7
10
  @model = model
8
11
  @name = name
9
12
  model.associations[name] = collection_name
13
+ @aliases = options.fetch(:aliases, [])
14
+ @as = options.fetch(:as, name)
15
+ @association_class = options.fetch(:association_class, Fog::Association)
10
16
  create_setter
11
17
  create_getter
18
+ create_aliases
19
+ create_mask
20
+ end
21
+
22
+ def create_aliases
23
+ Array(aliases).each do |alias_name|
24
+ model.aliases[alias_name] = name
25
+ end
26
+ end
27
+
28
+ def create_mask
29
+ model.masks[name] = as
12
30
  end
13
31
  end
14
32
  end
15
- end
33
+ end
@@ -1,5 +1,10 @@
1
1
  module Fog
2
2
  module Associations
3
+ # = Fog Multiple Association
4
+ #
5
+ # This class handles multiple association between the models.
6
+ # It expects the provider to return a collection of ids.
7
+ # The association models will be loaded based on the collection of ids.
3
8
  class ManyIdentities < Default
4
9
  def create_setter
5
10
  model.class_eval <<-EOS, __FILE__, __LINE__
@@ -15,12 +20,13 @@ module Fog
15
20
  model.class_eval <<-EOS, __FILE__, __LINE__
16
21
  def #{name}
17
22
  return [] if associations[:#{name}].nil?
18
- Array(associations[:#{name}]).map do |association|
23
+ data = Array(associations[:#{name}]).map do |association|
19
24
  service.send(self.class.associations[:#{name}]).get(association)
20
25
  end
26
+ #{association_class}.new(data)
21
27
  end
22
28
  EOS
23
29
  end
24
30
  end
25
31
  end
26
- end
32
+ end
@@ -1,5 +1,9 @@
1
1
  module Fog
2
2
  module Associations
3
+ # = Fog Multiple Association
4
+ #
5
+ # This class handles multiple association between the models.
6
+ # It expects the provider to map the attribute with a collection of objects.
3
7
  class ManyModels < Default
4
8
  def create_setter
5
9
  model.class_eval <<-EOS, __FILE__, __LINE__
@@ -12,10 +16,11 @@ module Fog
12
16
  def create_getter
13
17
  model.class_eval <<-EOS, __FILE__, __LINE__
14
18
  def #{name}
15
- Array(associations[:#{name}])
19
+ data = associations[:#{name}]
20
+ #{association_class}.new(data)
16
21
  end
17
22
  EOS
18
23
  end
19
24
  end
20
25
  end
21
- end
26
+ end
@@ -1,5 +1,10 @@
1
1
  module Fog
2
2
  module Associations
3
+ # = Fog Single Association
4
+ #
5
+ # This class handles single association between the models.
6
+ # It expects the provider to return only the id of the association.
7
+ # The association model will be loaded based on the id initialized.
3
8
  class OneIdentity < Default
4
9
  def create_setter
5
10
  model.class_eval <<-EOS, __FILE__, __LINE__
@@ -19,4 +24,4 @@ module Fog
19
24
  end
20
25
  end
21
26
  end
22
- end
27
+ end
@@ -1,5 +1,9 @@
1
1
  module Fog
2
2
  module Associations
3
+ # = Fog Single Association
4
+ #
5
+ # This class handles single association between the models.
6
+ # It expects the provider to map the attribute with an initialized object.
3
7
  class OneModel < Default
4
8
  def create_setter
5
9
  model.class_eval <<-EOS, __FILE__, __LINE__
@@ -18,4 +22,4 @@ module Fog
18
22
  end
19
23
  end
20
24
  end
21
- end
25
+ end
@@ -1,7 +1,6 @@
1
1
  module Fog
2
2
  module Attributes
3
3
  module ClassMethods
4
-
5
4
  def _load(marshalled)
6
5
  new(Marshal.load(marshalled))
7
6
  end
@@ -22,45 +21,47 @@ module Fog
22
21
  @default_values ||= {}
23
22
  end
24
23
 
24
+ def masks
25
+ @masks ||= {}
26
+ end
27
+
25
28
  def attribute(name, options = {})
26
- type = options.fetch(:type, 'default').to_s.capitalize
27
- Fog::Attributes::const_get(type).new(self, name, options)
29
+ type = options.fetch(:type, "default").to_s.capitalize
30
+ Fog::Attributes.const_get(type).new(self, name, options)
28
31
  end
29
32
 
30
- def has_one(name, collection_name)
31
- Fog::Associations::OneModel.new(self, name, collection_name)
33
+ def has_one(name, collection_name, options = {})
34
+ Fog::Associations::OneModel.new(self, name, collection_name, options)
32
35
  end
33
36
 
34
- def has_many(name, collection_name)
35
- Fog::Associations::ManyModels.new(self, name, collection_name)
37
+ def has_many(name, collection_name, options = {})
38
+ Fog::Associations::ManyModels.new(self, name, collection_name, options)
36
39
  end
37
40
 
38
- def has_one_identity(name, collection_name)
39
- Fog::Associations::OneIdentity.new(self, name, collection_name)
41
+ def has_one_identity(name, collection_name, options = {})
42
+ Fog::Associations::OneIdentity.new(self, name, collection_name, options)
40
43
  end
41
44
 
42
- def has_many_identities(name, collection_name)
43
- Fog::Associations::ManyIdentities.new(self, name, collection_name)
45
+ def has_many_identities(name, collection_name, options = {})
46
+ Fog::Associations::ManyIdentities.new(self, name, collection_name, options)
44
47
  end
45
48
 
46
49
  def identity(name, options = {})
47
50
  @identity = name
48
- self.attribute(name, options)
51
+ attribute(name, options)
49
52
  end
50
53
 
51
54
  def ignore_attributes(*args)
52
- @ignored_attributes = args.collect {|attr| attr.to_s }
55
+ @ignored_attributes = args.map(&:to_s)
53
56
  end
54
57
 
55
58
  def ignored_attributes
56
59
  @ignored_attributes ||= []
57
60
  end
58
-
59
61
  end
60
62
 
61
63
  module InstanceMethods
62
-
63
- def _dump(level)
64
+ def _dump(_level)
64
65
  Marshal.dump(attributes)
65
66
  end
66
67
 
@@ -72,16 +73,20 @@ module Fog
72
73
  @associations ||= {}
73
74
  end
74
75
 
76
+ def masks
77
+ self.class.masks
78
+ end
79
+
75
80
  def all_attributes
76
- self.class.attributes.inject({}) do |hash, attribute|
77
- hash[attribute] = send(attribute)
81
+ self.class.attributes.reduce({}) do |hash, attribute|
82
+ hash[masks[attribute]] = send(attribute)
78
83
  hash
79
84
  end
80
85
  end
81
86
 
82
87
  def all_associations
83
- self.class.associations.keys.inject({}) do |hash, association|
84
- hash[association] = associations[association] || send(association)
88
+ self.class.associations.keys.reduce({}) do |hash, association|
89
+ hash[masks[association]] = associations[association] || send(association)
85
90
  hash
86
91
  end
87
92
  end
@@ -97,23 +102,22 @@ module Fog
97
102
  end
98
103
 
99
104
  def identity
100
- send(self.class.instance_variable_get('@identity'))
105
+ send(self.class.instance_variable_get("@identity"))
101
106
  end
102
107
 
103
108
  def identity=(new_identity)
104
- send("#{self.class.instance_variable_get('@identity')}=", new_identity)
109
+ send("#{self.class.instance_variable_get("@identity")}=", new_identity)
105
110
  end
106
111
 
107
112
  def merge_attributes(new_attributes = {})
108
- for key, value in new_attributes
109
- unless self.class.ignored_attributes.include?(key)
110
- if aliased_key = self.class.aliases[key]
111
- send("#{aliased_key}=", value)
112
- elsif self.respond_to?("#{key}=",true)
113
- send("#{key}=", value)
114
- else
115
- attributes[key] = value
116
- end
113
+ new_attributes.each_pair do |key, value|
114
+ next if self.class.ignored_attributes.include?(key)
115
+ if self.class.aliases[key]
116
+ send("#{self.class.aliases[key]}=", value)
117
+ elsif self.respond_to?("#{key}=", true)
118
+ send("#{key}=", value)
119
+ else
120
+ attributes[key] = value
117
121
  end
118
122
  end
119
123
  self
@@ -151,20 +155,16 @@ module Fog
151
155
  end
152
156
 
153
157
  def requires_one(*args)
154
- missing = missing_attributes(args)
155
- if missing.length == args.length
156
- raise(ArgumentError, "#{missing[0...-1].join(", ")} or #{missing[-1]} are required for this operation")
157
- end
158
+ return unless missing_attributes(args).length == args.length
159
+ raise(ArgumentError, "#{missing[0...-1].join(", ")} or #{missing[-1]} are required for this operation")
158
160
  end
159
161
 
160
162
  protected
161
163
 
162
164
  def missing_attributes(args)
163
165
  missing = []
164
- for arg in [:service] | args
165
- unless send("#{arg}") || attributes.has_key?(arg)
166
- missing << arg
167
- end
166
+ ([:service] | args).each do |arg|
167
+ missing << arg unless send("#{arg}") || attributes.key?(arg)
168
168
  end
169
169
  missing
170
170
  end
@@ -176,13 +176,10 @@ module Fog
176
176
  private
177
177
 
178
178
  def remap_attributes(attributes, mapping)
179
- for key, value in mapping
180
- if attributes.key?(key)
181
- attributes[value] = attributes.delete(key)
182
- end
179
+ mapping.each_pair do |key, value|
180
+ attributes[value] = attributes.delete(key) if attributes.key?(key)
183
181
  end
184
182
  end
185
-
186
183
  end
187
184
  end
188
185
  end
@@ -1,5 +1,9 @@
1
1
  module Fog
2
2
  module Attributes
3
+ # = Fog Array Attribute
4
+ #
5
+ # This class handles Array attributes from the providers,
6
+ # converting values to Array objects
3
7
  class Array < Default
4
8
  def create_setter
5
9
  model.class_eval <<-EOS, __FILE__, __LINE__
@@ -18,4 +22,4 @@ module Fog
18
22
  end
19
23
  end
20
24
  end
21
- end
25
+ end
@@ -1,5 +1,9 @@
1
1
  module Fog
2
2
  module Attributes
3
+ # = Fog Boolean Attribute
4
+ #
5
+ # This class handles Boolean attributes from the providers,
6
+ # converting values to Boolean objects
3
7
  class Boolean < Default
4
8
  def create_setter
5
9
  model.class_eval <<-EOS, __FILE__, __LINE__
@@ -15,4 +19,4 @@ module Fog
15
19
  end
16
20
  end
17
21
  end
18
- end
22
+ end
@@ -1,7 +1,11 @@
1
1
  module Fog
2
2
  module Attributes
3
+ # = Fog Default Attribute
4
+ #
5
+ # This class handles the attributes without a type force.
6
+ # The attributes returned from the provider will keep its original values.
3
7
  class Default
4
- attr_reader :model, :name, :squash, :aliases, :default
8
+ attr_reader :model, :name, :squash, :aliases, :default, :as
5
9
 
6
10
  def initialize(model, name, options)
7
11
  @model = model
@@ -10,10 +14,12 @@ module Fog
10
14
  @squash = options.fetch(:squash, false)
11
15
  @aliases = options.fetch(:aliases, [])
12
16
  @default = options[:default]
17
+ @as = options.fetch(:as, name)
13
18
  create_setter
14
19
  create_getter
15
20
  create_aliases
16
21
  set_defaults
22
+ create_mask
17
23
  end
18
24
 
19
25
  def create_setter
@@ -63,6 +69,10 @@ module Fog
63
69
  def set_defaults
64
70
  model.default_values[name] = default unless default.nil?
65
71
  end
72
+
73
+ def create_mask
74
+ model.masks[name] = as
75
+ end
66
76
  end
67
77
  end
68
- end
78
+ end
@@ -1,5 +1,9 @@
1
1
  module Fog
2
2
  module Attributes
3
+ # = Fog Float Attribute
4
+ #
5
+ # This class handles Float attributes from the providers,
6
+ # converting values to Float objects
3
7
  class Float < Default
4
8
  def create_setter
5
9
  model.class_eval <<-EOS, __FILE__, __LINE__
@@ -10,4 +14,4 @@ module Fog
10
14
  end
11
15
  end
12
16
  end
13
- end
17
+ end
@@ -1,5 +1,9 @@
1
1
  module Fog
2
2
  module Attributes
3
+ # = Fog Integer Attribute
4
+ #
5
+ # This class handles Integer attributes from the providers,
6
+ # converting values to Integer objects
3
7
  class Integer < Default
4
8
  def create_setter
5
9
  model.class_eval <<-EOS, __FILE__, __LINE__
@@ -10,4 +14,4 @@ module Fog
10
14
  end
11
15
  end
12
16
  end
13
- end
17
+ end
@@ -1,5 +1,9 @@
1
1
  module Fog
2
2
  module Attributes
3
+ # = Fog String Attribute
4
+ #
5
+ # This class handles String attributes from the providers,
6
+ # converting values to String objects
3
7
  class String < Default
4
8
  def create_setter
5
9
  model.class_eval <<-EOS, __FILE__, __LINE__
@@ -10,4 +14,4 @@ module Fog
10
14
  end
11
15
  end
12
16
  end
13
- end
17
+ end
@@ -1,5 +1,9 @@
1
1
  module Fog
2
2
  module Attributes
3
+ # = Fog Time Attribute
4
+ #
5
+ # This class handles Time attributes from the providers,
6
+ # converting values to Time objects
3
7
  class Time < Default
4
8
  def create_setter
5
9
  model.class_eval <<-EOS, __FILE__, __LINE__
@@ -16,4 +20,4 @@ module Fog
16
20
  end
17
21
  end
18
22
  end
19
- end
23
+ end
@@ -1,5 +1,9 @@
1
1
  module Fog
2
2
  module Attributes
3
+ # = Fog Timestamp Attribute
4
+ #
5
+ # This class handles Timestamp attributes from the providers,
6
+ # converting Integer and String values as a real Timestamp objects
3
7
  class Timestamp < Default
4
8
  def create_setter
5
9
  model.class_eval <<-EOS, __FILE__, __LINE__
@@ -14,4 +18,4 @@ module Fog
14
18
  end
15
19
  end
16
20
  end
17
- end
21
+ end