3
from __future__ import print_function
5
from argparse import ArgumentParser
11
STREAM_INDEX = "http://cloud-images.ubuntu.com/releases/streams/v1/index.json"
12
DAILY_INDEX = "http://cloud-images.ubuntu.com/daily/streams/v1/index.json"
13
ENDPOINT_TEMPLATE = "endpoint~ec2.{region}.amazonaws.com"
22
def query_ami(series, arch, region=None, stream='released', **kwargs):
23
"""Lookup newest ami for given series and arch, plus optional params."""
30
sstream_params = ["arch=" + arch, "release=" + series]
31
for k in sorted(DEFAULT_PARAMS):
32
v = kwargs.pop(k, DEFAULT_PARAMS[k])
36
sstream_params.append("{}={}".format(k, v))
38
raise ValueError("Unknown kwargs: {}".format(", ".join(kwargs)))
39
endpoint_info = ENDPOINT_TEMPLATE.format(region=region)
40
cmdline = ["sstream-query", index, endpoint_info]
41
cmdline.extend(sstream_params)
42
cmdline.extend(["--output-format", "%(id)s"])
44
out = subprocess.check_output(cmdline)
45
except OSError as err:
46
if err.errno == errno.ENOENT:
47
raise ValueError("sstream-query tool not found, is it installed?")
49
ami_ids = out.split("\n")
50
if not ami_ids or not ami_ids[0]:
51
raise ValueError("No amis for {} in region={}".format(
52
" ".join(sstream_params), region))
56
def parse_args(args=None):
57
parser = ArgumentParser('Get an up to date ami.')
58
parser.add_argument('series', help='Ubuntu series for image')
59
parser.add_argument('arch', help='Architecture for image')
60
parser.add_argument('--stream', choices=['released', 'daily'],
62
help='The stream to select the image from')
63
parser.add_argument('--region', help='Region to retrieve image for')
64
parser.add_argument('--label')
65
parser.add_argument('--root-store')
66
parser.add_argument('--virt')
67
return parser.parse_args(args)
73
print(query_ami(args.series, args.arch, region=args.region,
74
stream=args.stream, label=args.label,
75
root_store=args.root_store, virt=args.virt))
76
except ValueError as err:
77
print(err, file=sys.stderr)
82
if __name__ == '__main__':