Source code for dremio_client.dremio_client

# -*- coding: utf-8 -*-
#
# Copyright (c) 2019 Ryan Murray.
#
# This file is part of Dremio Client
# (see https://github.com/rymurr/dremio_client).
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

"""Main module."""

from .auth import auth
from .dremio_simple_client import SimpleClient
from .model.catalog import catalog
from .model.data import (
    make_reflection,
    make_vote,
    make_wlm_queue,
    make_wlm_rule,
    _get_item,
)
from .model.endpoints import (
    group,
    personal_access_token,
    reflections,
    user,
    votes,
    wlm_queues,
    wlm_rules,
)
from .query import query


[docs]class DremioClient(object): def __init__(self, config): """ Create a Dremio Client instance. This currently only supports basic auth from the constructor. Will be extended for oauth, token auth and storing auth on disk or in stores in the future :param config: config dict from confuse """ port = config["port"].get(int) self._hostname = config["hostname"].get() self._base_url = ( ("https" if config["ssl"].get(bool) else "http") + "://" + self._hostname + (":{}".format(port) if port else "") ) self._flight_port = config["flight"]["port"].get(int) self._odbc_port = config["odbc"]["port"].get(int) self._username = config["auth"]["username"].get() self._password = config["auth"]["password"].get() self._token = auth(self._base_url, config) self._ssl_verify = config["verify"].get(bool) self._catalog = catalog(self._token, self._base_url, self.query, self._ssl_verify) self._reflections = list() self._wlm_queues = list() self._wlm_rules = list() self._votes = list() self._simple = SimpleClient(config)
[docs] def simple(self): return self._simple
@property def data(self): return self._catalog @property def reflections(self): if len(self._reflections) == 0: self._fetch_reflections() return self._reflections def _fetch_reflections(self): refs = reflections(self._token, self._base_url, ssl_verify=self._ssl_verify) for ref in refs["data"]: # todo I think we should attach reflections to their catalog entries... self._reflections.append(make_reflection(ref)) @property def wlm_queues(self): if len(self._wlm_queues) == 0: self._fetch_wlm_queues() return self._wlm_queues def _fetch_wlm_queues(self): refs = wlm_queues(self._token, self._base_url, ssl_verify=self._ssl_verify) for ref in refs["data"]: # todo I think we should attach reflections to their catalog entries... self._wlm_queues.append(make_wlm_queue(ref)) @property def wlm_rules(self): if len(self._wlm_rules) == 0: self._fetch_wlm_rules() return self._wlm_rules def _fetch_wlm_rules(self): refs = wlm_rules(self._token, self._base_url, ssl_verify=self._ssl_verify) for ref in refs["rules"]: # todo I think we should attach reflections to their catalog entries... self._wlm_rules.append(make_wlm_rule(ref)) @property def votes(self): if len(self._votes) == 0: self._fetch_votes() return self._votes def _fetch_votes(self): refs = votes(self._token, self._base_url, ssl_verify=self._ssl_verify) for ref in refs["data"]: # todo I think we should attach reflections to their catalog entries... self._votes.append(make_vote(ref))
[docs] def query(self, sql, pandas=True, method="flight"): return query( self._token, self._base_url, self._hostname, self._odbc_port, self._flight_port, self._username, self._password, self._ssl_verify, sql, pandas, method, )
[docs] def user(self, uid=None, name=None): """ return details for a user User must supply one of uid or name. uid takes precedence if both are supplied .. note:: can only be run by admin :param uid: group id :param name: group name :raise: DremioUnauthorizedException if token is incorrect or invalid :raise: DremioPermissionException user does not have permission :raise: DremioNotFoundException user could not be found :return: user info as a dict """ return user(self._token, self._base_url, uid, name, ssl_verify=self._ssl_verify)
[docs] def group(self, gid=None, name=None): """ return details for a group User must supply one of gid or name. gid takes precedence if both are supplied .. note:: can only be run by admin :param gid: group id :param name: group name :raise: DremioUnauthorizedException if token is incorrect or invalid :raise: DremioPermissionException user does not have permission :raise: DremioNotFoundException group could not be found :return: group info as a dict """ return group(self._token, self._base_url, gid, name, ssl_verify=self._ssl_verify)
[docs] def personal_access_token(self, uid): """ return a list of personal access tokens for a user .. note:: can only be run for the logged in user :param uid: user id :raise: DremioUnauthorizedException if token is incorrect or invalid :raise: DremioPermissionException user does not have permission :raise: DremioNotFoundException user could not be found :return: personal access token list """ return personal_access_token(self._token, self._base_url, uid, ssl_verify=self._ssl_verify)
[docs] def get_item(self, cid=None, path=None): return _get_item(self._catalog, cid, path)