8
from subprocess import check_call
10
import lib.openstack_common as openstack
11
import swift_utils as swift
14
src = utils.config_get('openstack-origin')
16
openstack.configure_installation_source(src)
17
check_call(['apt-get', 'update'])
18
rel = openstack.get_os_codename_install_source(src)
20
pkgs = swift.determine_packages(rel)
23
swift.ensure_swift_dir()
25
# initialize swift configs.
28
'swift_hash': swift.get_swift_hash()
30
with open(swift.SWIFT_CONF, 'w') as conf:
31
conf.write(swift.render_config(swift.SWIFT_CONF, ctxt))
34
swift.write_proxy_config()
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'])
42
# generate or setup SSL certificate
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'))
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()
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')
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,
74
requested_roles=utils.config_get('operator-roles'),
78
def keystone_changed():
79
swift.write_proxy_config()
83
'''handle doing ring balancing and distribution.'''
85
for ring in swift.SWIFT_RINGS.itervalues():
86
if swift.balance_ring(ring):
87
utils.juju_log('INFO', 'Balanced ring %s' % ring)
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))
97
msg = 'Broadcasting notification to all storage nodes that new '\
98
'ring is ready for consumption.'
99
utils.juju_log('INFO', msg)
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')
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'))
116
'ip': utils.get_host_ip(utils.relation_get('private-address')),
118
'account_port': utils.relation_get('account_port'),
119
'object_port': utils.relation_get('object_port'),
120
'container_port': utils.relation_get('container_port'),
122
if None in node_settings.itervalues():
123
utils.juju_log('INFO', 'storage_changed: Relation not ready.')
126
for k in ['zone', 'account_port', 'object_port', 'container_port']:
127
node_settings[k] = int(node_settings[k])
129
# Grant new node access to rings via apache.
130
swift.write_apache_config()
132
# allow for multiple devs per unit, passed along as a : separated list
133
devs = utils.relation_get('device').split(':')
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)
140
if swift.should_balance([r for r in swift.SWIFT_RINGS.itervalues()]):
143
def storage_broken():
144
swift.write_apache_config()
146
def config_changed():
147
relids = utils.relation_ids('identity-service')
150
keystone_joined(relid)
151
swift.write_proxy_config()
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,
162
utils.do_hooks(hooks)