[openstack-dev] [puppet] Adding "IPv6" bracket handling utilities in openstacklib.
Sofer Athlan-Guyot
sathlang at redhat.com
Fri Jan 8 14:56:59 UTC 2016
Hi all,
I've got an input from a fellow worker[1]. Basically, transparently
transforming user data in puppet is opening a big can of worms.
He came up with a rather contrived example, but it's definitively worth
discussing it.
So in the vncproxy example, if the user does this:
$vncproxy_host => 'ff02::1:ff00:1:80',
$vncproxy_port => '80'
thinking that vncproxy_host is set to host 'ff02::1:ff00:1' with port
":80" (he forgot to add brackets) then the code will transform that to a
valid uri '[ff02::1:ff00:1:80]:80'
Without the code it would give this 'ff02::1:ff00:1:80:80' which would
fail as it lacks the brackets and is an invalid uri.
There is no way to make the difference between "wrong ipv6 + port" and
"valid ipv6", so mangling user input can lead to unexpected result.
I'm going to put the patches on WIP, as maybe, this may not be a good
idea to have user input transformed at all in puppet as all corner cases
cannot be detected.
The trade-off, of course, is user convenience.
So what do you think, parse and transform user input or not ?
[1] thanks Lukas
Sofer Athlan-Guyot <sathlang at redhat.com> writes:
> Cody Herriges <cody at herriges.org> writes:
>
> Sorry I didn't see you reply before. Comments below.
>
>> Sofer Athlan-Guyot wrote:
>>> Hi,
>>>
>>> There are a few places where I would like to be able to check for IPv6
>>> address and add bracket to the parameters. I think that would be a nice
>>> addition to the puppet-openstacklib/lib/puppet/parser.
>>>
>>> Here the interface I have in mind with the puppet-nova module:
>>>
>>> class nova::vncproxy::common (
>>> $vncproxy_host = undef,
>>> $vncproxy_protocol = undef,
>>> $vncproxy_port = undef,
>>> $vncproxy_path = undef,
>>> ) {
>>>
>>> include ::nova::deps
>>>
>>> $vncproxy_host_real = pick(
>>> ipv6_add_bracket_maybe($vncproxy_host,
>>> $::nova::compute::vncproxy_host,
>>> $::nova::vncproxy::host,
>>> false)
>>>
>>>
>>> This would returns an array with the host decorated with "[]" if the
>>> value is an IPv6 address. Ideally the function could take only one
>>> value and return it or take an array and return an array for seamless
>>> integration in the code.
>>>
>>> WDYT?
>>>
>>
>> I see this and it looks like that only only reason this is a problem is
>> because we've broken up all the pieces of data needed to generate a URI
>> so it becomes inappropriate to decorate the vncproxy_host variable's
>> value with "[]" because it lacks the port appended to the end. What are
>> the ramifications of simply switching to a "$vnc_uri" variable much the
>> same that has happened with identity_uri and auth_uri, e.g.
>> https://review.openstack.org/262799. If one has to simply define the
>> entire URI, they'll be able to properly decorate the IPv6 address.
>
> Yes, that could be something to consider as well. The difficulties with
> this approach, that I see are that it's not easy on the user (change of
> interface) and must rely on a deprecation period (code to maintain).
>
> Adding a function on the other hand is transparent for the user and it
> may be useful in other part of the code.
>
> As for this solution (adding a function) I had to lower my expectation
> to meet puppet < 4.1 reality. There is no splat operator, and no way to
> chain functions as I wanted at the beginning. What I did is a simpler
> function that take only one argument, the stuff to maybe transform. The
> example above adjusted:
>
>
> $vncproxy_host_real = ipv6_add_bracket_maybe(pick(
> $vncproxy_host,
> $::nova::compute::vncproxy_host,
> $::nova::vncproxy::host,
> false))
>
> Please let me know what you think.
--
Sofer Athlan-Guyot
More information about the OpenStack-dev
mailing list