summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rwxr-xr-xtools/hacking.py7
-rwxr-xr-xtools/make-dist-tarball25
-rwxr-xr-xtools/make-tarball35
-rwxr-xr-xtools/mock-meta.py65
-rwxr-xr-xtools/read-dependencies80
-rwxr-xr-xtools/read-version101
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