chef / ohai

Ohai profiles your system and emits JSON
https://docs.chef.io/ohai.html
Apache License 2.0
681 stars 452 forks source link

Plugin Cloud threw exception #<SystemStackError: stack level too deep> #1796

Closed nvwls closed 1 year ago

nvwls commented 1 year ago

Description

Running test-kitchen/dokken on GKE using chef 18.1.0 results in SystemStackError

Ohai Version

18.0.26

Platform Version

centos-7.9.2009 centos-stream-8 centos-stream-9

Ohai Output

chef-16.18.0 is fine. But chef-18.1.0 results in an SystemStackError.

[2023-05-11T02:56:07+00:00] WARN: Plugin Cloud threw exception #<SystemStackError: stack level too deep> /opt/chef/embedded/lib/ruby/gems/3.1.0/gems/net-protocol-0.2.1/lib/net/protocol.rb:314:in `each'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/net-protocol-0.2.1/lib/net/protocol.rb:314:in `each_with_index'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/net-protocol-0.2.1/lib/net/protocol.rb:314:in `write0'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/net-protocol-0.2.1/lib/net/protocol.rb:287:in `block in write'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/net-protocol-0.2.1/lib/net/protocol.rb:304:in `writing'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/net-protocol-0.2.1/lib/net/protocol.rb:286:in `write'
/opt/chef/embedded/lib/ruby/3.1.0/net/http/generic_request.rb:333:in `write_header'
/opt/chef/embedded/lib/ruby/3.1.0/net/http/generic_request.rb:129:in `exec'
/opt/chef/embedded/lib/ruby/3.1.0/net/http.rb:1568:in `block in transport_request'
/opt/chef/embedded/lib/ruby/3.1.0/net/http.rb:1566:in `catch'
/opt/chef/embedded/lib/ruby/3.1.0/net/http.rb:1566:in `transport_request'
/opt/chef/embedded/lib/ruby/3.1.0/net/http.rb:1539:in `request'
/opt/chef/embedded/lib/ruby/3.1.0/net/http.rb:1288:in `get'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:32:in `http_get'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:39:in `fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:49:in `block in fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `each'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:49:in `block in fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `each'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:49:in `block in fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `each'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:49:in `block in fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `each'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:49:in `block in fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `each'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:49:in `block in fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `each'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:49:in `block in fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `each'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:49:in `block in fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `each'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:48:in `fetch_metadata'
/opt/chef/embedded/lib/ruby/gems/3.1.0/gems/ohai-18.0.26/lib/ohai/mixin/gce_metadata.rb:49:in `block in fetch_metadata'
nvwls commented 1 year ago

The issue is that the top-level object never changes because of the trailing ?recursive=true

The calls will be: /computeMetadata/v1/?recursive=true/ /computeMetadata/v1/?recursive=true/instance/ /computeMetadata/v1/?recursive=true/instance/instance/ and so on

diff --git lib/ohai/mixin/gce_metadata.rb lib/ohai/mixin/gce_metadata.rb
index 64b35f92..29725c3b 100644
--- lib/ohai/mixin/gce_metadata.rb
+++ lib/ohai/mixin/gce_metadata.rb
@@ -23,7 +23,7 @@ module Ohai

       # Trailing dot to host is added to avoid DNS search path
       GCE_METADATA_ADDR ||= "metadata.google.internal."
-      GCE_METADATA_URL ||= "/computeMetadata/v1/?recursive=true"
+      GCE_METADATA_URL ||= "/computeMetadata/v1"

       # fetch the meta content with a timeout and the required header
       def http_get(uri)
@@ -36,7 +36,9 @@ module Ohai
       end

       def fetch_metadata(id = "")
-        response = http_get("#{GCE_METADATA_URL}/#{id}")
+        url = "#{GCE_METADATA_URL}/#{id}"
+        url << "?recursive=true" if url.end_with?("/")
+        response = http_get(url)
         return nil unless response.code == "200"

         if json?(response.body)