hello,

I've been trying to figure out what these Sensitive types are all about based 
on 
https://github.com/puppetlabs/puppet-specifications/blob/master/language/types_values_variables.md#sensitivet
Best I can tell there isn't yet docs on docs.puppet.com for these

First I don't actually find usable examples in the spec docs, like what is it 
for? Whats a typical use case here?

The most basic example works:

  $secret = Sensitive(42)
  $processed = $secret.unwrap |$sensitive| { $sensitive * 2 }
  notice $secret
  notice $processed

This gives:

  Notice: Scope(Class[main]): Sensitive [value redacted]
  Notice: Scope(Class[main]): 84

Now I guess you want to be able to pass the sensitive one into a class, and it 
should not automatically unwrap but remain sensitive:

  class x(Sensitive $foo) {
    notice($foo)
  }

  class{"x": foo => Sensitive("bar")}

This fails:

  Error: Evaluation Error: Error while evaluating a Resource Statement, 
Class[X]: parameter 'foo' expects a Sensitive value, got String

Changing the "Sensitive $foo" to "Sensitive[String] $foo" as well: 

  Error: Evaluation Error: Error while evaluating a Resource Statement, 
Class[X]: parameter 'foo' expects a Sensitive value, got String

Yes if I do:

  notice(type_of(Sensitive("bar")))

I get "Sensitive[String]" so surely it should be passable into the class

Ok, so this is where it gets really weird, the docs says:

   There is no automatic unwrapping of sensitive values. As a consequence 
   it is not possible to perform operations on sensitive values other than 
   interpolating it as a String. When such interpolation takes place, the 
   value is shown as "[redacted]".

So ok, we have to specifically do like $foo.unwrap, but here's the really weird 
thing, once I
failed to pass a Sensitive type into the class I decided to do this:

  class x(String $foo) {
    notice("Value of \$foo: ${foo}")
    notice("Size of \$foo: ${foo.size}")
    notify{$foo: }
  }

  $x = Sensitive("bar")
  notice("Type of \$x: ${type_of($x)}")
  notice("Value of \$x: ${x}")

  class{"x":
    foo => $x
  }

This gives me:

  Notice: Scope(Class[main]): Type of $x: Sensitive[String]
  Notice: Scope(Class[main]): Value of $x: Sensitive [value redacted]
  Notice: Scope(Class[X]): Value of $foo: bar
  Notice: Scope(Class[X]): Size of $foo: 3
  Notice: Compiled catalog for dev3.devco.net in environment production in 0.13 
seconds
  Error: /X: Unable to mark 'foo' as sensitive: the property itself is not 
defined on component.
  Notice: bar
  Notice: /Stage[main]/X/Notify[bar]/message: defined 'message' as 'bar'

So here it gets unwrapped automatically by just passing the Sensitive[String] 
into a variable 
of String on a class? Does not seem like this is intended behaviour, and 
basically I have not been
able to do anything useful with these

Whats the intended purpose and how do you use this?

---
R.I.Pienaar

-- 
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 puppet-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-dev/460289666.57027.1472562919363.JavaMail.zimbra%40devco.net.
For more options, visit https://groups.google.com/d/optout.

Reply via email to