Search code examples
python-3.xopenshifttornado

Cannot configure Openshift 3 with Tornado server


I'm trying to migrate my Tornado app from Openshift2 to Openshift3 and don't know how to actually setup route, service and etc.

First I'm creating simple Python 3.5 application on RHEL 7. In advanced options I'm set up git repo, add APP_FILE variable. Cloning and app build finishing successfully. And I executed curl localhost:8080 in web console terminal, it seems working.

But service root link returns me this message:

Application is not available

The application is currently not serving requests at this endpoint. It may not have been started or is still starting.

I actually not changed anything in route and service configuration, I guess what I should set it up somehow. But now haven't any thoughts how to do this.

Here is my wsgi.py:

#!/usr/bin/env python
import importlib.machinery

if __name__ == '__main__':
    print('Executing __main__ ...')
    ip = 'localhost'
    port = 8080
    app = importlib.machinery.SourceFileLoader("application", 'wsgi/application').load_module("application")

    from wsgiref.simple_server import make_server
    httpd = make_server(ip, port, app.application)
    print('Starting server on http://{0}:{1}'.format(ip, port))
    httpd.serve_forever()

And application:

#!/usr/bin/env python
import os
import sys

import tornado.wsgi
from wsgi.openshift import handlers

if 'OPENSHIFT_REPO_DIR' in os.environ:
    sys.path.append(os.path.join(os.environ['OPENSHIFT_REPO_DIR'], 'wsgi',))
    virtenv = os.environ['OPENSHIFT_PYTHON_DIR'] + '/virtenv/venv'
    os.environ['PYTHON_EGG_CACHE'] = os.path.join(virtenv, 'lib/python3.3/site-packages')
    virtualenv = os.path.join(virtenv, 'bin/activate_this.py')
    try:
        exec(compile(open(virtualenv).read(), virtualenv, 'exec'), dict(__file__=virtualenv))
    except IOError:
        pass

 settings = {
     'cookie_secret': 'TOP_SECRET',
     'static_path' : os.path.join(os.getcwd(), 'wsgi/static'),
     'template_path' : os.path.join(os.getcwd(), 'wsgi/templates'),
     'xsrf_cookies': False,
     'debug': True,
     'login_url': '/login',
 }

application = tornado.wsgi.WSGIApplication(handlers, **settings)

EDIT:

Here is some console oc output:

> oc status
In project photoservice on server https://api.starter-us-west-1.openshift.com:443

http://photoservice-photoservice.a3c1.starter-us-west-1.openshiftapps.com to pod port 8080-tcp (svc/photoservice)
  dc/photoservice deploys istag/photoservice:latest <-
    bc/photoservice source builds git@bitbucket.org:ashchuk/photoservice.git#master on openshift/python:3.5
    deployment #1 deployed 3 minutes ago - 1 pod

View details with 'oc describe <resource>/<name>' or list everything with 'oc get all'.

> oc get routes
NAME           HOST/PORT                                                            PATH      SERVICES       PORT       TERMINATION   WILDCARD
photoservice   photoservice-photoservice.a3c1.starter-us-west-1.openshiftapps.com             photoservice   8080-tcp                 None

Solution

  • Just changed ip = 'localhost' to ip = '0.0.0.0' as Graham said and this worked.

    Here is an explanation:

    If you use localhost or 127.0.0.1 it will only accept requests from the network loopback device. This can only be connected to by clients running on the same host (container). You need to listen on all network interfaces, indicated by 0.0.0.0 to be able to accept requests from outside of the host (container). If you don't do that, OpenShift cannot connect to your application to proxy requests to it.