~abentley/juju-ci-tools/client-from-config-4

« back to all changes in this revision

Viewing changes to get_ami.py

  • Committer: Aaron Bentley
  • Date: 2014-02-24 17:18:29 UTC
  • mto: This revision was merged to the branch mainline in revision 252.
  • Revision ID: aaron.bentley@canonical.com-20140224171829-sz644yhoygu7m9dm
Use tags to identify and shut down instances.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/python
2
 
 
3
 
from __future__ import print_function
4
 
 
5
 
from argparse import ArgumentParser
6
 
import errno
7
 
import subprocess
8
 
import sys
9
 
 
10
 
 
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"
14
 
 
15
 
DEFAULT_PARAMS = {
16
 
    "label": None,
17
 
    "virt": "pv",
18
 
    "root_store": "ssd",
19
 
}
20
 
 
21
 
 
22
 
def query_ami(series, arch, region=None, stream='released', **kwargs):
23
 
    """Lookup newest ami for given series and arch, plus optional params."""
24
 
    if region is None:
25
 
        region = "us-east-1"
26
 
    if stream == 'daily':
27
 
        index = DAILY_INDEX
28
 
    else:
29
 
        index = STREAM_INDEX
30
 
    sstream_params = ["arch=" + arch, "release=" + series]
31
 
    for k in sorted(DEFAULT_PARAMS):
32
 
        v = kwargs.pop(k, DEFAULT_PARAMS[k])
33
 
        if v is None:
34
 
            v = DEFAULT_PARAMS[k]
35
 
        if v is not None:
36
 
            sstream_params.append("{}={}".format(k, v))
37
 
    if kwargs:
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"])
43
 
    try:
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?")
48
 
        raise
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))
53
 
    return ami_ids[0]
54
 
 
55
 
 
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'],
61
 
                        default='released',
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)
68
 
 
69
 
 
70
 
def main():
71
 
    args = parse_args()
72
 
    try:
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)
78
 
        return 1
79
 
    return 0
80
 
 
81
 
 
82
 
if __name__ == '__main__':
83
 
    sys.exit(main())