fog-openstack 0.1.22 → 0.1.23

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4390c3d7b0437021392d05e1ca9caeed69dbe040
4
- data.tar.gz: 67acad217dadd323bb3325f3c7bff3b69738e1e5
3
+ metadata.gz: 57deefcd73bd729138eb23ed6b27a7d5edebd986
4
+ data.tar.gz: 3f0e6066357fcac8d96ef1acace0ecc03336de19
5
5
  SHA512:
6
- metadata.gz: 5590632eb25483cdd94d9e18f1f0a5f611dd9136f12ef506a0226a0a1ed51e76eb844e8673069cc8614e11cb46749827826261fb125209c9de5fd142a5efd91c
7
- data.tar.gz: a7d3cfed1e7470a50d61a69a636ef7c198532b5dab31d701248ad80210bfd46f8f5acc90cd828618d5f02492b26ae23fb5ac47071a2c1721ad78760f43ca9c0f
6
+ metadata.gz: be0002aaf6e52c2578b3ec290e5cbe1dd7ef3fb30e1c5d58827e0de2c8fef58a99b812cf6e64c131f36a09c7b3d025d00731a277da19fa96f0e1f7080c67f8a5
7
+ data.tar.gz: 76d3fffed28f2442446a69c41a71eeba4eb1684183417fb605ee16a524425cc7a93dc4fc8c57d9da76901107b97514eaf9d1cba2eec2c80228fc948780a3c6a3
@@ -1,5 +1,7 @@
1
1
  language: ruby
2
2
  sudo: false
3
+ before_install:
4
+ - gem update bundler
3
5
  script:
4
6
  - bundle exec rake test
5
7
  - bundle exec rake spec
@@ -8,20 +10,14 @@ env:
8
10
  matrix:
9
11
  fast_finish: true
10
12
  include:
11
- - rvm: 1.9.3
12
- gemfile: gemfiles/Gemfile-1.9
13
- - rvm: 2.0.0
14
- gemfile: Gemfile
15
- - rvm: 2.1.0
16
- gemfile: Gemfile
17
- - rvm: 2.1.1
18
- gemfile: Gemfile
19
13
  - rvm: 2.2.0
20
14
  gemfile: Gemfile
21
15
  - rvm: 2.3.0
22
16
  gemfile: Gemfile
23
- - rvm: jruby-19mode
24
- gemfile: gemfiles/Gemfile-1.9
17
+ - rvm: 2.3.1
18
+ gemfile: Gemfile
19
+ - rvm: 2.4.2
20
+ gemfile: Gemfile
25
21
  - rvm: jruby-head
26
22
  gemfile: Gemfile
27
23
  allow_failures:
@@ -19,18 +19,18 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency 'fog-core', '>= 1.40'
22
+ spec.required_ruby_version = '>= 2.1.0'
23
+
24
+ spec.add_dependency 'fog-core', '~> 1.40'
23
25
  spec.add_dependency 'fog-json', '>= 1.0'
24
26
  spec.add_dependency 'ipaddress', '>= 0.8'
25
27
 
26
28
  spec.add_development_dependency 'bundler', '~> 1.6'
27
- # TODO: remove when https://github.com/fog/fog-openstack/issues/202 is fixed
28
- # spec.add_development_dependency 'coveralls'
29
+ spec.add_development_dependency 'coveralls'
29
30
  spec.add_development_dependency "mime-types"
30
31
  spec.add_development_dependency "mime-types-data"
31
32
  spec.add_development_dependency 'rake', '~> 10.0'
32
33
  spec.add_development_dependency 'rubocop'
33
- spec.add_development_dependency 'rubyzip', '~> 0.9.9'
34
34
  spec.add_development_dependency 'shindo', '~> 0.3'
35
35
  spec.add_development_dependency 'minitest'
36
36
  spec.add_development_dependency 'vcr'
@@ -1,8 +1,9 @@
1
-
2
-
3
1
  module Fog
4
2
  module Compute
5
3
  class OpenStack < Fog::Service
4
+ SUPPORTED_VERSIONS = /v2\.0|v2\.1/
5
+ SUPPORTED_MICROVERSION = '2.15'.freeze
6
+
6
7
  requires :openstack_auth_url
7
8
  recognizes :openstack_auth_token, :openstack_management_url,
8
9
  :persistent, :openstack_service_type, :openstack_service_name,
@@ -380,6 +381,10 @@ module Fog
380
381
  end
381
382
 
382
383
  def initialize(options = {})
384
+ @supported_versions = SUPPORTED_VERSIONS
385
+ @supported_microversion = SUPPORTED_MICROVERSION
386
+ @microversion_key = 'X-OpenStack-Nova-API-Version'
387
+
383
388
  initialize_identity options
384
389
 
385
390
  @openstack_identity_service_type = options[:openstack_identity_service_type] || 'identity'
@@ -391,9 +396,9 @@ module Fog
391
396
 
392
397
  authenticate
393
398
 
394
- unless @path =~ /1\.1|v2/
399
+ unless @path =~ %r{/(v2|v2\.0|v2\.1)/}
395
400
  raise Fog::OpenStack::Errors::ServiceUnavailable,
396
- "OpenStack compute binding only supports version 2 (a.k.a. 1.1)"
401
+ "OpenStack compute binding only supports version v2 and v2.1"
397
402
  end
398
403
 
399
404
  @persistent = options[:persistent] || false
@@ -9,7 +9,7 @@ module Fog
9
9
  attribute :policies, :type => :array
10
10
  attribute :members
11
11
 
12
- VALID_SERVER_GROUP_POLICIES = ['affinity', 'anti-affinity'].freeze
12
+ VALID_SERVER_GROUP_POLICIES = ['affinity', 'anti-affinity', 'soft-affinity', 'soft-anti-affinity'].freeze
13
13
 
14
14
  def self.validate_server_group_policy(policy)
15
15
  raise ArgumentError, "#{policy} is an invalid policy... must use one of #{VALID_SERVER_GROUP_POLICIES.join(', ')}" \
@@ -81,6 +81,7 @@ module Fog
81
81
 
82
82
  module Orchestration
83
83
  autoload :OpenStack, File.expand_path('../orchestration/openstack', __FILE__)
84
+ autoload :Util, File.expand_path('../orchestration/util/recursive_hot_file_loader', __FILE__)
84
85
  end
85
86
 
86
87
  module SharedFileSystem
@@ -1,11 +1,5 @@
1
1
  module Fog
2
2
  module Openstack
3
- VERSION = "0.1.22"
4
-
5
- def self.included(base)
6
- if RUBY_VERSION < "2"
7
- puts "DEPRECATION WARNING - Support for Ruby 1.9 will be dropped in fog-openstack 0.2 and higher. Please upgrade to Ruby 2 or above."
8
- end
9
- end
3
+ VERSION = "0.1.23"
10
4
  end
11
5
  end
@@ -8,7 +8,7 @@ module Fog
8
8
 
9
9
  %w(capabilities description disable_rollback links notification_topics outputs parameters
10
10
  stack_name stack_status stack_status_reason template_description timeout_mins parent
11
- creation_time updated_time stack_user_project_id stack_owner).each do |a|
11
+ creation_time updated_time stack_user_project_id stack_owner files).each do |a|
12
12
  attribute a.to_sym
13
13
  end
14
14
 
@@ -118,6 +118,7 @@ module Fog
118
118
  }
119
119
  options[:template] = template_content if template_content
120
120
  options[:template_url] = @template_url if @template_url
121
+ options[:files] = @files if @files
121
122
  options
122
123
  end
123
124
  private :default_options
@@ -10,6 +10,7 @@ module Fog
10
10
  # * :template [String] Structure containing the template body.
11
11
  # or (one of the two Template parameters is required)
12
12
  # * :template_url [String] URL of file containing the template body.
13
+ # * :files [Hash] Hash with files resources.
13
14
  # * :disable_rollback [Boolean] Controls rollback on stack creation failure, defaults to false.
14
15
  # * :parameters [Hash] Hash of providers to supply to template
15
16
  # * :timeout_mins [Integer] Minutes to wait before status is set to CREATE_FAILED
@@ -28,6 +29,18 @@ module Fog
28
29
  }.merge(arg2.nil? ? {} : arg2)
29
30
  end
30
31
 
32
+ # Templates should always:
33
+ # - be strings
34
+ # - contain URI references instead of relative paths.
35
+ # Passing :template_url may not work well with `get_file` and remote `type`:
36
+ # the python client implementation in shade retrieves from :template_uri
37
+ # and replaces it with :template.
38
+ # see https://github.com/openstack-infra/shade/blob/master/shade/openstackcloud.py#L1201
39
+ # see https://developer.openstack.org/api-ref/orchestration/v1/index.html#create-stack
40
+ file_resolver = Util::RecursiveHotFileLoader.new(options[:template] || options[:template_url], options[:files])
41
+ options[:template] = file_resolver.template
42
+ options[:files] = file_resolver.files unless file_resolver.files.empty?
43
+
31
44
  request(
32
45
  :expects => 201,
33
46
  :path => 'stacks',
@@ -68,6 +81,16 @@ module Fog
68
81
  'id' => stack_id,
69
82
  'links' => [{"href" => "http://localhost:8004/v1/fake_tenant_id/stacks/#{options[:stack_name]}/#{stack_id}", "rel" => "self"}]
70
83
  }
84
+
85
+ if options.key?(:files)
86
+ response.body['files'] = {'foo.sh' => 'hello'}
87
+ end
88
+
89
+ if options.key?(:template) || options.key?(:template_url)
90
+ file_resolver = Util::RecursiveHotFileLoader.new(options[:template] || options[:template_url], options[:files])
91
+ response.body['files'] = file_resolver.files unless file_resolver.files.empty?
92
+ end
93
+
71
94
  response
72
95
  end
73
96
  end
@@ -10,6 +10,7 @@ module Fog
10
10
  # or (one of the two Template parameters is required)
11
11
  # * :template_url [String] URL of file containing the template body.
12
12
  # * :parameters [Hash] Hash of providers to supply to template.
13
+ # * :files [Hash] Hash with files resources.
13
14
  #
14
15
  def update_stack(arg1, arg2 = nil, arg3 = nil)
15
16
  if arg1.kind_of?(Stack)
@@ -17,22 +18,34 @@ module Fog
17
18
  stack = arg1
18
19
  stack_name = stack.stack_name
19
20
  stack_id = stack.id
20
- params = arg2.nil? ? {} : arg2
21
+ options = arg2.nil? ? {} : arg2
21
22
  else
22
23
  # Deprecated, update_stack(stack_id, stack_name, options = {})
23
24
  Fog::Logger.deprecation("#update_stack(stack_id, stack_name, options) is deprecated, use #update_stack(stack, options) instead [light_black](#{caller.first})[/]")
24
25
  stack_id = arg1
25
26
  stack_name = arg2
26
- params = {
27
+ options = {
27
28
  :stack_name => stack_name
28
29
  }.merge(arg3.nil? ? {} : arg3)
29
30
  end
30
31
 
32
+ # Templates should always:
33
+ # - be strings
34
+ # - contain URI references instead of relative paths.
35
+ # Passing :template_url may not work well with `get_file` and remote `type`:
36
+ # the python client implementation in shade retrieves from :template_uri
37
+ # and replaces it with :template.
38
+ # see https://github.com/openstack-infra/shade/blob/master/shade/openstackcloud.py#L1201
39
+ # see https://developer.openstack.org/api-ref/orchestration/v1/index.html#create-stack
40
+ file_resolver = Util::RecursiveHotFileLoader.new(options[:template] || options[:template_url], options[:files])
41
+ options[:template] = file_resolver.template
42
+ options[:files] = file_resolver.files unless file_resolver.files.empty?
43
+
31
44
  request(
32
45
  :expects => 202,
33
46
  :path => "stacks/#{stack_name}/#{stack_id}",
34
47
  :method => 'PUT',
35
- :body => Fog::JSON.encode(params)
48
+ :body => Fog::JSON.encode(options)
36
49
  )
37
50
  end
38
51
  end
@@ -44,17 +57,26 @@ module Fog
44
57
  stack = arg1
45
58
  stack_name = stack.stack_name
46
59
  stack_id = stack.id
47
- params = arg2.nil? ? {} : arg2
60
+ options = arg2.nil? ? {} : arg2
48
61
  else
49
62
  # Deprecated, update_stack(stack_id, stack_name, options = {})
50
63
  Fog::Logger.deprecation("#update_stack(stack_id, stack_name, options) is deprecated, use #update_stack(stack, options) instead [light_black](#{caller.first})[/]")
51
64
  stack_id = arg1
52
65
  stack_name = arg2
53
- params = {
66
+ options = {
54
67
  :stack_name => stack_name
55
68
  }.merge(arg3.nil? ? {} : arg3)
56
69
  end
57
70
 
71
+ if options.key?(:files)
72
+ response.body['files'] = {'foo.sh' => 'hello'}
73
+ end
74
+
75
+ if options.key?(:template) || options.key?(:template_url)
76
+ file_resolver = Util::RecursiveHotFileLoader.new(options[:template] || options[:template_url], options[:files])
77
+ response.body['files'] = file_resolver.files unless file_resolver.files.empty?
78
+ end
79
+
58
80
  response = Excon::Response.new
59
81
  response.status = 202
60
82
  response.body = {}
@@ -0,0 +1,220 @@
1
+ require 'set'
2
+ require 'yaml'
3
+ require 'open-uri'
4
+ require 'objspace'
5
+ require 'fog/core'
6
+
7
+ module Fog
8
+ module Orchestration
9
+ module Util
10
+ #
11
+ # Resolve get_file resources found in a HOT template populating
12
+ # a files Hash conforming to Heat Specs
13
+ # https://developer.openstack.org/api-ref/orchestration/v1/index.html?expanded=create-stack-detail#stacks
14
+ #
15
+ # Files present in :files are not processed further. The others
16
+ # are added to the Hash. This behavior is the same implemented in openstack-infra/shade
17
+ # see https://github.com/openstack-infra/shade/blob/1d16f64fbf376a956cafed1b3edd8e51ccc16f2c/shade/openstackcloud.py#L1200
18
+ #
19
+ # This implementation just process nested templates but not resource
20
+ # registries.
21
+ class RecursiveHotFileLoader
22
+ attr_reader :files
23
+ attr_reader :template
24
+
25
+ def initialize(template, files = nil)
26
+ # According to https://github.com/fog/fog-openstack/blame/master/docs/orchestration.md#L122
27
+ # templates can be either String or Hash.
28
+ # If it's an Hash, we deep_copy it so the passed argument
29
+ # is not modified by get_file_contents.
30
+ template = deep_copy(template)
31
+ @visited = Set.new
32
+ @files = files || {}
33
+ @template = get_template_contents(template)
34
+ end
35
+
36
+ # Return string
37
+ def url_join(prefix, suffix)
38
+ if prefix
39
+ # URI.join replaces prefix parts before a
40
+ # trailing slash. See https://docs.ruby-lang.org/en/2.3.0/URI.html.
41
+ prefix += '/' unless prefix.to_s.end_with?("/")
42
+ suffix = URI.join(prefix, suffix)
43
+ # Force URI to use traditional file scheme representation.
44
+ suffix.host = "" if suffix.scheme == "file"
45
+ end
46
+ suffix.to_s
47
+ end
48
+
49
+ # Retrieve a template content.
50
+ #
51
+ # @param template_file can be either:
52
+ # - a raw_template string
53
+ # - an URI string
54
+ # - an Hash containing the parsed template.
55
+ #
56
+ # XXX: we could use named parameters
57
+ # and better mimic heatclient implementation.
58
+ def get_template_contents(template_file)
59
+ Fog::Logger.debug("get_template_contents [#{template_file}]")
60
+
61
+ raise "template_file should be Hash or String, not #{template_file.class.name}" unless
62
+ template_file.kind_of?(String) || template_file.kind_of?(Hash)
63
+
64
+ local_base_url = url_join("file:/", File.absolute_path(Dir.pwd))
65
+
66
+ if template_file.kind_of?(Hash)
67
+ template_base_url = local_base_url
68
+ template = template_file
69
+ elsif template_is_raw?(template_file)
70
+ template_base_url = local_base_url
71
+ template = YAML.safe_load(template_file, [Date])
72
+ elsif template_is_url?(template_file)
73
+ template_file = normalise_file_path_to_url(template_file)
74
+ template_base_url = base_url_for_url(template_file)
75
+ raw_template = read_uri(template_file)
76
+ template = YAML.safe_load(raw_template, [Date])
77
+
78
+ Fog::Logger.debug("Template visited: #{@visited}")
79
+ @visited.add(template_file)
80
+ else
81
+ raise "template_file is not a string of the expected form"
82
+ end
83
+
84
+ get_file_contents(template, template_base_url)
85
+
86
+ template
87
+ end
88
+
89
+ # Traverse the template tree looking for get_file and type
90
+ # and populating the @files attribute with their content.
91
+ # Resource referenced by get_file and type are eventually
92
+ # replaced with their absolute URI as done in heatclient
93
+ # and shade.
94
+ #
95
+ def get_file_contents(from_data, base_url)
96
+ Fog::Logger.debug("Processing #{from_data} with base_url #{base_url}")
97
+
98
+ # Recursively traverse the tree
99
+ # if recurse_data is Array or Hash
100
+ recurse_data = from_data.kind_of?(Hash) ? from_data.values : from_data
101
+ recurse_data.each { |value| get_file_contents(value, base_url) } if recurse_data.kind_of?(Array)
102
+
103
+ # I'm on a Hash, process it.
104
+ return unless from_data.kind_of?(Hash)
105
+ from_data.each do |key, value|
106
+ next if ignore_if(key, value)
107
+
108
+ # Resolve relative paths.
109
+ str_url = url_join(base_url, value)
110
+
111
+ next if @files.key?(str_url)
112
+
113
+ file_content = read_uri(str_url)
114
+
115
+ # get_file should not recurse hot templates.
116
+ if key == "type" && template_is_raw?(file_content) && !@visited.include?(str_url)
117
+ template = get_template_contents(str_url)
118
+ file_content = YAML.dump(template)
119
+ end
120
+
121
+ @files[str_url] = file_content
122
+ # replace the data value with the normalised absolute URL as required
123
+ # by https://docs.openstack.org/heat/pike/template_guide/hot_spec.html#get-file
124
+ from_data[key] = str_url
125
+ end
126
+ end
127
+
128
+ private
129
+
130
+ # Retrive the content of a local or remote file.
131
+ #
132
+ # @param A local or remote uri.
133
+ #
134
+ # @raise ArgumentError if it's not a valid uri
135
+ #
136
+ # Protect open-uri from malign arguments like
137
+ # - "|ls"
138
+ # - multiline strings
139
+ def read_uri(uri_or_filename)
140
+ remote_schemes = %w[http https ftp]
141
+ Fog::Logger.debug("Opening #{uri_or_filename}")
142
+
143
+ begin
144
+ # Validate URI to protect from open-uri attacks.
145
+ url = URI(uri_or_filename)
146
+
147
+ if remote_schemes.include?(url.scheme)
148
+ # Remote schemes must contain an host.
149
+ raise ArgumentError if url.host.nil?
150
+
151
+ # Encode URI with spaces.
152
+ uri_or_filename = uri_or_filename.gsub(/ /, "%20")
153
+ end
154
+ rescue URI::InvalidURIError
155
+ raise ArgumentError, "Not a valid URI: #{uri_or_filename}"
156
+ end
157
+
158
+ # TODO: A future revision may implement a retry.
159
+ content = ''
160
+ # open-uri doesn't open "file:///" uris.
161
+ uri_or_filename = uri_or_filename.sub(/^file:/, "")
162
+
163
+ open(uri_or_filename) { |f| content = f.read }
164
+ content
165
+ end
166
+
167
+ # Return true if the file is an heat template, false otherwise.
168
+ def template_is_raw?(content)
169
+ htv = content.strip.index("heat_template_version")
170
+ # Tolerate some leading character in case of a json template.
171
+ htv && htv < 5
172
+ end
173
+
174
+ # Return true if it's an URI, false otherwise.
175
+ def template_is_url?(path)
176
+ normalise_file_path_to_url(path)
177
+ true
178
+ rescue ArgumentError, URI::InvalidURIError
179
+ false
180
+ end
181
+
182
+ # Return true if I should I process this this file.
183
+ #
184
+ # @param [String] An heat template key
185
+ #
186
+ def ignore_if(key, value)
187
+ return true if key != 'get_file' && key != 'type'
188
+
189
+ return true unless value.kind_of?(String)
190
+
191
+ return true if key == 'type' &&
192
+ !value.end_with?('.yaml', '.template')
193
+
194
+ false
195
+ end
196
+
197
+ # Returns the string baseurl of the given url.
198
+ def base_url_for_url(url)
199
+ parsed = URI(url)
200
+ parsed_dir = File.dirname(parsed.path)
201
+ url_join(parsed, parsed_dir)
202
+ end
203
+
204
+ def normalise_file_path_to_url(path)
205
+ # Nothing to do on URIs
206
+ return path if URI(path).scheme
207
+
208
+ path = File.absolute_path(path)
209
+ url_join('file:/', path)
210
+ end
211
+
212
+ def deep_copy(item)
213
+ return item if item.kind_of?(String)
214
+
215
+ YAML.safe_load(YAML.dump(item), [Date])
216
+ end
217
+ end
218
+ end
219
+ end
220
+ end
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fog-openstack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.22
4
+ version: 0.1.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Darby
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-10-12 00:00:00.000000000 Z
11
+ date: 2018-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fog-core
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.40'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.40'
27
27
  - !ruby/object:Gem::Dependency
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: coveralls
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: mime-types
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -122,20 +136,6 @@ dependencies:
122
136
  - - ">="
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: rubyzip
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: 0.9.9
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: 0.9.9
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: shindo
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -245,7 +245,6 @@ files:
245
245
  - examples/volume/backups.rb
246
246
  - examples/workflow/workflow-examples.rb
247
247
  - fog-openstack.gemspec
248
- - gemfiles/Gemfile-1.9
249
248
  - lib/fog/baremetal/openstack.rb
250
249
  - lib/fog/baremetal/openstack/models/chassis.rb
251
250
  - lib/fog/baremetal/openstack/models/chassis_collection.rb
@@ -1043,6 +1042,7 @@ files:
1043
1042
  - lib/fog/orchestration/openstack/requests/show_stack_details.rb
1044
1043
  - lib/fog/orchestration/openstack/requests/update_stack.rb
1045
1044
  - lib/fog/orchestration/openstack/requests/validate_template.rb
1045
+ - lib/fog/orchestration/util/recursive_hot_file_loader.rb
1046
1046
  - lib/fog/planning/openstack.rb
1047
1047
  - lib/fog/planning/openstack/models/plan.rb
1048
1048
  - lib/fog/planning/openstack/models/plans.rb
@@ -1352,7 +1352,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
1352
1352
  requirements:
1353
1353
  - - ">="
1354
1354
  - !ruby/object:Gem::Version
1355
- version: '0'
1355
+ version: 2.1.0
1356
1356
  required_rubygems_version: !ruby/object:Gem::Requirement
1357
1357
  requirements:
1358
1358
  - - ">="
@@ -1,22 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- group :development, :test do
4
- gem "fog-core", ">= 1.35"
5
- gem "fog-json", ">= 1.0"
6
- gem "fog-xml", ">= 0.1"
7
- gem "ipaddress", ">= 0.8"
8
- gem "bundler", "~> 1.6"
9
- gem "mime-types", "2.6.2"
10
- gem "nokogiri", "< 1.7.0"
11
- gem "rake", "~> 10.0"
12
- gem "rubocop", "< 0.42"
13
- gem "rubyzip", "~> 0.9.9"
14
- gem "shindo", "~> 0.3"
15
- gem "minitest"
16
- gem "vcr"
17
- gem "webmock", "~> 1.24.6"
18
- gem "json", "< 2.0"
19
- # TODO: remove when https://github.com/fog/fog-openstack/issues/202 is fixed
20
- # gem "coveralls", "< 0.8.15"
21
- gem "public_suffix", "~> 1.4.6"
22
- end