2013-03-18 13:02:51 +00:00
|
|
|
#
|
|
|
|
# Copyright 2012 Canonical Ltd.
|
|
|
|
#
|
|
|
|
# This file is sourced from lp:openstack-charm-helpers
|
|
|
|
#
|
|
|
|
# Authors:
|
|
|
|
# James Page <james.page@ubuntu.com>
|
|
|
|
# Adam Gandelman <adamg@ubuntu.com>
|
|
|
|
#
|
|
|
|
|
|
|
|
from lib.utils import (
|
|
|
|
juju_log,
|
|
|
|
relation_ids,
|
|
|
|
relation_list,
|
|
|
|
relation_get,
|
|
|
|
get_unit_hostname,
|
|
|
|
config_get
|
|
|
|
)
|
|
|
|
import subprocess
|
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
|
|
def is_clustered():
|
|
|
|
for r_id in (relation_ids('ha') or []):
|
|
|
|
for unit in (relation_list(r_id) or []):
|
|
|
|
clustered = relation_get('clustered',
|
|
|
|
rid=r_id,
|
|
|
|
unit=unit)
|
|
|
|
if clustered:
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
def is_leader(resource):
|
|
|
|
cmd = [
|
|
|
|
"crm", "resource",
|
|
|
|
"show", resource
|
|
|
|
]
|
|
|
|
try:
|
|
|
|
status = subprocess.check_output(cmd)
|
|
|
|
except subprocess.CalledProcessError:
|
|
|
|
return False
|
|
|
|
else:
|
|
|
|
if get_unit_hostname() in status:
|
|
|
|
return True
|
|
|
|
else:
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
def peer_units():
|
|
|
|
peers = []
|
|
|
|
for r_id in (relation_ids('cluster') or []):
|
|
|
|
for unit in (relation_list(r_id) or []):
|
|
|
|
peers.append(unit)
|
|
|
|
return peers
|
|
|
|
|
|
|
|
|
|
|
|
def oldest_peer(peers):
|
2013-03-18 17:31:32 +00:00
|
|
|
local_unit_no = int(os.getenv('JUJU_UNIT_NAME').split('/')[1])
|
2013-03-18 13:02:51 +00:00
|
|
|
for peer in peers:
|
2013-03-18 17:31:32 +00:00
|
|
|
remote_unit_no = int(peer.split('/')[1])
|
2013-03-18 13:02:51 +00:00
|
|
|
if remote_unit_no < local_unit_no:
|
|
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
def eligible_leader(resource):
|
|
|
|
if is_clustered():
|
|
|
|
if not is_leader(resource):
|
|
|
|
juju_log('INFO', 'Deferring action to CRM leader.')
|
|
|
|
return False
|
|
|
|
else:
|
|
|
|
peers = peer_units()
|
|
|
|
if peers and not oldest_peer(peers):
|
|
|
|
juju_log('INFO', 'Deferring action to oldest service unit.')
|
|
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
def https():
|
|
|
|
'''
|
|
|
|
Determines whether enough data has been provided in configuration
|
|
|
|
or relation data to configure HTTPS
|
|
|
|
.
|
|
|
|
returns: boolean
|
|
|
|
'''
|
|
|
|
if config_get('use-https') == "yes":
|
|
|
|
return True
|
|
|
|
if config_get('ssl_cert') and config_get('ssl_key'):
|
|
|
|
return True
|
|
|
|
for r_id in relation_ids('identity-service'):
|
|
|
|
for unit in relation_list(r_id):
|
|
|
|
if (relation_get('https_keystone', rid=r_id, unit=unit) and
|
|
|
|
relation_get('ssl_cert', rid=r_id, unit=unit) and
|
|
|
|
relation_get('ssl_key', rid=r_id, unit=unit) and
|
|
|
|
relation_get('ca_cert', rid=r_id, unit=unit)):
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
def determine_api_port(public_port):
|
|
|
|
'''
|
|
|
|
Determine correct API server listening port based on
|
|
|
|
existence of HTTPS reverse proxy and/or haproxy.
|
|
|
|
|
|
|
|
public_port: int: standard public port for given service
|
|
|
|
|
|
|
|
returns: int: the correct listening port for the API service
|
|
|
|
'''
|
|
|
|
i = 0
|
|
|
|
if len(peer_units()) > 0 or is_clustered():
|
|
|
|
i += 1
|
|
|
|
if https():
|
|
|
|
i += 1
|
|
|
|
return public_port - (i * 10)
|
|
|
|
|
|
|
|
|
|
|
|
def determine_haproxy_port(public_port):
|
|
|
|
'''
|
|
|
|
Description: Determine correct proxy listening port based on public IP +
|
|
|
|
existence of HTTPS reverse proxy.
|
|
|
|
|
|
|
|
public_port: int: standard public port for given service
|
|
|
|
|
|
|
|
returns: int: the correct listening port for the HAProxy service
|
|
|
|
'''
|
|
|
|
i = 0
|
|
|
|
if https():
|
|
|
|
i += 1
|
|
|
|
return public_port - (i * 10)
|