This commit contains back end changes necessary to load programs from the catalog in all contexts. The existing program munging utility is applied as late as possible to avoid conflating this work with changes to the front end; those will be made separately. ECOM-4422
109 lines
2.9 KiB
Python
109 lines
2.9 KiB
Python
"""
|
|
Command-line utility to start a stub service.
|
|
"""
|
|
import sys
|
|
import time
|
|
import logging
|
|
|
|
from .comments import StubCommentsService
|
|
from .ecommerce import StubEcommerceService
|
|
from .xqueue import StubXQueueService
|
|
from .youtube import StubYouTubeService
|
|
from .lti import StubLtiService
|
|
from .video_source import VideoSourceHttpService
|
|
from .edxnotes import StubEdxNotesService
|
|
from .catalog import StubCatalogService
|
|
|
|
|
|
USAGE = "USAGE: python -m stubs.start SERVICE_NAME PORT_NUM [CONFIG_KEY=CONFIG_VAL, ...]"
|
|
|
|
SERVICES = {
|
|
'xqueue': StubXQueueService,
|
|
'youtube': StubYouTubeService,
|
|
'comments': StubCommentsService,
|
|
'lti': StubLtiService,
|
|
'video': VideoSourceHttpService,
|
|
'edxnotes': StubEdxNotesService,
|
|
'ecommerce': StubEcommerceService,
|
|
'catalog': StubCatalogService,
|
|
}
|
|
|
|
# Log to stdout, including debug messages
|
|
logging.basicConfig(level=logging.DEBUG, format="%(levelname)s %(message)s")
|
|
|
|
|
|
def get_args():
|
|
"""
|
|
Parse arguments, returning tuple of `(service_name, port_num, config_dict)`.
|
|
Exits with a message if arguments are invalid.
|
|
"""
|
|
if len(sys.argv) < 3:
|
|
print USAGE
|
|
sys.exit(1)
|
|
|
|
service_name = sys.argv[1]
|
|
port_num = sys.argv[2]
|
|
config_dict = _parse_config_args(sys.argv[3:])
|
|
|
|
if service_name not in SERVICES:
|
|
print "Unrecognized service '{0}'. Valid choices are: {1}".format(
|
|
service_name, ", ".join(SERVICES.keys()))
|
|
sys.exit(1)
|
|
|
|
try:
|
|
port_num = int(port_num)
|
|
if port_num < 0:
|
|
raise ValueError
|
|
|
|
except ValueError:
|
|
print "Port '{0}' must be a positive integer".format(port_num)
|
|
sys.exit(1)
|
|
|
|
return service_name, port_num, config_dict
|
|
|
|
|
|
def _parse_config_args(args):
|
|
"""
|
|
Parse stub configuration arguments, which are strings of the form "KEY=VAL".
|
|
`args` is a list of arguments from the command line.
|
|
Any argument that does not match the "KEY=VAL" format will be logged and skipped.
|
|
|
|
Returns a dictionary with the configuration keys and values.
|
|
"""
|
|
config_dict = dict()
|
|
for config_str in args:
|
|
try:
|
|
components = config_str.split('=')
|
|
if len(components) >= 2:
|
|
config_dict[components[0]] = "=".join(components[1:])
|
|
|
|
except:
|
|
print "Warning: could not interpret config value '{0}'".format(config_str)
|
|
|
|
return config_dict
|
|
|
|
|
|
def main():
|
|
"""
|
|
Start a server; shut down on keyboard interrupt signal.
|
|
"""
|
|
service_name, port_num, config_dict = get_args()
|
|
print "Starting stub service '{0}' on port {1}...".format(service_name, port_num)
|
|
|
|
server = SERVICES[service_name](port_num=port_num)
|
|
server.config.update(config_dict)
|
|
|
|
try:
|
|
while True:
|
|
time.sleep(1)
|
|
|
|
except KeyboardInterrupt:
|
|
print "Stopping stub service..."
|
|
|
|
finally:
|
|
server.shutdown()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|