Randall Hauch created KAFKA-6142: ------------------------------------ Summary: Connect worker configurations and connector configurations should accept environment variables Key: KAFKA-6142 URL: https://issues.apache.org/jira/browse/KAFKA-6142 Project: Kafka Issue Type: Improvement Components: KafkaConnect Affects Versions: 1.0.0 Reporter: Randall Hauch
Currently, when a worker or connector configuration is parsed, the values are used as-is without any kind of pre-processing before the value is used. It should be possible to define configuration properties such that string literal values or default values can use *_configuration variables_* that reference environment variables and/or system properties, and that these configuration variables are resolved/replaced before the configuration value is used. I propose doing this enhancement in Kafka client's {{ConfigDef}} by adding a {{ConfigDef.Transformer}} interface: {code:java} /** * Transform the configuration value. */ public interface Transformer { /** * Transform the configuration value. * @param name The name of the configuration * @param value The value of the configuration * @return the preprocessed value * @throws ConfigException if the value is invalid. */ Object apply(String name, Object value); } {code} and then allowing {{Transformer}} implementations to be passed to {{ConfigDef.define(...)}} such all existing signatures are maintained for backward compatibility. By default, the definition would use an identity transform that simply returns the value. The transformers would be called in {{ConfigDef.parseValue(...)}} before the {{parseType(...)}} method is called, and would also be called on the default value if one is provided. Then, a {{ConfigDef.ReplaceSystemVariables}} implementation would be provided to look in {{String}} values for zero or more variables defined with this EBNF grammar: {noformat} '$' '{' varName { ',' varName } [ ':' defaultValue] '}' {noformat} where: * {{varName}} is the name of a Java system property or {{env.}} followed by the name of an environment variable, and * {{defaultValue}} specifies the replacement value used when no environment variable or system property is found, and defaults to an empty string. The value of the first system property or environment variable resolved is then used to replace the variable expression. This implementation would have trace or debug level logging to describe what it is doing. For example, the variable {{$\{env.KAFKA_HOME\}}} would replace the variable expression with the value of the {{KAFKA_HOME}} environment variable or an blank string if that variable doesn't exist. Likewise, the variable {{$\{foo.prop1,foo.prop2,env.MY_ENV_VAR:value\}}} would be replaced with the value of the {{foo.prop1}} system property if it exists, or with the value of the {{foo.prop2}} system property if it exists, or with the value of the {{MY_ENV_VAR}} environment variable if it exists, or {{value}} if none of the system properties exist. -- This message was sent by Atlassian JIRA (v6.4.14#64029)