comparison planemo/bin/list_instances @ 0:d30785e31577 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:18:57 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:d30785e31577
1 #!/Users/guerler/spring/springsuite/planemo/bin/python3
2
3 import sys
4 from operator import attrgetter
5 from optparse import OptionParser
6
7 import boto
8 from boto.ec2 import regions
9
10
11 HEADERS = {
12 'ID': {'get': attrgetter('id'), 'length':15},
13 'Zone': {'get': attrgetter('placement'), 'length':15},
14 'Groups': {'get': attrgetter('groups'), 'length':30},
15 'Hostname': {'get': attrgetter('public_dns_name'), 'length':50},
16 'PrivateHostname': {'get': attrgetter('private_dns_name'), 'length':50},
17 'State': {'get': attrgetter('state'), 'length':15},
18 'Image': {'get': attrgetter('image_id'), 'length':15},
19 'Type': {'get': attrgetter('instance_type'), 'length':15},
20 'IP': {'get': attrgetter('ip_address'), 'length':16},
21 'PrivateIP': {'get': attrgetter('private_ip_address'), 'length':16},
22 'Key': {'get': attrgetter('key_name'), 'length':25},
23 'T:': {'length': 30},
24 }
25
26 def get_column(name, instance=None):
27 if name.startswith('T:'):
28 _, tag = name.split(':', 1)
29 return instance.tags.get(tag, '')
30 return HEADERS[name]['get'](instance)
31
32
33 def main():
34 parser = OptionParser()
35 parser.add_option("-r", "--region", help="Region (default us-east-1)", dest="region", default="us-east-1")
36 parser.add_option("-H", "--headers", help="Set headers (use 'T:tagname' for including tags)", default=None, action="store", dest="headers", metavar="ID,Zone,Groups,Hostname,State,T:Name")
37 parser.add_option("-t", "--tab", help="Tab delimited, skip header - useful in shell scripts", action="store_true", default=False)
38 parser.add_option("-f", "--filter", help="Filter option sent to DescribeInstances API call, format is key1=value1,key2=value2,...", default=None)
39 (options, args) = parser.parse_args()
40
41
42 # Connect the region
43 for r in regions():
44 if r.name == options.region:
45 region = r
46 break
47 else:
48 print("Region %s not found." % options.region)
49 sys.exit(1)
50 ec2 = boto.connect_ec2(region=region)
51
52 # Read headers
53 if options.headers:
54 headers = tuple(options.headers.split(','))
55 else:
56 headers = ("ID", 'Zone', "Groups", "Hostname")
57
58 # Create format string
59 format_string = ""
60 for h in headers:
61 if h.startswith('T:'):
62 format_string += "%%-%ds" % HEADERS['T:']['length']
63 else:
64 format_string += "%%-%ds" % HEADERS[h]['length']
65
66
67 # Parse filters (if any)
68 if options.filter:
69 filters = dict([entry.split('=') for entry in options.filter.split(',')])
70 else:
71 filters = {}
72
73 # List and print
74
75 if not options.tab:
76 print(format_string % headers)
77 print("-" * len(format_string % headers))
78
79 for r in ec2.get_all_reservations(filters=filters):
80 groups = [g.name for g in r.groups]
81 for i in r.instances:
82 i.groups = ','.join(groups)
83 if options.tab:
84 print("\t".join(tuple(get_column(h, i) for h in headers)))
85 else:
86 print(format_string % tuple(get_column(h, i) for h in headers))
87
88
89 if __name__ == "__main__":
90 main()