'Return an instaance of InfluxDBClient from given data source name.
Returns an instance of InfluxDBClient from the provided data source
name. Supported schemes are "influxdb", "https+influxdb",
"udp+influxdb". Parameters for the InfluxDBClient constructor may be
also be passed to this function.
Examples:
>> cli = InfluxDBClient.from_dsn(\'influxdb://username:password@\
... localhost:8086/databasename\', timeout=5)
>> type(cli)
<class \'influxdb.client.InfluxDBClient\'>
>> cli = InfluxDBClient.from_dsn(\'udp+influxdb://username:pass@\
... localhost:8086/databasename\', timeout=5, udp_port=159)
>> print(\'{0._baseurl} - {0.use_udp} {0.udp_port}\'.format(cli))
http://localhost:8086 - True 159
:param dsn: data source name
:type dsn: string
:param **kwargs: additional parameters for InfluxDBClient.
:type **kwargs: dict
:note: parameters provided in **kwargs may override dsn parameters.
:note: when using "udp+influxdb" the specified port (if any) will be
used for the TCP connection; specify the udp port with the additional
udp_port parameter (cf. examples).
:raise ValueError: if the provided DSN has any unexpected value.'

@staticmethod
def from_dsn(dsn, **kwargs):

    init_args = {}
    conn_params = urlparse(dsn)
    scheme_info = conn_params.scheme.split('+')
    if (len(scheme_info) == 1):
        scheme = scheme_info[0]
        modifier = None
    else:
        (modifier, scheme) = scheme_info
    if (scheme != 'influxdb'):
        raise ValueError('Unknown    scheme    "{0}".'.format(scheme))
    if modifier:
        if (modifier == 'udp'):
            init_args['use_udp'] = True
        elif (modifier == 'https'):
            init_args['ssl'] = True
        else:
            raise ValueError('Unknown    modifier    "{0}".'.format(modifier))
    if conn_params.hostname:
        init_args['host'] = conn_params.hostname
    if conn_params.port:
        init_args['port'] = conn_params.port
    if conn_params.username:
        init_args['username'] = conn_params.username
    if conn_params.password:
        init_args['password'] = conn_params.password
    if (conn_params.path and (len(conn_params.path) > 1)):
        init_args['database'] = conn_params.path[1:]
    init_args.update(kwargs)
    return InfluxDBClient(**init_args)
