fog-openstack 0.1.22 → 0.1.23

Sign up to get free protection for your applications and to get access to all the features.
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