> Further, if we're worried about confusion about how to
load the two files, we could have a constructor that does that default
pattern for you.

Yeah, I don't really see the need for this two step / two file approach. I
think the config providers should be listed in the main property file, not
some secondary file, and we should avoid backwards compatibility issues by,
as Ewan says, having a new constructor, (deprecating the old), that allows
the functionality to be turned on/off.

I suggest we also consider adding a new method to AbstractConfig to allow
applications to get the unresolved raw value, e.g. String
getRawValue(String key).  Given a config entry like "
config.providers.vault.password=$
<https://cwiki.apache.org/confluence/display/KAFKA/config.providers.vault.password=$>
{file:/path/to/secrets.properties:vault.secret.password}" then getRawValue
would always return "$
<https://cwiki.apache.org/confluence/display/KAFKA/config.providers.vault.password=$>
{file:/path/to/secrets.properties:vault.secret.password}". I can see this
being useful.

With regards to on-change subscription: surely all we'd need is to provide
a way for users to attach a callback for a given key, right? e.g. `boolean
subscribe(key, callback)`, where the return value is true if the key has a
config provider, false if it doesn't. I think this would be worthwhile
including as it stops people having to build their own, doing the parsing
and wiring themselves.

Andy

On Fri, 25 Jan 2019 at 09:11, Rajini Sivaram <rajinisiva...@gmail.com>
wrote:

> *Regarding brokers, I think if we want to avoid exposing secrets
> over DescribeConfigs responses, we'd probably need changes similar to those
> we needed to make for the Connect REST API. *
>
> Password configs are not returned in DescribeConfigs response in the
> broker. The response indicates that the config is sensitive and no value is
> returned.
>
>
> On Thu, Jan 24, 2019 at 11:38 PM Ewen Cheslack-Postava <e...@confluent.io>
> wrote:
>
> > > It allows _all_ existing clients of the class, e.g. those in Apache
> > Kafka or in applications written by other people that use the class, to
> get
> > this functionality for free, i.e. without any code changes.  (I realize
> > this is probably where the 'unexpected effects' comes from).
> >
> > > Personally, I think we should do our best to make this work seamlessly
> /
> > transparently, because we're likely going to have this functionality for
> a
> > long time.
> >
> > Connect (and connectors that may also use AbstractConfig for themselves
> > since they are supposed to expose a ConfigDef anyway) could definitely be
> > an issue. I'd imagine formats like this are rare, but we do know there
> are
> > some cases where people add new syntax, e.g. the landoop connectors
> support
> > some sort of inline sql-like transformation. I don't know of any cases
> that
> > would specifically conflict with the syntax, but there is some risk.
> >
> > I agree getting it automated would be ideal, and it is probably more
> > reasonable to claim any issues would be unlike if unresolvable cases
> don't
> > result in an exception. On the other hand, I think the vast majority of
> the
> > benefit would come from making this work for brokers, Connect, and
> Streams
> > (and in most applications making this work is pretty trivial given the
> > answer to question (1) is that it works by passing same config to the
> > static method then constructor).
> >
> > Tying this discussion also back to the question about subscribing for
> > updates, apps would commonly need modification to support that, and I
> think
> > ideally you want to be using some sort of KMS where rotation is done
> > automatically and you need to subscribe to updates. Since it's a pretty
> > common pattern to only look up configs once instead of always going back
> to
> > the AbstractConfig, you'd really only be able to get some of the long
> term
> > intended benefit of this improvement. We should definitely have a follow
> up
> > to this that deals with the subscriptions, but I think the current scope
> is
> > still a useful improvement -- Connect got this implemented because
> exposure
> > of secrets via REST API was such a big problem. Making the changes in
> > AbstractConfig is a better long term solution so we can get this working
> > with all components.
> >
> > Regarding brokers, I think if we want to avoid exposing secrets over
> > DescribeConfigs responses, we'd probably need changes similar to those we
> > needed to make for the Connect REST API. Also agree we'd need to think
> > about how to make this work with dynamic configs (which would also be a
> > nice thing to extend to, e.g., Connect).
> >
> > As a practical suggestion, while it doesn't give you the update for free,
> > we could consider also deprecating the existing constructor to encourage
> > people to update. Further, if we're worried about confusion about how to
> > load the two files, we could have a constructor that does that default
> > pattern for you.
> >
> > -Ewen
> >
> > On Thu, Jan 24, 2019 at 11:36 AM Colin McCabe <cmcc...@apache.org>
> wrote:
> >
> > > On Thu, Jan 24, 2019, at 11:25, TEJAL ADSUL wrote:
> > > >
> > > >
> > > > On 2019/01/24 17:26:02, Andy Coates <a...@confluent.io> wrote:
> > > > > I'm wondering why we're rejected changing AbstractConfig to
> > > automatically
> > > > > resolve the variables?
> > > > >
> > > > > > 1. Change AbstractConfig to *automatically* resolve variables of
> > the
> > > form
> > > > > specified in KIP-297. This was rejected because it would change the
> > > > > behavior of existing code and might cause unexpected effects.
> > > > >
> > > > > Doing so seems to me to have two very large benefits:
> > > > >
> > > > > 1. It allows the config providers to be defined within the same
> file
> > > as the
> > > > > config that uses the providers, e.g.
> > > > >
> > > > > config.providers=file,vault
> > > > > <
> > >
> >
> https://cwiki.apache.org/confluence/display/KAFKA/config.providers=file,vault
> > > >
> > > > > config.providers.file.
> > > > > <
> > >
> https://cwiki.apache.org/confluence/display/KAFKA/config.providers.file
> > .>
> > > > > class=org.apache.kafka.connect.configs.FileConfigProvider
> > > > > <
> > >
> >
> https://cwiki.apache.org/confluence/display/KAFKA/org.apache.kafka.connect.configs.FileConfigProvider
> > > >
> > > > > config.providers.file.param.path=
> > > > > <
> > >
> >
> https://cwiki.apache.org/confluence/display/KAFKA/config.providers.file.other.prop=another
> > > >
> > > > > /mnt/secrets/passwords
> > > > >
> > > > > foo.baz=/usr/temp/
> > > > > <
> > https://cwiki.apache.org/confluence/display/KAFKA/foo.baz=/usr/temp/>
> > > > > foo.bar=$ <
> > https://cwiki.apache.org/confluence/display/KAFKA/foo.bar=$
> > > >
> > > > > {file:/path/to/variables.properties:foo.bar}
> > > > >
> > > > > Is this possible with what's currently being proposed? i.e could
> you
> > > load
> > > > > the file and pass the map first to `loadConfigProviders` and then
> > > again to
> > > > > the constructor?
> > > > >
> > > > > 2. It allows _all_ existing clients of the class, e.g. those in
> > Apache
> > > > > Kafka or in applications written by other people that use the
> class,
> > > to get
> > > > > this functionality for free, i.e. without any code changes.  (I
> > realize
> > > > > this is probably where the 'unexpected effects' comes from).
> > > > >
> > > > > I'm assuming the unexpected side effects come about if an existing
> > > > > properties file already contains compatible config.providers
> > > > > <
> > >
> >
> https://cwiki.apache.org/confluence/display/KAFKA/config.providers=file,vault
> > > >
> > > > >  entries _and_ has other properties in the form ${xx:yy} or
> > > ${xx:yy:zz}.
> > > > > While possible, these seems fairly unlikely unless for random
> client
> > > > > property files. So I'm assuming there's a specific instance where
> we
> > > think
> > > > > this is likely? Something to do with Connect config maybe?
> > > > >
> > > > > Personally, I think we should do our best to make this work
> > seamlessly
> > > /
> > > > > transparently, because we're likely going to have this
> functionality
> > > for a
> > > > > long time.
> > > > >
> > > > > Andy
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > On Tue, 22 Jan 2019 at 17:38, te...@confluent.io <
> te...@confluent.io
> > >
> > > wrote:
> > > > >
> > > > > > Hi all,
> > > > > >
> > > > > > We would like to start vote on KIP-421 to to enhance the
> > > AbstractConfig
> > > > > > base class to support replacing variables in configurations just
> > > prior to
> > > > > > parsing and validation.
> > > > > >
> > > > > > Link for the KIP:
> > > > > >
> > > > > >
> > > > > >
> > >
> >
> https://cwiki.apache.org/confluence/display/KAFKA/KIP-421%3A+Support+resolving+externalized+secrets+in+AbstractConfig
> > > > > >
> > > > > >
> > > > > > Thanks,
> > > > > > Tejal
> > > > > >
> > >
> > > Hi,
> > >
> > > I think Andy and Rajini bring up a good point.  If this change is
> limited
> > > to just Connect, then it's not completely clear why it needs to be in
> > > AbstractConfig.  On the other hand, if it applies to brokers and
> clients
> > > (and other things), then we should figure out how that integration will
> > > look.
> > >
> > > > > Hi Andy,
> > > >
> > > > So wanted to make sure that we come up with a simple approach with no
> > > > side effects or additional changes to any components. The rejected
> > > > approach would require a change in Connect's behavior and we dint
> want
> > > > to make that for this approach.
> > >
> > > It seems like it should be possible to keep Connect's behavior the same
> > as
> > > it is now, but add automatic external configuration lookup to the Kafka
> > > broker.  In order to do this, we could have an additional parameter
> that
> > > was set by the broker but not by Connect.
> > >
> > > One candidate is we could have a Java parameter which describes which
> > > config key to look at to find the config providers.  Then the broker
> > could
> > > set this, but connect could leave it unset.  Then people using the
> broker
> > > could describe their config providers in the configuration file itself,
> > and
> > > connect users could do something different if desired.
> > >
> > > best,
> > > Colin
> > >
> > > >
> > > > also regarding Point 1. yes thats exactly the expected behavior of
> > > > loadConfigProviders, we will send a file to it and it will create the
> > > > instances of the configProvider which will be consumed by the
> > > > constructor.
> > > >
> > > > Thanks,
> > > > Tejal
> > > >
> > >
> >
>

Reply via email to