add web_server.py for testing web content

Actually testing the web content for elastic recheck was a bit
annoying because it involved manually downloading json files and
modifying html files to point at a local server. This means that we
often pushed changes without testing them, sometimes with not so great
results.

This uses the stdlib BaseHTTPServer to build a fake local server that
runs on port 8001 and provides a local experience that pretends pretty
damn hard to be like hitting the live site. All local files are served
up statically. All references to upstream .json files are rewriten
into local server urls, and fetching of .json files that we don't have
in a local tree are automatically proxied out to live data on
status.openstack.org.

Change-Id: I4ae0fc67f8ab440153fc7edca5af77913cc448a7
This commit is contained in:
Sean Dague 2015-04-29 16:34:13 -04:00
parent 8ff5575c5e
commit 9d80eef952
1 changed files with 104 additions and 0 deletions

104
web_server.py Executable file
View File

@ -0,0 +1,104 @@
#!/usr/bin/env python
#
# Copyright 2015 Hewlett-Packard Development Company, L.P.
#
# 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.
"""
This is a simple test server that serves up the web content locally
as if it was a working remote server. It also proxies all the live
date/*.json files into the local test server, so that the Ajax async
loading works without hitting Cross Site Scripting violations.
"""
import argparse
import BaseHTTPServer
import os.path
import urllib2
SERVER_UPSTREAM = "http://status.openstack.org/elastic-recheck"
class ERHandler(BaseHTTPServer.BaseHTTPRequestHandler):
"""A request handler to create a magic local ER server"""
def do_GET(self):
# redirect to elastic recheck page
if self.path == "/":
self.path = "/index.html"
# if the file exists locally, we'll serve it up directly
fname = "web/share" + self.path
if os.path.isfile(fname):
self.send_response(200, "Success")
self.end_headers()
with open(fname) as f:
for line in f.readlines():
# in order for us to fetch the .json files, we
# need to have them served from our server,
# otherwise browser cross site scripting
# protections kick in. So rewrite content on the
# fly for those redirects.
line = line.replace(
"status.openstack.org/elastic-recheck",
"localhost:%s" % self.server.server_port)
self.wfile.write(line)
return
# If you've not built local data to test with, instead grab
# the data off the production server on the fly and serve it
# up from our server.
if self.path.startswith("/data/"):
try:
response = urllib2.urlopen("%s%s" %
(SERVER_UPSTREAM, self.path))
self.send_response(200, "Success")
self.end_headers()
self.wfile.write(response.read())
except urllib2.HTTPError as e:
self.send_response(e.code)
self.end_headers()
self.wfile.write(e.read())
return
# Fall through for paths we don't understand
print "Unknown path requested: %s" % self.path
def parse_opts():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('-p', '--port',
help='port to bind to [default: 8001]',
type=int,
default=8001)
return parser.parse_args()
def main():
opts = parse_opts()
server_address = ('', opts.port)
httpd = BaseHTTPServer.HTTPServer(server_address, ERHandler)
print "Test Server is running at http://localhost:%s" % opts.port
print "Ctrl-C to exit"
print
while True:
httpd.handle_request()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print "\n"
print "Thanks for testing! Please come again."