Source code for fixie.main
"""Main function for fixie."""
import sys
import argparse
import importlib
import tornado.web
import tornado.ioloop
from fixie.environ import ENV, ENVVARS, SERVICES, context
from fixie.logger import LOGGER
ALL_SERVICES = SERVICES | frozenset(['all'])
[docs]def parse_services(args):
"""Parses out the service names, and returns them as a set."""
services = set(args) & ALL_SERVICES
if len(services) == 0:
services = {'all'}
if 'all' in services:
services = set(SERVICES)
return services
[docs]def load_services(services):
"""Loads the requested services, returns the set actually loaded."""
loaded = set()
for service in services:
name = 'fixie_' + service
try:
importlib.import_module(name)
loaded.add(service)
except ImportError as e:
msg = 'failed to load fixie service: ' + name
return loaded
[docs]class NotGivenType(object):
"""Singleton for representing when no value is provided."""
__inst = None
def __new__(cls):
if NotGivenType.__inst is None:
NotGivenType.__inst = object.__new__(cls)
return NotGivenType.__inst
NotGiven = NotGivenType()
[docs]def make_parser():
"""Makes and argument parser for fixie."""
p = argparse.ArgumentParser('fixie', description='Cyclus-as-a-Service')
p.add_argument('-p', '--port', default=8642, dest='port', type=int,
help='port to serve the fixie services on.')
for name, (default, validate, convert, detype, docstr) in ENVVARS.items():
dest = name
if name.startswith('FIXIE_'):
name = name[6:]
name = '--' + name.lower().replace('_', '-')
p.add_argument(name, default=NotGiven, type=convert,
dest=dest, help=docstr)
p.add_argument('services', nargs='+', default=['all'],
help='the services to start, may be "all" to specify all '
'installed services. Default is "all" '
'Allowed values are: ' + ', '.join(sorted(ALL_SERVICES)))
return p
[docs]def set_envvars(ns):
"""Sets the environment variables from a namespace."""
for name in ENVVARS:
val = getattr(ns, name, NotGiven)
if val is NotGiven:
delattr(ns, name)
continue
ENV[name] = val
[docs]def run_application(ns):
"""Starts up an application with the loaded services."""
# first, find the request handler
handlers = []
for service in ns.services:
name = 'fixie_' + service + '.handlers'
mod = importlib.import_module(name)
handlers.extend(mod.HANDLERS)
# construct the app
app = tornado.web.Application(handlers)
serv = app.listen(ns.port)
data = vars(ns)
url = 'http://localhost:' + str(ns.port)
LOGGER.log('starting fixie ' + url, category='server', data=data)
try:
tornado.ioloop.IOLoop.current().start()
except KeyboardInterrupt:
print()
LOGGER.log('stopping fixie ' + url, category='server', data=data)
[docs]def main(args=None):
args = sys.argv if args is None else args
services = parse_services(args)
services = load_services(services)
with context():
p = make_parser()
ns = p.parse_args(args)
ns.args = args
ns.services = services
set_envvars(ns)
run_application(ns)
if __name__ == '__main__':
main()