#!/usr/bin/env python3
"""Run the Landscape message server."""

import sys

from zope.component import getUtility, provideUtility

from twisted.internet import reactor
from twisted.application.service import Application

from twisted.application import strports

from storm.twisted.transact import Transactor

from canonical.oops.interfaces import IOOPSManager
from canonical.amqp.message.interfaces import IPublisher
from canonical.twisted.site import MaxMemorySite

from canonical.landscape.message.loadshaper import setup_load_shaper
from canonical.landscape.message.resource import MessageSystemResource
from canonical.landscape.attachment.resource import AttachmentResource
from canonical.landscape.setup import setup_broker, load_config, configure_oops
from canonical.landscape.scripts.message_server import run


if __name__ == "__main__":
    run()

config = load_config("message-server")
message_server_config = config.get("message-server")
global_config = config.get("global")

# XXX This is a temporary duplicate of code in
# c.l.application.run_application, but should be common to all
# services. Let's make it shared and used in load_config() as soon as
# we migrate appserver to use load_config()
sys.setswitchinterval(message_server_config.get("check-interval", 1200))
if "oops-key" in message_server_config:
    oops_manager = configure_oops("message-server", config)
    provideUtility(oops_manager, IOOPSManager)
# XXX duplication ends here.

application = Application("message-server")

threadpool = reactor.getThreadPool()
transactor = Transactor(threadpool)
root = MessageSystemResource(transactor)
attachment = AttachmentResource(transactor)
root.putChild(b"attachment", attachment)

site = MaxMemorySite(root, max_memory_mib=int(global_config.get("max-service-memory", 0)))
service = strports.service("tcp:%s" % message_server_config["port"], site)
service.setServiceParent(application)

setup_load_shaper(config.get("load-shaper"))
publisher = getUtility(IPublisher)
setup_broker(config, publisher.connected, publisher.disconnected, application)
