~andreserl/charms/quantal/hacluster/trunk

« back to all changes in this revision

Viewing changes to hooks/utils.py

  • Committer: Andres Rodriguez
  • Date: 2012-12-17 13:33:32 UTC
  • mfrom: (2.1.3 hacluster)
  • Revision ID: andreserl@ubuntu.com-20121217133332-nqjg35sglv17tj75
Merge james changes

Show diffs side-by-side

added added

removed removed

Lines of Context:
7
7
#  Paul Collins <paul.collins@canonical.com>
8
8
#
9
9
 
10
 
import commands
11
10
import os
12
 
import re
13
11
import subprocess
14
12
import socket
15
13
import sys
46
44
    import jinja2
47
45
 
48
46
try:
49
 
    from netaddr import *
50
 
except:
 
47
    from netaddr import IPNetwork
 
48
except ImportError:
51
49
    install('python-netaddr')
52
 
    from netaddr import *
 
50
    from netaddr import IPNetwork
 
51
 
 
52
try:
 
53
    import dns.resolver
 
54
except ImportError:
 
55
    install('python-dnspython')
 
56
    import dns.resolver
53
57
 
54
58
 
55
59
def render_template(template_name, context, template_dir=TEMPLATES_DIR):
60
64
    return template.render(context)
61
65
 
62
66
 
 
67
CLOUD_ARCHIVE = \
 
68
""" # Ubuntu Cloud Archive
 
69
deb http://ubuntu-cloud.archive.canonical.com/ubuntu {} main
 
70
"""
 
71
 
 
72
CLOUD_ARCHIVE_POCKETS = {
 
73
    'precise-folsom': 'precise-updates/folsom',
 
74
    'precise-folsom/updates': 'precise-updates/folsom',
 
75
    'precise-folsom/proposed': 'precise-proposed/folsom',
 
76
    'precise-grizzly': 'precise-updates/grizzly',
 
77
    'precise-grizzly/updates': 'precise-updates/grizzly',
 
78
    'precise-grizzly/proposed': 'precise-proposed/grizzly'
 
79
    }
 
80
 
 
81
 
63
82
def configure_source():
64
 
    source = config_get('source')
65
 
    if (source.startswith('ppa:') or
66
 
        source.startswith('cloud:')):
 
83
    source = str(config_get('openstack-origin'))
 
84
    if not source:
 
85
        return
 
86
    if source.startswith('ppa:'):
67
87
        cmd = [
68
88
            'add-apt-repository',
69
89
            source
70
90
            ]
71
91
        subprocess.check_call(cmd)
72
 
    if source.startswith('http:'):
73
 
        with open('/etc/apt/sources.list.d/hacluster.list', 'w') as apt:
74
 
            apt.write("deb " + source + "\n")
75
 
        key = config_get('key')
76
 
        if key != "":
 
92
    if source.startswith('cloud:'):
 
93
        install('ubuntu-cloud-keyring')
 
94
        pocket = source.split(':')[1]
 
95
        with open('/etc/apt/sources.list.d/cloud-archive.list', 'w') as apt:
 
96
            apt.write(CLOUD_ARCHIVE.format(CLOUD_ARCHIVE_POCKETS[pocket]))
 
97
    if source.startswith('deb'):
 
98
        l = len(source.split('|'))
 
99
        if l == 2:
 
100
            (apt_line, key) = source.split('|')
77
101
            cmd = [
78
102
                'apt-key',
79
 
                'import',
80
 
                key
 
103
                'adv', '--keyserver keyserver.ubuntu.com',
 
104
                '--recv-keys', key
81
105
                ]
82
106
            subprocess.check_call(cmd)
 
107
        elif l == 1:
 
108
            apt_line = source
 
109
 
 
110
        with open('/etc/apt/sources.list.d/quantum.list', 'w') as apt:
 
111
            apt.write(apt_line + "\n")
83
112
    cmd = [
84
113
        'apt-get',
85
114
        'update'
140
169
    else:
141
170
        return value
142
171
 
 
172
 
143
173
def relation_set(**kwargs):
144
174
    cmd = [
145
175
        'relation-set'
176
206
 
177
207
 
178
208
def get_host_ip(hostname=unit_get('private-address')):
179
 
    cmd = [
180
 
        'dig',
181
 
        '+short',
182
 
        hostname
183
 
        ]
184
 
    return subprocess.check_output(cmd).strip()  # IGNORE:E1103
 
209
    try:
 
210
        # Test to see if already an IPv4 address
 
211
        socket.inet_aton(hostname)
 
212
        return hostname
 
213
    except socket.error:
 
214
        pass
 
215
    try:
 
216
        answers = dns.resolver.query(hostname, 'A')
 
217
        if answers:
 
218
            return answers[0].address
 
219
    except dns.resolver.NXDOMAIN:
 
220
        pass
 
221
    return None
185
222
 
186
223
 
187
224
def restart(*services):
200
237
 
201
238
 
202
239
def running(service):
203
 
    #output = subprocess.check_output(['service', service, 'status'])
204
 
    output = commands.getoutput('service %s status' % service)
205
 
    show_re = re.compile("start/running")
206
 
    status = show_re.search(output)
207
 
    if status:
208
 
        return True
209
 
    return False
 
240
    try:
 
241
        output = subprocess.check_output(['service', service, 'status'])
 
242
    except subprocess.CalledProcessError:
 
243
        return False
 
244
    else:
 
245
        if ("start/running" in output or
 
246
            "is running" in output):
 
247
            return True
 
248
        else:
 
249
            return False
 
250
 
210
251
 
211
252
def disable_upstart_services(*services):
212
253
    for service in services:
213
 
        #subprocess.check_call('sh -c "echo manual > /etc/init/%s.override"' % service, shell=True)
214
 
        override = open("/etc/init/%s.override" % service, "w")
215
 
        override.write("manual")
216
 
        override.close()
 
254
        with open("/etc/init/{}.override".format(service), "w") as override:
 
255
            override.write("manual")
217
256
 
218
257
 
219
258
def enable_upstart_services(*services):
220
259
    for service in services:
221
 
        path = '/etc/init/%s.override' % service
 
260
        path = '/etc/init/{}.override'.format(service)
222
261
        if os.path.exists(path):
223
 
            subprocess.check_call(['rm', '-rf', path])
 
262
            os.remove(path)
224
263
 
225
264
 
226
265
def disable_lsb_services(*services):
230
269
 
231
270
def enable_lsb_services(*services):
232
271
    for service in services:
233
 
        subprocess.call(['update-rc.d','-f',service,'defaults'])
 
272
        subprocess.check_call(['update-rc.d', '-f', service, 'defaults'])
234
273
 
235
274
 
236
275
def get_iface_ipaddr(iface):
246
285
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
247
286
    return socket.inet_ntoa(fcntl.ioctl(
248
287
        s.fileno(),
249
 
        0x891b, # SIOCGIFNETMASK
 
288
        0x891b,  # SIOCGIFNETMASK
250
289
        struct.pack('256s', iface[:15])
251
290
    )[20:24])
252
291
 
260
299
 
261
300
 
262
301
def get_network_address(iface):
263
 
    network = "%s/%s" % (get_iface_ipaddr(iface), get_netmask_cidr(get_iface_netmask(iface)))
264
 
    ip = IPNetwork(network)
265
 
    return str(ip.network)
 
302
    if iface:
 
303
        network = "{}/{}".format(get_iface_ipaddr(iface),
 
304
                                 get_netmask_cidr(get_iface_netmask(iface)))
 
305
        ip = IPNetwork(network)
 
306
        return str(ip.network)
 
307
    else:
 
308
        return None