108 lines
3.4 KiB
Python
Executable File
108 lines
3.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# Copyright (c) 2013 VMware, Inc. 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.
|
|
#
|
|
|
|
import argparse
|
|
import sys
|
|
import time
|
|
|
|
import eventlet
|
|
eventlet.patcher.monkey_patch()
|
|
|
|
import ovs.daemon
|
|
import ovs.vlog
|
|
vlog = ovs.vlog.Vlog(__name__)
|
|
|
|
from ad_sync import UserGroupDataModel
|
|
from webservice import ApiApplication
|
|
from webservice import CollectionHandler
|
|
from webservice import ElementHandler
|
|
from webservice import PolicyDataModel
|
|
from webservice import RowCollectionHandler
|
|
from webservice import RowElementHandler
|
|
from webservice import SimpleDataModel
|
|
from wsgi import Server
|
|
|
|
|
|
DEFAULT_HTTP_ADDR = '0.0.0.0'
|
|
DEFAULT_HTTP_PORT = 8080
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--http_listen_port", default=DEFAULT_HTTP_PORT)
|
|
parser.add_argument("--http_listen_addr", default=DEFAULT_HTTP_ADDR)
|
|
ovs.vlog.add_args(parser)
|
|
ovs.daemon.add_args(parser)
|
|
|
|
args = parser.parse_args()
|
|
ovs.vlog.handle_args(args)
|
|
ovs.daemon.handle_args(args)
|
|
|
|
wsgi_server = Server("API Broker")
|
|
api = ApiApplication()
|
|
|
|
tables_model = SimpleDataModel()
|
|
table_collection_handler = CollectionHandler('/tables', tables_model)
|
|
api.register_handler(table_collection_handler)
|
|
table_element_handler = ElementHandler('/tables/([^/]+)', tables_model,
|
|
table_collection_handler)
|
|
api.register_handler(table_element_handler)
|
|
|
|
rows_model = SimpleDataModel()
|
|
#TODO: scope model per table
|
|
rows_collection_handler = RowCollectionHandler('/tables/([^/]+)/rows',
|
|
rows_model)
|
|
api.register_handler(rows_collection_handler)
|
|
rows_element_handler = RowElementHandler(
|
|
'/tables/([^/]+)/rows/([^/]+)', rows_model,
|
|
rows_collection_handler)
|
|
api.register_handler(rows_element_handler)
|
|
|
|
policy_model = PolicyDataModel()
|
|
policy_element_handler = ElementHandler('/policy', policy_model)
|
|
api.register_handler(policy_element_handler)
|
|
|
|
ad_model = UserGroupDataModel()
|
|
def ad_update_thread():
|
|
while True:
|
|
ad_model.update_from_ad() # XXX: blocks eventlet
|
|
time.sleep(3)
|
|
wsgi_server.pool.spawn_n(ad_update_thread)
|
|
|
|
ad_row_handler = CollectionHandler( '/tables/ad-groups/rows', ad_model)
|
|
api.register_handler(ad_row_handler, 0)
|
|
# Add static tables to model
|
|
tables_model.add_item({'sample': 'schema', 'id': 'ad-groups'}, 'ad-groups')
|
|
|
|
|
|
vlog.info("Starting congress server")
|
|
wsgi_server.start(api, args.http_listen_port,
|
|
args.http_listen_addr)
|
|
wsgi_server.wait()
|
|
|
|
#TODO: trigger watcher for policy outputs
|
|
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
main()
|
|
except SystemExit:
|
|
# Let system.exit() calls complete normally
|
|
raise
|
|
except:
|
|
vlog.exception("traceback")
|
|
sys.exit(ovs.daemon.RESTART_EXIT_CODE)
|