Hey everyone, I could use some help with a custom plugin we've written. We have a plugin for Puppet that makes SOAP calls out to a remote API service (http://secretserveronline.com), returning passwords, SSL keys, etc for us. The original code was written using pure HTTP GET calls, but I re-wrote the plugin to use the SOAP API because the remote service is slowly removing their GET-based API calls.
Because the Ruby SOAP library is so slow at interpreting WSDL files, I wrote the Puppet Function so that it checks if an existing 'Thycotic' object has been instantiated before creating a new one. If an existing one is there, it just uses it. This prevents creating new 'Thycotic' objects for every single call to the function, and speeds the puppet compilation up quite a bit when you call the plugin many times. (We have some manifests that use this plugin 30+ times for different keys, passwords, etc). The problem I'm running into is this: Fri Aug 23 01:28:09 +0000 2013 Puppet (err): Could not retrieve catalog from remote server: *Error 400 on SERVER: undefined method `has_key?' for nil:NilClass* at /mnt/puppet/staging/puppet-base/modules/specific/auth/manifests/eng_users.pp:27 on node ... We're seeing this very sparingly ... maybe 1/100 puppet manifest compilations. However, its still pretty odd. I am absolutely NOT a Ruby developer by trade, so alot of what I did was guess work unfortunately. I could really use some eyes on this code to see what I'm doing wrong, and suggest alternatives. The entire codebase is here: https://github.com/Nextdoor/puppet_thycotic The function file with the error is: https://github.com/Nextdoor/puppet_thycotic/blob/master/lib/puppet/parser/functions/getsecret.rb, and its obviously either failing on line 150 or 151 (the only calls to has_key?): > > # Create our Thycotic object if it doesn't already exist > # Look for our config file in a few locations (in order): > $thycotic ||= init(config) > # Now request our secret > secret = $thycotic.getSecret(secret_id) > # Walk through the returned elements of the hash, and look for the > one we want. > if secret.has_key?(secret_name) > if secret.has_key?(secret_name) == nil > raise Puppet::ParseError, "Secret returned by Thycotic.getSecret( > #{secretid}) was 'nil'. This is bad, erroring out." > else > return secret[secret_name].to_s > end > end Any thoughts? -- You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/puppet-dev. For more options, visit https://groups.google.com/groups/opt_out.
