congress/congress/datasources/push_driver.py

80 lines
2.8 KiB
Python

# Copyright (c) 2016 NTT All rights reserved.
#
# Licensed 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.
#
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
import datetime
from oslo_log import log as logging
from congress.datasources import constants
from congress.datasources import datasource_driver
LOG = logging.getLogger(__name__)
class PushDriver(datasource_driver.PushedDataSourceDriver):
"""A DataSource Driver for pushing tuples of data.
To use this driver, run the following API:
PUT /v1/data-sources/<the driver id>/tables/<table id>/rows
Still a work in progress, but intent is to allow a request body
to be any list of lists where the internal lists all have
the same number of elements.
request body:
[ [1,2], [3,4] ]
"""
def __init__(self, name='', args=None):
super(PushDriver, self).__init__(name, args=args)
self._table_deps['data'] = ['data']
@classmethod
def get_schema(cls):
schema = {}
# Hardcode the tables for now. Later, create the tables on the fly.
# May be as easy as deleting the following line.
schema['data'] = []
return schema
@staticmethod
def get_datasource_info():
result = {}
result['id'] = 'push'
result['description'] = ('Datasource driver that allows external '
'systems to push data.')
# TODO(masa): Remove the REQUIRED config once python-congressclient
# has been able to retrieve non-dict object in config fields at
# $ openstack congress datasource list command
result['config'] = {'description': constants.REQUIRED,
'persist_data': constants.OPTIONAL}
return result
def update_entire_data(self, table_id, objs):
LOG.info('update %s table in %s datasource', table_id, self.name)
tablename = 'data' # hard code
self.prior_state = dict(self.state)
self._update_state(tablename,
[tuple([table_id, tuple(x)]) for x in objs])
LOG.debug('publish a new state %s in %s',
self.state[tablename], tablename)
self.publish(tablename, self.state[tablename])
self.number_of_updates += 1
self.last_updated_time = datetime.datetime.now()