lib/ohai/mixin/ec2_metadata.rb in ohai-7.2.0.alpha.0 vs lib/ohai/mixin/ec2_metadata.rb in ohai-7.2.0.rc.0

- old
+ new

@@ -96,73 +96,97 @@ def http_client Net::HTTP.start(EC2_METADATA_ADDR).tap {|h| h.read_timeout = 600} end + # Get metadata for a given path and API version + # + # @details + # Typically, a 200 response is expected for valid metadata. + # On certain instance types, traversing the provided metadata path + # produces a 404 for some unknown reason. In that event, return + # `nil` and continue the run instead of failing it. def metadata_get(id, api_version) path = "/#{api_version}/meta-data/#{id}" response = http_client.get(path) - unless response.code == '200' + case response.code + when '200' + response.body + when '404' + Ohai::Log.debug("Encountered 404 response retreiving EC2 metadata path: #{path} ; continuing.") + nil + else raise "Encountered error retrieving EC2 metadata (#{path} returned #{response.code} response)" end - response end def fetch_metadata(id='', api_version=nil) api_version ||= best_api_version return Hash.new if api_version.nil? metadata = Hash.new - metadata_get(id, api_version).body.split("\n").each do |o| - key = expand_path("#{id}#{o}") - if key[-1..-1] != '/' - metadata[metadata_key(key)] = - if EC2_ARRAY_VALUES.include? key - metadata_get(key, api_version).body.split("\n") + retrieved_metadata = metadata_get(id, api_version) + if retrieved_metadata + retrieved_metadata.split("\n").each do |o| + key = expand_path("#{id}#{o}") + if key[-1..-1] != '/' + metadata[metadata_key(key)] = + if EC2_ARRAY_VALUES.include? key + retr_meta = metadata_get(key, api_version) + retr_meta ? retr_meta.split("\n") : retr_meta + else + metadata_get(key, api_version) + end + elsif not key.eql?(id) and not key.eql?('/') + name = key[0..-2] + sym = metadata_key(name) + if EC2_ARRAY_DIR.include?(name) + metadata[sym] = fetch_dir_metadata(key, api_version) + elsif EC2_JSON_DIR.include?(name) + metadata[sym] = fetch_json_dir_metadata(key, api_version) else - metadata_get(key, api_version).body + fetch_metadata(key, api_version).each{|k,v| metadata[k] = v} end - elsif not key.eql?(id) and not key.eql?('/') - name = key[0..-2] - sym = metadata_key(name) - if EC2_ARRAY_DIR.include?(name) - metadata[sym] = fetch_dir_metadata(key, api_version) - elsif EC2_JSON_DIR.include?(name) - metadata[sym] = fetch_json_dir_metadata(key, api_version) - else - fetch_metadata(key, api_version).each{|k,v| metadata[k] = v} end end + metadata end - metadata end def fetch_dir_metadata(id, api_version) metadata = Hash.new - metadata_get(id, api_version).body.split("\n").each do |o| - key = expand_path(o) - if key[-1..-1] != '/' - metadata[metadata_key(key)] = metadata_get("#{id}#{key}", api_version).body - elsif not key.eql?('/') - metadata[key[0..-2]] = fetch_dir_metadata("#{id}#{key}", api_version) + retrieved_metadata = metadata_get(id, api_version) + if retrieved_metadata + retrieved_metadata.split("\n").each do |o| + key = expand_path(o) + if key[-1..-1] != '/' + retr_meta = metadata_get("#{id}#{key}", api_version) + metadata[metadata_key(key)] = retr_meta ? retr_meta : '' + elsif not key.eql?('/') + metadata[key[0..-2]] = fetch_dir_metadata("#{id}#{key}", api_version) + end end + metadata end - metadata end def fetch_json_dir_metadata(id, api_version) metadata = Hash.new - metadata_get(id, api_version).body.split("\n").each do |o| - key = expand_path(o) - if key[-1..-1] != '/' - data = metadata_get("#{id}#{key}", api_version).body - json = StringIO.new(data) - parser = Yajl::Parser.new - metadata[metadata_key(key)] = parser.parse(json) - elsif not key.eql?('/') - metadata[key[0..-2]] = fetch_json_dir_metadata("#{id}#{key}", api_version) + retrieved_metadata = metadata_get(id, api_version) + if retrieved_metadata + retrieved_metadata.split("\n").each do |o| + key = expand_path(o) + if key[-1..-1] != '/' + retr_meta = metadata_get("#{id}#{key}", api_version) + data = retr_meta ? retr_meta : '' + json = StringIO.new(data) + parser = FFI_Yajl::Parser.new + metadata[metadata_key(key)] = parser.parse(json) + elsif not key.eql?('/') + metadata[key[0..-2]] = fetch_json_dir_metadata("#{id}#{key}", api_version) + end end + metadata end - metadata end def fetch_userdata() api_version = best_api_version return nil if api_version.nil?