class TVM(object): """Tokens fetch interface implementation. Provides public `fetch_token` method, which should be common among various token backend types. """ # Can be taken from class name in case of TVM, but could be inconvenient # in less general name formatting rules. TYPE = 'TVM' def __init__(self, client_id, client_secret, endpoints=None, name='tvm'): """TVM :param client_id: Integer client identifier. :param client_secret: Client secret. :param endpoints: TVM service endpoints list in format (host, port). :param name: TVM service name, defaults to 'tvm'. """ self._client_id = client_id self._client_secret = client_secret self._tvm = Service(name, endpoints) if endpoints else Service(name) @gen.coroutine def fetch_token(self): """Gains token from secure backend service. :return: Token formatted for Cocaine protocol header. """ grant_type = 'client_credentials' channel = yield self._tvm.ticket_full(self._client_id, self._client_secret, grant_type, {}) ticket = yield channel.rx.get() raise gen.Return(self._make_token(ticket)) def _make_token(self, ticket): return '{} {}'.format(self.TYPE, ticket)