summaryrefslogtreecommitdiffstats
path: root/bin/awsutil.py
blob: 78421e5f5eb07b45f1abc4ea440b908515cf5a51 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# vim: expandtab:tabstop=4:shiftwidth=4

import subprocess
import os
import json
import re

class AwsUtil(object):
    def __init__(self, inventory_path=None, host_type_aliases={}):
        self.host_type_aliases = host_type_aliases
        self.file_path = os.path.join(os.path.dirname(os.path.realpath(__file__)))

        if inventory_path is None:
            inventory_path = os.path.realpath(os.path.join(self.file_path, \
                                              '..','inventory','multi_ec2.py'))

        if not os.path.isfile(inventory_path):
            raise Exception("Inventory file not found [%s]" % inventory_path)

        self.inventory_path = inventory_path
        self.setup_host_type_alias_lookup()

    def setup_host_type_alias_lookup(self):
        self.alias_lookup = {}
        for key, values in self.host_type_aliases.iteritems():
            for value in values:
                self.alias_lookup[value] = key



    def get_inventory(self,args=[]):
        cmd = [self.inventory_path]

        if args:
            cmd.extend(args)

        env = os.environ

        p = subprocess.Popen(cmd, stderr=subprocess.PIPE,
                         stdout=subprocess.PIPE, env=env)

        out,err = p.communicate()

        if p.returncode != 0:
            raise RuntimeError(err)

        return json.loads(out.strip())

    def get_environments(self):
        pattern = re.compile(r'^tag_environment_(.*)')

        envs = []
        inv = self.get_inventory()
        for key in inv.keys():
            m = pattern.match(key)
            if m:
                envs.append(m.group(1))

        envs.sort()
        return envs

    def get_host_types(self):
        pattern = re.compile(r'^tag_host-type_(.*)')

        host_types = []
        inv = self.get_inventory()
        for key in inv.keys():
            m = pattern.match(key)
            if m:
                host_types.append(m.group(1))

        host_types.sort()
        return host_types

    def get_security_groups(self):
        pattern = re.compile(r'^security_group_(.*)')

        groups = []
        inv = self.get_inventory()
        for key in inv.keys():
            m = pattern.match(key)
            if m:
                groups.append(m.group(1))

        groups.sort()
        return groups

    def build_host_dict_by_env(self, args=[]):
        inv = self.get_inventory(args)

        inst_by_env = {}
        for dns, host in inv['_meta']['hostvars'].items():
            # If you don't have an environment tag, we're going to ignore you
            if 'ec2_tag_environment' not in host:
                continue

            if host['ec2_tag_environment'] not in inst_by_env:
                inst_by_env[host['ec2_tag_environment']] = {}
            host_id = "%s:%s" % (host['ec2_tag_Name'],host['ec2_id'])
            inst_by_env[host['ec2_tag_environment']][host_id] = host

        return inst_by_env

    # Display host_types
    def print_host_types(self):
        host_types = self.get_host_types()
        ht_format_str = "%35s"
        alias_format_str = "%-20s"
        combined_format_str = ht_format_str + "    " + alias_format_str

        print
        print combined_format_str % ('Host Types', 'Aliases')
        print combined_format_str % ('----------', '-------')

        for ht in host_types:
            aliases = []
            if ht in self.host_type_aliases:
                aliases = self.host_type_aliases[ht]
                print combined_format_str % (ht, ", ".join(aliases))
            else:
                print  ht_format_str % ht
        print

    # Convert host-type aliases to real a host-type
    def resolve_host_type(self, host_type):
        if self.alias_lookup.has_key(host_type):
            return self.alias_lookup[host_type]
        return host_type

    def gen_env_host_type_tag(self, host_type, env):
        """Generate the environment host type tag
        """
        host_type = self.resolve_host_type(host_type)
        return "tag_env-host-type_%s-%s" % (env, host_type)

    def get_host_list(self, host_type, env):
        """Get the list of hosts from the inventory using host-type and environment
        """
        inv = self.get_inventory()
        host_type_tag = self.gen_env_host_type_tag(host_type, env)
        return inv[host_type_tag]