| #!/usr/bin/env python |
| # Copyright 2017 Red Hat, Inc. |
| # |
| # 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 logging |
| import signal |
| import sys |
| |
| import zuul.cmd |
| import zuul.lib.fingergw |
| |
| from zuul.lib.config import get_default |
| |
| |
| class FingerGatewayApp(zuul.cmd.ZuulDaemonApp): |
| ''' |
| Class for the daemon that will distribute any finger requests to the |
| appropriate Zuul executor handling the specified build UUID. |
| ''' |
| app_name = 'fingergw' |
| app_description = 'The Zuul finger gateway.' |
| |
| def __init__(self): |
| super(FingerGatewayApp, self).__init__() |
| self.gateway = None |
| |
| def createParser(self): |
| parser = super(FingerGatewayApp, self).createParser() |
| parser.add_argument('command', |
| choices=zuul.lib.fingergw.COMMANDS, |
| nargs='?') |
| return parser |
| |
| def parseArguments(self, args=None): |
| super(FingerGatewayApp, self).parseArguments() |
| if self.args.command: |
| self.args.nodaemon = True |
| |
| def run(self): |
| ''' |
| Main entry point for the FingerGatewayApp. |
| |
| Called by the main() method of the parent class. |
| ''' |
| if self.args.command in zuul.lib.fingergw.COMMANDS: |
| self.send_command(self.args.command) |
| sys.exit(0) |
| |
| self.setup_logging('fingergw', 'log_config') |
| self.log = logging.getLogger('zuul.fingergw') |
| |
| # Get values from configuration file |
| host = get_default(self.config, 'fingergw', 'listen_address', '::') |
| port = int(get_default(self.config, 'fingergw', 'port', 79)) |
| user = get_default(self.config, 'fingergw', 'user', 'zuul') |
| cmdsock = get_default( |
| self.config, 'fingergw', 'command_socket', |
| '/var/lib/zuul/%s.socket' % self.app_name) |
| gear_server = get_default(self.config, 'gearman', 'server') |
| gear_port = get_default(self.config, 'gearman', 'port', 4730) |
| ssl_key = get_default(self.config, 'gearman', 'ssl_key') |
| ssl_cert = get_default(self.config, 'gearman', 'ssl_cert') |
| ssl_ca = get_default(self.config, 'gearman', 'ssl_ca') |
| |
| self.gateway = zuul.lib.fingergw.FingerGateway( |
| (gear_server, gear_port, ssl_key, ssl_cert, ssl_ca), |
| (host, port), |
| user, |
| cmdsock, |
| self.getPidFile(), |
| ) |
| |
| self.log.info('Starting Zuul finger gateway app') |
| self.gateway.start() |
| |
| if self.args.nodaemon: |
| # NOTE(Shrews): When running in non-daemon mode, although sending |
| # the 'stop' command via the command socket will shutdown the |
| # gateway, it's still necessary to Ctrl+C to stop the app. |
| while True: |
| try: |
| signal.pause() |
| except KeyboardInterrupt: |
| print("Ctrl + C: asking gateway to exit nicely...\n") |
| self.stop() |
| break |
| else: |
| self.gateway.wait() |
| |
| self.log.info('Stopped Zuul finger gateway app') |
| |
| def stop(self): |
| if self.gateway: |
| self.gateway.stop() |
| |
| |
| def main(): |
| FingerGatewayApp().main() |