~niedbalski/charms/trusty/swift-proxy/fix-lp-1308557

« back to all changes in this revision

Viewing changes to hooks/swift-hooks.py

  • Committer: James Page
  • Date: 2013-06-03 16:50:28 UTC
  • mfrom: (35.1.18 swift-proxy)
  • Revision ID: james.page@canonical.com-20130603165028-f9ya6llay65w3t9e
* Python rewrite

* Support for manually assigned storage zones

* Support for high availability via hacluster subordinate.

* Adds Grizzly compatibility.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/python
2
 
 
3
 
import os
4
 
import utils
5
 
import sys
6
 
import shutil
7
 
import uuid
8
 
from subprocess import check_call
9
 
 
10
 
import lib.openstack_common as openstack
11
 
import swift_utils as swift
12
 
 
13
 
def install():
14
 
    src = utils.config_get('openstack-origin')
15
 
    if src != 'distro':
16
 
        openstack.configure_installation_source(src)
17
 
    check_call(['apt-get', 'update'])
18
 
    rel = openstack.get_os_codename_install_source(src)
19
 
 
20
 
    pkgs = swift.determine_packages(rel)
21
 
    utils.install(*pkgs)
22
 
 
23
 
    swift.ensure_swift_dir()
24
 
 
25
 
    # initialize swift configs.
26
 
    # swift.conf hash
27
 
    ctxt = {
28
 
        'swift_hash': swift.get_swift_hash()
29
 
    }
30
 
    with open(swift.SWIFT_CONF, 'w') as conf:
31
 
        conf.write(swift.render_config(swift.SWIFT_CONF, ctxt))
32
 
 
33
 
    # swift-proxy.conf
34
 
    swift.write_proxy_config()
35
 
 
36
 
    # memcached.conf
37
 
    ctxt = { 'proxy_ip': utils.get_host_ip() }
38
 
    with open(swift.MEMCACHED_CONF, 'w') as conf:
39
 
        conf.write(swift.render_config(swift.MEMCACHED_CONF, ctxt))
40
 
    check_call(['service', 'memcached', 'restart'])
41
 
 
42
 
    # generate or setup SSL certificate
43
 
    swift.configure_ssl()
44
 
 
45
 
    # initialize new storage rings.
46
 
    for ring in swift.SWIFT_RINGS.iteritems():
47
 
        swift.initialize_ring(ring[1],
48
 
                              utils.config_get('partition-power'),
49
 
                              utils.config_get('replicas'),
50
 
                              utils.config_get('min-hours'))
51
 
 
52
 
    # configure a directory on webserver for distributing rings.
53
 
    if not os.path.isdir(swift.WWW_DIR):
54
 
        os.mkdir(swift.WWW_DIR, 0755)
55
 
    uid, gid = swift.swift_user()
56
 
    os.chown(swift.WWW_DIR, uid, gid)
57
 
    swift.write_apache_config()
58
 
 
59
 
 
60
 
def keystone_joined(relid=None):
61
 
    hostname = utils.unit_get('private-address')
62
 
    port = utils.config_get('bind-port')
63
 
    ssl = utils.config_get('use-https')
64
 
    if ssl == 'yes':
65
 
        proto = 'https'
66
 
    else:
67
 
        proto = 'http'
68
 
    admin_url = '%s://%s:%s' % (proto, hostname, port)
69
 
    internal_url = public_url = '%s/v1/AUTH_$(tenant_id)s' % admin_url
70
 
    utils.relation_set(service='swift',
71
 
                       region=utils.config_get('region'),
72
 
                       public_url=public_url, internal_url=internal_url,
73
 
                       admin_url=admin_url,
74
 
                       requested_roles=utils.config_get('operator-roles'),
75
 
                       rid=relid)
76
 
 
77
 
 
78
 
def keystone_changed():
79
 
    swift.write_proxy_config()
80
 
 
81
 
 
82
 
def balance_rings():
83
 
    '''handle doing ring balancing and distribution.'''
84
 
    new_ring = False
85
 
    for ring in swift.SWIFT_RINGS.itervalues():
86
 
        if swift.balance_ring(ring):
87
 
            utils.juju_log('INFO', 'Balanced ring %s' % ring)
88
 
            new_ring = True
89
 
    if not new_ring:
90
 
        return
91
 
 
92
 
    for ring in swift.SWIFT_RINGS.keys():
93
 
        f = '%s.ring.gz' % ring
94
 
        shutil.copyfile(os.path.join(swift.SWIFT_CONF_DIR, f),
95
 
                        os.path.join(swift.WWW_DIR, f))
96
 
 
97
 
    msg = 'Broadcasting notification to all storage nodes that new '\
98
 
          'ring is ready for consumption.'
99
 
    utils.juju_log('INFO', msg)
100
 
 
101
 
    www_dir = swift.WWW_DIR.split('/var/www/')[1]
102
 
    trigger = uuid.uuid4()
103
 
    swift_hash = swift.get_swift_hash()
104
 
    # notify storage nodes that there is a new ring to fetch.
105
 
    for relid in utils.relation_ids('swift-storage'):
106
 
        utils.relation_set(rid=relid, swift_hash=swift_hash,
107
 
                           www_dir=www_dir, trigger=trigger)
108
 
    swift.proxy_control('restart')
109
 
 
110
 
def storage_changed():
111
 
    account_port = utils.config_get('account-ring-port')
112
 
    object_port = utils.config_get('object-ring-port')
113
 
    container_port = utils.config_get('container-ring-port')
114
 
    zone = swift.get_zone(utils.config_get('zone-assignment'))
115
 
    node_settings = {
116
 
        'ip': utils.get_host_ip(utils.relation_get('private-address')),
117
 
        'zone': zone,
118
 
        'account_port': utils.relation_get('account_port'),
119
 
        'object_port': utils.relation_get('object_port'),
120
 
        'container_port': utils.relation_get('container_port'),
121
 
    }
122
 
    if None in node_settings.itervalues():
123
 
        utils.juju_log('INFO', 'storage_changed: Relation not ready.')
124
 
        return None
125
 
 
126
 
    for k in ['zone', 'account_port', 'object_port', 'container_port']:
127
 
        node_settings[k] = int(node_settings[k])
128
 
 
129
 
    # Grant new node access to rings via apache.
130
 
    swift.write_apache_config()
131
 
 
132
 
    # allow for multiple devs per unit, passed along as a : separated list
133
 
    devs = utils.relation_get('device').split(':')
134
 
    for dev in devs:
135
 
        node_settings['device'] = dev
136
 
        for ring in swift.SWIFT_RINGS.itervalues():
137
 
            if not swift.exists_in_ring(ring, node_settings):
138
 
                swift.add_to_ring(ring, node_settings)
139
 
 
140
 
    if swift.should_balance([r for r in swift.SWIFT_RINGS.itervalues()]):
141
 
        balance_rings()
142
 
 
143
 
def storage_broken():
144
 
    swift.write_apache_config()
145
 
 
146
 
def config_changed():
147
 
    relids = utils.relation_ids('identity-service')
148
 
    if relids:
149
 
        for relid in relids:
150
 
            keystone_joined(relid)
151
 
    swift.write_proxy_config()
152
 
 
153
 
hooks = {
154
 
    'install': install,
155
 
    'config-changed': config_changed,
156
 
    'identity-service-relation-joined': keystone_joined,
157
 
    'identity-service-relation-changed': keystone_changed,
158
 
    'swift-storage-relation-changed': storage_changed,
159
 
    'swift-storage-relation-broken': storage_broken,
160
 
}
161
 
 
162
 
utils.do_hooks(hooks)
163
 
 
164
 
sys.exit(0)