8
from subprocess import check_call
10
import lib.openstack_common as openstack
11
import swift_utils as swift
19
src = utils.config_get('openstack-origin')
21
openstack.configure_installation_source(src)
22
check_call(['apt-get', 'update'])
23
rel = openstack.get_os_codename_install_source(src)
25
pkgs = swift.determine_packages(rel)
27
utils.install(*extra_pkgs)
29
swift.ensure_swift_dir()
31
# initialize swift configs.
34
'swift_hash': swift.get_swift_hash()
36
with open(swift.SWIFT_CONF, 'w') as conf:
37
conf.write(swift.render_config(swift.SWIFT_CONF, ctxt))
40
swift.write_proxy_config()
43
ctxt = { 'proxy_ip': utils.get_host_ip() }
44
with open(swift.MEMCACHED_CONF, 'w') as conf:
45
conf.write(swift.render_config(swift.MEMCACHED_CONF, ctxt))
47
# generate or setup SSL certificate
50
# initialize new storage rings.
51
for ring in swift.SWIFT_RINGS.iteritems():
52
swift.initialize_ring(ring[1],
53
utils.config_get('partition-power'),
54
utils.config_get('replicas'),
55
utils.config_get('min-hours'))
57
# configure a directory on webserver for distributing rings.
58
if not os.path.isdir(swift.WWW_DIR):
59
os.mkdir(swift.WWW_DIR, 0755)
60
uid, gid = swift.swift_user()
61
os.chown(swift.WWW_DIR, uid, gid)
62
swift.write_apache_config()
65
def keystone_joined(relid=None):
66
if utils.is_clustered():
67
hostname = utils.config_get('vip')
69
hostname = utils.unit_get('private-address')
70
port = utils.config_get('bind-port')
71
ssl = utils.config_get('use-https')
76
admin_url = '%s://%s:%s' % (proto, hostname, port)
77
internal_url = public_url = '%s/v1/AUTH_$(tenant_id)s' % admin_url
78
utils.relation_set(service='swift',
79
region=utils.config_get('region'),
80
public_url=public_url, internal_url=internal_url,
82
requested_roles=utils.config_get('operator-roles'),
86
def keystone_changed():
87
swift.write_proxy_config()
91
'''handle doing ring balancing and distribution.'''
93
for ring in swift.SWIFT_RINGS.itervalues():
94
if swift.balance_ring(ring):
95
utils.juju_log('INFO', 'Balanced ring %s' % ring)
100
for ring in swift.SWIFT_RINGS.keys():
101
f = '%s.ring.gz' % ring
102
shutil.copyfile(os.path.join(swift.SWIFT_CONF_DIR, f),
103
os.path.join(swift.WWW_DIR, f))
105
if utils.eligible_leader():
106
msg = 'Broadcasting notification to all storage nodes that new '\
107
'ring is ready for consumption.'
108
utils.juju_log('INFO', msg)
109
www_dir = swift.WWW_DIR.split('/var/www/')[1]
110
trigger = uuid.uuid4()
111
swift_hash = swift.get_swift_hash()
112
# notify storage nodes that there is a new ring to fetch.
113
for relid in utils.relation_ids('swift-storage'):
114
utils.relation_set(rid=relid, swift_hash=swift_hash,
115
www_dir=www_dir, trigger=trigger)
117
swift.proxy_control('restart')
119
def storage_changed():
120
account_port = utils.config_get('account-ring-port')
121
object_port = utils.config_get('object-ring-port')
122
container_port = utils.config_get('container-ring-port')
123
zone = swift.get_zone(utils.config_get('zone-assignment'))
125
'ip': utils.get_host_ip(utils.relation_get('private-address')),
127
'account_port': utils.relation_get('account_port'),
128
'object_port': utils.relation_get('object_port'),
129
'container_port': utils.relation_get('container_port'),
131
if None in node_settings.itervalues():
132
utils.juju_log('INFO', 'storage_changed: Relation not ready.')
135
for k in ['zone', 'account_port', 'object_port', 'container_port']:
136
node_settings[k] = int(node_settings[k])
138
# Grant new node access to rings via apache.
139
swift.write_apache_config()
141
# allow for multiple devs per unit, passed along as a : separated list
142
devs = utils.relation_get('device').split(':')
144
node_settings['device'] = dev
145
for ring in swift.SWIFT_RINGS.itervalues():
146
if not swift.exists_in_ring(ring, node_settings):
147
swift.add_to_ring(ring, node_settings)
149
if swift.should_balance([r for r in swift.SWIFT_RINGS.itervalues()]):
152
def storage_broken():
153
swift.write_apache_config()
155
def config_changed():
156
relids = utils.relation_ids('identity-service')
159
keystone_joined(relid)
160
swift.write_proxy_config()
166
utils.config_get('bind-port'),
167
int(utils.config_get('bind-port')) - 10
172
def cluster_changed():
174
cluster_hosts[os.getenv('JUJU_UNIT_NAME').replace('/', '-')] = \
175
utils.unit_get('private-address')
176
for r_id in utils.relation_ids('cluster'):
177
for unit in utils.relation_list(r_id):
178
cluster_hosts[unit.replace('/', '-')] = \
179
utils.relation_get(attribute='private-address',
182
openstack.configure_haproxy(cluster_hosts,
184
utils.restart('haproxy')
187
def ha_relation_changed():
188
clustered = utils.relation_get('clustered')
189
if clustered and utils.is_leader():
190
utils.juju_log('INFO',
191
'Cluster configured, notifying other services and'
192
'updating keystone endpoint configuration')
193
# Tell all related services to start using
194
# the VIP and haproxy ports instead
195
for r_id in utils.relation_ids('identity-service'):
196
keystone_joined(relid=r_id)
199
def ha_relation_joined():
200
# Obtain the config values necessary for the cluster config. These
201
# include multicast port and interface to bind to.
202
corosync_bindiface = utils.config_get('ha-bindiface')
203
corosync_mcastport = utils.config_get('ha-mcastport')
204
vip = utils.config_get('vip')
205
vip_cidr = utils.config_get('vip_cidr')
206
vip_iface = utils.config_get('vip_iface')
208
utils.juju_log('ERROR',
209
'Unable to configure hacluster as vip not provided')
214
'res_swift_vip': 'ocf:heartbeat:IPaddr2',
215
'res_swift_haproxy': 'lsb:haproxy'
218
'res_swift_vip': 'params ip="%s" cidr_netmask="%s" nic="%s"' % \
219
(vip, vip_cidr, vip_iface),
220
'res_swift_haproxy': 'op monitor interval="5s"'
223
'res_swift_haproxy': 'haproxy'
226
'cl_swift_haproxy': 'res_swift_haproxy'
229
utils.relation_set(init_services=init_services,
230
corosync_bindiface=corosync_bindiface,
231
corosync_mcastport=corosync_mcastport,
233
resource_params=resource_params,
239
'config-changed': config_changed,
240
'identity-service-relation-joined': keystone_joined,
241
'identity-service-relation-changed': keystone_changed,
242
'swift-storage-relation-changed': storage_changed,
243
'swift-storage-relation-broken': storage_broken,
244
"cluster-relation-joined": cluster_changed,
245
"cluster-relation-changed": cluster_changed,
246
"ha-relation-joined": ha_relation_joined,
247
"ha-relation-changed": ha_relation_changed
250
utils.do_hooks(hooks)