Skip to content

Commit

Permalink
tools/mock-meta: support python2 or python3 and ipv6 in both.
Browse files Browse the repository at this point in the history
Fix mock-meta to work with python2 or python3.
Additionally, it will now listen to ipv6 connections, where
previously it would only work with ipv4.
  • Loading branch information
smoser committed Jan 25, 2017
1 parent 65e01b4 commit dc6e7b4
Showing 1 changed file with 21 additions and 11 deletions.
32 changes: 21 additions & 11 deletions tools/mock-meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,24 @@
"""

import functools
import httplib
import json
import logging
import os
import socket
import random
import string
import sys
import yaml

from optparse import OptionParser

from BaseHTTPServer import (HTTPServer, BaseHTTPRequestHandler)
try:
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
import httplib as hclient
except ImportError:
from http.server import HTTPServer, BaseHTTPRequestHandler
from http import client as hclient


log = logging.getLogger('meta-server')

Expand Down Expand Up @@ -183,6 +189,10 @@ def get_ssh_keys():
return keys


class HTTPServerV6(HTTPServer):
address_family = socket.AF_INET6


class MetaDataHandler(object):

def __init__(self, opts):
Expand Down Expand Up @@ -250,7 +260,7 @@ def get_data(self, params, who, **kwargs):
key_id = int(mybe_key)
key_name = key_ids[key_id]
except:
raise WebException(httplib.BAD_REQUEST,
raise WebException(hclient.BAD_REQUEST,
"Unknown key id %r" % mybe_key)
# Extract the possible sub-params
result = traverse(nparams[1:], {
Expand Down Expand Up @@ -342,13 +352,13 @@ def _find_method(self, path):
return self._get_versions
date = segments[0].strip().lower()
if date not in self._get_versions():
raise WebException(httplib.BAD_REQUEST,
raise WebException(hclient.BAD_REQUEST,
"Unknown version format %r" % date)
if len(segments) < 2:
raise WebException(httplib.BAD_REQUEST, "No action provided")
raise WebException(hclient.BAD_REQUEST, "No action provided")
look_name = segments[1].lower()
if look_name not in func_mapping:
raise WebException(httplib.BAD_REQUEST,
raise WebException(hclient.BAD_REQUEST,
"Unknown requested data %r" % look_name)
base_func = func_mapping[look_name]
who = self.address_string()
Expand All @@ -371,16 +381,16 @@ def _do_response(self):
data = func()
if not data:
data = ''
self.send_response(httplib.OK)
self.send_response(hclient.OK)
self.send_header("Content-Type", "binary/octet-stream")
self.send_header("Content-Length", len(data))
log.info("Sending data (len=%s):\n%s", len(data),
format_text(data))
self.end_headers()
self.wfile.write(data)
self.wfile.write(data.encode())
except RuntimeError as e:
log.exception("Error somewhere in the server.")
self.send_error(httplib.INTERNAL_SERVER_ERROR, message=str(e))
self.send_error(hclient.INTERNAL_SERVER_ERROR, message=str(e))
except WebException as e:
code = e.code
log.exception(str(e))
Expand Down Expand Up @@ -408,7 +418,7 @@ def extract_opts():
help=("port from which to serve traffic"
" (default: %default)"))
parser.add_option("-a", "--addr", dest="address", action="store", type=str,
default='0.0.0.0', metavar="ADDRESS",
default='::', metavar="ADDRESS",
help=("address from which to serve traffic"
" (default: %default)"))
parser.add_option("-f", '--user-data-file', dest='user_data_file',
Expand Down Expand Up @@ -444,7 +454,7 @@ def run_server():
setup_fetchers(opts)
log.info("CLI opts: %s", opts)
server_address = (opts['address'], opts['port'])
server = HTTPServer(server_address, Ec2Handler)
server = HTTPServerV6(server_address, Ec2Handler)
sa = server.socket.getsockname()
log.info("Serving ec2 metadata on %s using port %s ...", sa[0], sa[1])
server.serve_forever()
Expand Down

0 comments on commit dc6e7b4

Please sign in to comment.