summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Smith <tsmith84@gmail.com>2016-02-15 19:43:39 -0800
committerTim Smith <tsmith84@gmail.com>2016-02-15 19:43:39 -0800
commit7a2bae0dd881f1cdfd68d5e9f6cddbfc063bb2b7 (patch)
treeb130f64f48fb224840911afcfbaff81c55f95c09
parentac9f5a2ae4ada9f2e6e821418ed3a9039bda9a91 (diff)
downloadohai-7a2bae0dd881f1cdfd68d5e9f6cddbfc063bb2b7.tar.gz
Update GCE metadata API version and fail better
Use the non-beta metadata URL. This requires setting the header on all requests so there's a bit of changes to how the http connection is initialized Fail better if the google internal DNS name can't be resolved
-rw-r--r--lib/ohai/mixin/gce_metadata.rb24
1 files changed, 16 insertions, 8 deletions
diff --git a/lib/ohai/mixin/gce_metadata.rb b/lib/ohai/mixin/gce_metadata.rb
index 05127a5e..deffee8d 100644
--- a/lib/ohai/mixin/gce_metadata.rb
+++ b/lib/ohai/mixin/gce_metadata.rb
@@ -23,11 +23,17 @@ module Ohai
# Trailing dot to host is added to avoid DNS search path
GCE_METADATA_ADDR = "metadata.google.internal." unless defined?(GCE_METADATA_ADDR)
- GCE_METADATA_URL = "/computeMetadata/v1beta1/?recursive=true" unless defined?(GCE_METADATA_URL)
+ GCE_METADATA_URL = "/computeMetadata/v1/?recursive=true" unless defined?(GCE_METADATA_URL)
def can_metadata_connect?(addr, port, timeout = 2)
t = Socket.new(Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0)
- saddr = Socket.pack_sockaddr_in(port, addr)
+ begin
+ saddr = Socket.pack_sockaddr_in(port, addr)
+ rescue SocketError => e # occurs when non-GCE systems try to resolve metadata.google.internal
+ Ohai::Log.debug("gce mixin: can_metadata_connect? failed setting up socket: #{e}")
+ return false
+ end
+
connected = false
begin
@@ -47,24 +53,26 @@ module Ohai
end
rescue SystemCallError
end
- Ohai::Log.debug("can_metadata_connect? == #{connected}")
+ Ohai::Log.debug("gce mixin: can_metadata_connect? == #{connected}")
connected
end
- def http_client
- Net::HTTP.start(GCE_METADATA_ADDR).tap { |h| h.read_timeout = 6 }
+ # fetch the meta content with a timeout and the required header
+ def http_get(uri)
+ conn = Net::HTTP.start(GCE_METADATA_ADDR)
+ conn.read_timeout = 6
+ conn.get(uri, initheader = { 'Metadata-Flavor' => 'Google' })
end
def fetch_metadata(id = "")
- uri = "#{GCE_METADATA_URL}/#{id}"
- response = http_client.get(uri)
+ response = http_get("#{GCE_METADATA_URL}/#{id}")
return nil unless response.code == "200"
if json?(response.body)
data = StringIO.new(response.body)
parser = FFI_Yajl::Parser.new
parser.parse(data)
- elsif has_trailing_slash?(id) or (id == "")
+ elsif has_trailing_slash?(id) || (id == "")
temp = {}
response.body.split("\n").each do |sub_attr|
temp[sanitize_key(sub_attr)] = fetch_metadata("#{id}#{sub_attr}")