diff options
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/hacking.py | 7 | ||||
-rwxr-xr-x | tools/make-dist-tarball | 25 | ||||
-rwxr-xr-x | tools/make-tarball | 35 | ||||
-rwxr-xr-x | tools/mock-meta.py | 65 | ||||
-rwxr-xr-x | tools/read-dependencies | 80 | ||||
-rwxr-xr-x | tools/read-version | 101 |
6 files changed, 163 insertions, 150 deletions
diff --git a/tools/hacking.py b/tools/hacking.py index d0c27d25..a2e6e829 100755 --- a/tools/hacking.py +++ b/tools/hacking.py @@ -23,11 +23,8 @@ built on top of pep8.py import inspect import logging -import os import re import sys -import tokenize -import warnings import pep8 @@ -158,7 +155,7 @@ def add_cloud(): if not inspect.isfunction(function): continue if name.startswith("cloud_"): - exec("pep8.%s = %s" % (name, name)) + exec("pep8.%s = %s" % (name, name)) # pylint: disable=W0122 if __name__ == "__main__": # NOVA based 'hacking.py' error codes start with an N @@ -167,7 +164,7 @@ if __name__ == "__main__": pep8.current_file = current_file pep8.readlines = readlines try: - pep8._main() + pep8._main() # pylint: disable=W0212 finally: if len(_missingImport) > 0: print >> sys.stderr, ("%i imports missing in this test environment" diff --git a/tools/make-dist-tarball b/tools/make-dist-tarball new file mode 100755 index 00000000..622283bd --- /dev/null +++ b/tools/make-dist-tarball @@ -0,0 +1,25 @@ +#!/bin/sh + +Usage() { + cat <<EOF +Usage: ${0##*/} version + make a tarball of 'version' + must be in a bzr directory, and 'version' must be a tag + +EOF +} + +topdir="../$PWD" +tag=${1} + +[ -n "$tag" ] || { Usage 1>&2 ; exit 1; } + +tmpd=$(mktemp -d ); +trap "rm -Rf '${tmpd}'" 0 + +out=${topdir}/cloud-init-${tag}.tar.gz + +cd ${tmpd} && + bzr branch -r "tag:${tag}" "${topdir}" ./cloud-init-${tag} && + tar czf "${out}" cloud-init-${tag}/ --exclude cloud-init-${tag}/.bzr && + echo "Wrote ${out}" diff --git a/tools/make-tarball b/tools/make-tarball new file mode 100755 index 00000000..47979f5b --- /dev/null +++ b/tools/make-tarball @@ -0,0 +1,35 @@ +#!/bin/sh +set -e + +find_root() { + local topd + if [ -z "${CLOUD_INIT_TOP_D}" ]; then + topd=$(cd "$(dirname "${0}")" && cd .. && pwd) + else + topd=$(cd "${CLOUD_INIT_TOP_D}" && pwd) + fi + [ $? -eq 0 -a -f "${topd}/setup.py" ] || return + ROOT_DIR="$topd" +} + +if ! find_root; then + echo "Unable to locate 'setup.py' file that should" \ + "exist in the cloud-init root directory." 1>&2 + exit 1; +fi + +if [ ! -z "$1" ]; then + ARCHIVE_FN="$1" +else + REVNO=$(bzr revno $ROOT_DIR) + VERSION=$($ROOT_DIR/tools/read-version) + ARCHIVE_FN="$PWD/cloud-init-$VERSION~bzr$REVNO.tar.gz" +fi + +FILES=$(cd $ROOT_DIR && bzr ls --versioned --recursive) +echo "$FILES" | tar czf $ARCHIVE_FN \ + -C "$ROOT_DIR" \ + --transform "s,^,cloud-init-$VERSION~bzr$REVNO/," \ + --no-recursion --files-from - + +echo "$ARCHIVE_FN" diff --git a/tools/mock-meta.py b/tools/mock-meta.py index 4548e4ae..78838f64 100755 --- a/tools/mock-meta.py +++ b/tools/mock-meta.py @@ -1,15 +1,15 @@ #!/usr/bin/python # Provides a somewhat random, somewhat compat, somewhat useful mock version of -# -# http://docs.amazonwebservices.com/AWSEC2/2007-08-29/DeveloperGuide/AESDG-chapter-instancedata.html +# http://docs.amazonwebservices.com +# /AWSEC2/2007-08-29/DeveloperGuide/AESDG-chapter-instancedata.htm """ To use this to mimic the EC2 metadata service entirely, run it like: # Where 'eth0' is *some* interface. sudo ifconfig eth0:0 169.254.169.254 netmask 255.255.255.255 - sudo ./mock-meta -a 169.254.169.254 -p 80 + sudo ./mock-meta.py -a 169.254.169.254 -p 80 Then: wget -q http://169.254.169.254/latest/meta-data/instance-id -O -; echo @@ -23,7 +23,7 @@ import json import logging import os import random -import string +import string # pylint: disable=W0402 import sys import yaml @@ -84,12 +84,12 @@ META_CAPABILITIES = [ PUB_KEYS = { 'brickies': [ ('ssh-rsa ' - 'AAAAB3NzaC1yc2EAAAABIwAAAQEA3I7VUf2l5gSn5uavROsc5HRDpZdQueUq5ozemNSj8T' - '7enqKHOEaFoU2VoPgGEWC9RyzSQVeyD6s7APMcE82EtmW4skVEgEGSbDc1pvxzxtchBj78' - 'hJP6Cf5TCMFSXw+Fz5rF1dR23QDbN1mkHs7adr8GW4kSWqU7Q7NDwfIrJJtO7Hi42GyXtv' - 'EONHbiRPOe8stqUly7MvUoN+5kfjBM8Qqpfl2+FNhTYWpMfYdPUnE7u536WqzFmsaqJctz' - '3gBxH9Ex7dFtrxR4qiqEr9Qtlu3xGn7Bw07/+i1D+ey3ONkZLN+LQ714cgj8fRS4Hj29SC' - 'mXp5Kt5/82cD/VN3NtHw== brickies'), + 'AAAAB3NzaC1yc2EAAAABIwAAAQEA3I7VUf2l5gSn5uavROsc5HRDpZdQueUq5ozemN' + 'Sj8T7enqKHOEaFoU2VoPgGEWC9RyzSQVeyD6s7APMcE82EtmW4skVEgEGSbDc1pvxz' + 'xtchBj78hJP6Cf5TCMFSXw+Fz5rF1dR23QDbN1mkHs7adr8GW4kSWqU7Q7NDwfIrJJ' + 'tO7Hi42GyXtvEONHbiRPOe8stqUly7MvUoN+5kfjBM8Qqpfl2+FNhTYWpMfYdPUnE7' + 'u536WqzFmsaqJctz3gBxH9Ex7dFtrxR4qiqEr9Qtlu3xGn7Bw07/+i1D+ey3ONkZLN' + '+LQ714cgj8fRS4Hj29SCmXp5Kt5/82cD/VN3NtHw== brickies'), '', ], } @@ -234,7 +234,7 @@ class MetaDataHandler(object): elif action == 'public-keys': nparams = params[1:] # This is a weird kludge, why amazon why!!! - # public-keys is messed up, a list of /latest/meta-data/public-keys/ + # public-keys is messed up, list of /latest/meta-data/public-keys/ # shows something like: '0=brickies' # but a GET to /latest/meta-data/public-keys/0=brickies will fail # you have to know to get '/latest/meta-data/public-keys/0', then @@ -248,7 +248,8 @@ class MetaDataHandler(object): key_id = int(mybe_key) key_name = key_ids[key_id] except: - raise WebException(httplib.BAD_REQUEST, "Unknown key id %r" % mybe_key) + raise WebException(httplib.BAD_REQUEST, + "Unknown key id %r" % mybe_key) # Extract the possible sub-params result = traverse(nparams[1:], { "openssh-key": "\n".join(avail_keys[key_name]), @@ -303,7 +304,7 @@ class UserDataHandler(object): blob = "\n".join(lines) return blob.strip() - def get_data(self, params, who, **kwargs): + def get_data(self, params, who, **kwargs): # pylint: disable=W0613 if not params: return self._get_user_blob(who=who) return NOT_IMPL_RESPONSE @@ -323,14 +324,12 @@ class Ec2Handler(BaseHTTPRequestHandler): versions = sorted(versions) return "\n".join(versions) - def log_message(self, format, *args): - msg = "%s - %s" % (self.address_string(), format % (args)) + def log_message(self, fmt, *args): + msg = "%s - %s" % (self.address_string(), fmt % (args)) log.info(msg) def _find_method(self, path): # Puke! (globals) - global meta_fetcher - global user_fetcher func_mapping = { 'user-data': user_fetcher.get_data, 'meta-data': meta_fetcher.get_data, @@ -341,12 +340,14 @@ class Ec2Handler(BaseHTTPRequestHandler): return self._get_versions date = segments[0].strip().lower() if date not in self._get_versions(): - raise WebException(httplib.BAD_REQUEST, "Unknown version format %r" % date) + raise WebException(httplib.BAD_REQUEST, + "Unknown version format %r" % date) if len(segments) < 2: raise WebException(httplib.BAD_REQUEST, "No action provided") look_name = segments[1].lower() if look_name not in func_mapping: - raise WebException(httplib.BAD_REQUEST, "Unknown requested data %r" % look_name) + raise WebException(httplib.BAD_REQUEST, + "Unknown requested data %r" % look_name) base_func = func_mapping[look_name] who = self.address_string() ip_from = self.client_address[0] @@ -371,7 +372,8 @@ class Ec2Handler(BaseHTTPRequestHandler): self.send_response(httplib.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)) + log.info("Sending data (len=%s):\n%s", len(data), + format_text(data)) self.end_headers() self.wfile.write(data) except RuntimeError as e: @@ -389,22 +391,25 @@ class Ec2Handler(BaseHTTPRequestHandler): self._do_response() -def setup_logging(log_level, format='%(levelname)s: @%(name)s : %(message)s'): +def setup_logging(log_level, fmt='%(levelname)s: @%(name)s : %(message)s'): root_logger = logging.getLogger() console_logger = logging.StreamHandler(sys.stdout) - console_logger.setFormatter(logging.Formatter(format)) + console_logger.setFormatter(logging.Formatter(fmt)) root_logger.addHandler(console_logger) root_logger.setLevel(log_level) def extract_opts(): parser = OptionParser() - parser.add_option("-p", "--port", dest="port", action="store", type=int, default=80, - help="port from which to serve traffic (default: %default)", metavar="PORT") - parser.add_option("-a", "--addr", dest="address", action="store", type=str, default='0.0.0.0', - help="address from which to serve traffic (default: %default)", metavar="ADDRESS") - parser.add_option("-f", '--user-data-file', dest='user_data_file', action='store', - help="user data filename to serve back to incoming requests", metavar='FILE') + parser.add_option("-p", "--port", dest="port", action="store", type=int, + default=80, metavar="PORT", + 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", + help="address from which to serve traffic (default: %default)") + parser.add_option("-f", '--user-data-file', dest='user_data_file', + action='store', metavar='FILE', + help="user data filename to serve back to incoming requests") (options, args) = parser.parse_args() out = dict() out['extra'] = args @@ -420,8 +425,8 @@ def extract_opts(): def setup_fetchers(opts): - global meta_fetcher - global user_fetcher + global meta_fetcher # pylint: disable=W0603 + global user_fetcher # pylint: disable=W0603 meta_fetcher = MetaDataHandler(opts) user_fetcher = UserDataHandler(opts) diff --git a/tools/read-dependencies b/tools/read-dependencies index 72e1e095..4c88aa87 100755 --- a/tools/read-dependencies +++ b/tools/read-dependencies @@ -1,45 +1,35 @@ -#!/usr/bin/python -# vi: ts=4 expandtab - -import os -import sys -import re - - -def parse_requires(fn): - requires = [] - with open(fn, 'r') as fh: - lines = fh.read().splitlines() - for line in lines: - line = line.strip() - if not line or line[0] == '#': - continue - else: - requires.append(line) - return requires - - -def find_requires(args): - p_files = [] - if args: - p_files.append(args[0]) - p_files.append(os.path.join(os.pardir, "Requires")) - p_files.append(os.path.join(os.getcwd(), 'Requires')) - found = None - for fn in p_files: - if os.path.isfile(fn): - found = fn - break - return found - - -if __name__ == '__main__': - run_args = sys.argv[1:] - fn = find_requires(run_args) - if not fn: - sys.stderr.write("'Requires' file not found!\n") - sys.exit(1) - else: - deps = parse_requires(fn) - for entry in deps: - print entry +#!/bin/sh + +set -e + +find_root() { + local topd + if [ -z "${CLOUD_INIT_TOP_D}" ]; then + topd=$(cd "$(dirname "${0}")" && cd .. && pwd) + else + topd=$(cd "${CLOUD_INIT_TOP_D}" && pwd) + fi + [ $? -eq 0 -a -f "${topd}/setup.py" ] || return + ROOT_DIR="$topd" +} + +if ! find_root; then + echo "Unable to locate 'setup.py' file that should" \ + "exist in the cloud-init root directory." 1>&2 + exit 1; +fi + +REQUIRES="$ROOT_DIR/Requires" + +if [ ! -e "$REQUIRES" ] +then + echo "Unable to find 'Requires' file located at $REQUIRES" + exit 1 +fi + +# Filter out comments and empty liens +DEPS=$(cat $REQUIRES | grep -Pv "^\s*#" | grep -Pv '^\s*$') +echo "$DEPS" | sort -d -f + + + diff --git a/tools/read-version b/tools/read-version index e6167a2c..323357fe 100755 --- a/tools/read-version +++ b/tools/read-version @@ -1,70 +1,31 @@ -#!/usr/bin/python -# vi: ts=4 expandtab - -import os -import sys -import re - -from distutils import version as ver - -possible_topdir = os.path.normpath(os.path.join(os.path.abspath( - sys.argv[0]), os.pardir, os.pardir)) -if os.path.exists(os.path.join(possible_topdir, "cloudinit", "__init__.py")): - sys.path.insert(0, possible_topdir) - -from cloudinit import version as cver - -def parse_versions(fn): - with open(fn, 'r') as fh: - lines = fh.read().splitlines() - versions = [] - for line in lines: - line = line.strip() - if line.startswith("-") or not line: - continue - if not re.match(r"[\d]", line): - continue - line = line.strip(":") - if (re.match(r"^[\d+]\.[\d+]\.[\d+]$", line) or - re.match(r"^[\d+]\.[\d+]$", line)): - versions.append(line) - return versions - -def find_changelog(args): - p_files = [] - if args: - p_files.append(args[0]) - p_files.append(os.path.join(os.pardir, "ChangeLog")) - p_files.append(os.path.join(os.getcwd(), 'ChangeLog')) - found = None - for fn in p_files: - if os.path.isfile(fn): - found = fn - break - return found - - -if __name__ == '__main__': - run_args = sys.argv[1:] - fn = find_changelog(run_args) - if not fn: - sys.stderr.write("'ChangeLog' file not found!\n") - sys.exit(1) - else: - versions = parse_versions(fn) - if not versions: - sys.stderr.write("No versions found in %s!\n" % (fn)) - sys.exit(1) - else: - # Check that the code version is the same - # as the version we found! - ch_ver = versions[0].strip() - code_ver = cver.version() - ch_ver_obj = ver.StrictVersion(ch_ver) - if ch_ver_obj != code_ver: - sys.stderr.write(("Code version %s does not match" - " changelog version %s\n") % - (code_ver, ch_ver_obj)) - sys.exit(1) - sys.stdout.write(ch_ver) - sys.exit(0) +#!/bin/sh + +set -e + +find_root() { + local topd + if [ -z "${CLOUD_INIT_TOP_D}" ]; then + topd=$(cd "$(dirname "${0}")" && cd .. && pwd) + else + topd=$(cd "${CLOUD_INIT_TOP_D}" && pwd) + fi + [ $? -eq 0 -a -f "${topd}/setup.py" ] || return + ROOT_DIR="$topd" +} + +if ! find_root; then + echo "Unable to locate 'setup.py' file that should" \ + "exist in the cloud-init root directory." 1>&2 + exit 1; +fi + +CHNG_LOG="$ROOT_DIR/ChangeLog" + +if [ ! -e "$CHNG_LOG" ] +then + echo "Unable to find 'ChangeLog' file located at $CHNG_LOG" + exit 1 +fi + +VERSION=$(grep -P "\d+.\d+.\d+:" $CHNG_LOG | cut -f1 -d ":" | head -n 1) +echo $VERSION |