fixes due to review
This commit is contained in:
parent
f6380d7393
commit
af33c6fe17
|
@ -0,0 +1,41 @@
|
|||
Overview
|
||||
--------
|
||||
|
||||
This charm provides the Ceilometer service for OpenStack. It is intended to
|
||||
be used alongside the other OpenStack components, starting with the Folsom
|
||||
release.
|
||||
|
||||
Ceilometer is made up of 2 separate services: an API service, and a collector
|
||||
service. This charm allows them to be deployed in different
|
||||
combination, depending on user preference and requirements.
|
||||
|
||||
This charm was developed to support deploying Folsom on both
|
||||
Ubuntu Quantal and Ubuntu Precise. Since Ceilometer is only available for
|
||||
Ubuntu 12.04 via the Ubuntu Cloud Archive, deploying this charm to a
|
||||
Precise machine will by default install Ceilometer and its dependencies from
|
||||
the Cloud Archive.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
In order to deploy Ceilometer service, Mongo service is required:
|
||||
|
||||
juju deploy mongodb
|
||||
juju deploy ceilometer
|
||||
juju add-relation ceilometer mongodb
|
||||
|
||||
Then Keystone and Rabbit relationships needs to be established:
|
||||
|
||||
juju add-relation ceilometer rabbitmq
|
||||
juju add-relation ceilometer keystone
|
||||
|
||||
In order to capture the calculations, a Ceilometer compute agent
|
||||
needs to be installed in each nova node, and be related with
|
||||
Ceilometer service:
|
||||
|
||||
juju deploy ceilometer-agent
|
||||
juju add-relation ceilometer-agent nova-compute
|
||||
juju add-relation ceilometer:ceilometer-service ceilometer-agent:ceilometer-service
|
||||
|
||||
Ceilometer provides an API service that can be used to retrieve
|
||||
Openstack metrics.
|
28
config.yaml
28
config.yaml
|
@ -10,26 +10,18 @@ options:
|
|||
openstack-origin:
|
||||
default: cloud:precise-folsom
|
||||
type: string
|
||||
description: |
|
||||
Repository from which to install. May be one of the following:
|
||||
distro (default), ppa:somecustom/ppa, a deb url sources entry,
|
||||
or a supported Cloud Archive release pocket.
|
||||
description: |
|
||||
Repository from which to install. May be one of the following:
|
||||
distro (default), ppa:somecustom/ppa, a deb url sources entry,
|
||||
or a supported Cloud Archive release pocket.
|
||||
|
||||
Supported Cloud Archive sources include: cloud:precise-folsom,
|
||||
cloud:precise-folsom/updates, cloud:precise-folsom/staging,
|
||||
cloud:precise-folsom/proposed.
|
||||
Supported Cloud Archive sources include: cloud:precise-folsom,
|
||||
cloud:precise-folsom/updates, cloud:precise-folsom/staging,
|
||||
cloud:precise-folsom/proposed.
|
||||
|
||||
Note that updating this setting to a source that is known to
|
||||
provide a later version of OpenStack will trigger a software
|
||||
upgrade.
|
||||
config-file:
|
||||
default: "/etc/ceilometer/ceilometer.conf"
|
||||
type: string
|
||||
description: "Location of the ceilometer configuration file"
|
||||
service-port:
|
||||
default: 8777
|
||||
type: int
|
||||
description: "Port the bind the API server to"
|
||||
Note that updating this setting to a source that is known to
|
||||
provide a later version of OpenStack will trigger a software
|
||||
upgrade.
|
||||
region:
|
||||
default: RegionOne
|
||||
type: string
|
||||
|
|
|
@ -1,14 +1,19 @@
|
|||
import os
|
||||
import uuid
|
||||
|
||||
RABBIT_USER="ceilometer"
|
||||
RABBIT_VHOST="ceilometer"
|
||||
CEILOMETER_CONF="/etc/ceilometer/ceilometer.conf"
|
||||
RABBIT_USER = "ceilometer"
|
||||
RABBIT_VHOST = "ceilometer"
|
||||
CEILOMETER_CONF = "/etc/ceilometer/ceilometer.conf"
|
||||
CEILOMETER_PORT = "8777"
|
||||
|
||||
SHARED_SECRET = "/etc/ceilometer/secret.txt"
|
||||
CEILOMETER_SERVICES = ['ceilometer-agent-central', 'ceilometer-collector', 'ceilometer-api']
|
||||
CEILOMETER_DB="ceilometer"
|
||||
CEILOMETER_SERVICES = ['ceilometer-agent-central', 'ceilometer-collector',
|
||||
'ceilometer-api']
|
||||
CEILOMETER_DB = "ceilometer"
|
||||
CEILOMETER_SERVICE = "ceilometer"
|
||||
CEILOMETER_PACKAGES = ['python-ceilometer', 'ceilometer-common',
|
||||
'ceilometer-agent-central', 'ceilometer-collector', 'ceilometer-api']
|
||||
|
||||
|
||||
def get_shared_secret():
|
||||
secret = None
|
||||
|
|
|
@ -6,13 +6,19 @@ import os
|
|||
import utils
|
||||
import ceilometer_utils
|
||||
|
||||
|
||||
def install():
|
||||
utils.configure_source()
|
||||
packages = ['python-ceilometer', 'ceilometer-common', 'ceilometer-agent-central', 'ceilometer-collector', 'ceilometer-api']
|
||||
utils.install(*packages)
|
||||
utils.install(*ceilometer_utils.CEILOMETER_PACKAGES)
|
||||
|
||||
port = ceilometer_utils.CEILOMETER_PORT
|
||||
expose(port)
|
||||
|
||||
|
||||
def amqp_joined():
|
||||
utils.relation_set(username=ceilometer_utils.RABBIT_USER, vhost=ceilometer_utils.RABBIT_VHOST)
|
||||
utils.relation_set(username=ceilometer_utils.RABBIT_USER,
|
||||
vhost=ceilometer_utils.RABBIT_VHOST)
|
||||
|
||||
|
||||
def get_rabbit_conf():
|
||||
for relid in utils.relation_ids('amqp'):
|
||||
|
@ -29,6 +35,7 @@ def get_rabbit_conf():
|
|||
return conf
|
||||
return None
|
||||
|
||||
|
||||
def get_db_conf():
|
||||
for relid in utils.relation_ids('shared-db'):
|
||||
for unit in utils.relation_list(relid):
|
||||
|
@ -41,13 +48,16 @@ def get_db_conf():
|
|||
return conf
|
||||
return None
|
||||
|
||||
|
||||
def get_keystone_conf():
|
||||
for relid in utils.relation_ids('identity-service'):
|
||||
for unit in utils.relation_list(relid):
|
||||
keystone_username = utils.relation_get('service_username', unit, relid)
|
||||
keystone_username = utils.relation_get('service_username',
|
||||
unit, relid)
|
||||
keystone_port = utils.relation_get('service_port', unit, relid)
|
||||
keystone_host = utils.relation_get('service_host', unit, relid)
|
||||
keystone_password = utils.relation_get('service_password', unit, relid)
|
||||
keystone_password = utils.relation_get('service_password',
|
||||
unit, relid)
|
||||
keystone_tenant = utils.relation_get('service_tenant', unit, relid)
|
||||
|
||||
conf = {
|
||||
|
@ -61,53 +71,62 @@ def get_keystone_conf():
|
|||
return conf
|
||||
return None
|
||||
|
||||
|
||||
def render_ceilometer_conf():
|
||||
context = get_rabbit_conf()
|
||||
contextdb = get_db_conf()
|
||||
contextkeystone = get_keystone_conf()
|
||||
|
||||
if (context and contextdb and contextkeystone and os.path.exists(ceilometer_utils.CEILOMETER_CONF)):
|
||||
if (context and contextdb and contextkeystone and
|
||||
os.path.exists(ceilometer_utils.CEILOMETER_CONF)):
|
||||
# merge contexts
|
||||
context.update(contextkeystone)
|
||||
context.update(contextdb)
|
||||
context['metering_secret'] = ceilometer_utils.get_shared_secret()
|
||||
context['service_port'] = utils.config_get('service-port')
|
||||
context['db_connection'] = "mongodb://"+contextdb["db_host"]+":"+contextdb["db_port"]+"/"+contextdb["db_name"]
|
||||
context['service_port'] = ceilometer_utils.CEILOMETER_PORT
|
||||
|
||||
with open(ceilometer_utils.CEILOMETER_CONF, "w") as conf:
|
||||
conf.write(utils.render_template(os.path.basename(ceilometer_utils.CEILOMETER_CONF), context))
|
||||
conf.write(utils.render_template(
|
||||
os.path.basename(ceilometer_utils.CEILOMETER_CONF), context))
|
||||
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def amqp_changed():
|
||||
if render_ceilometer_conf():
|
||||
utils.restart(*ceilometer_utils.CEILOMETER_SERVICES)
|
||||
ceilometer_joined()
|
||||
|
||||
|
||||
def db_joined():
|
||||
utils.relation_set(ceilometer_database=ceilometer_utils.CEILOMETER_DB)
|
||||
|
||||
|
||||
def db_changed():
|
||||
if render_ceilometer_conf():
|
||||
utils.restart(*ceilometer_utils.CEILOMETER_SERVICES)
|
||||
|
||||
|
||||
def config_changed():
|
||||
utils.update_ports()
|
||||
render_ceilometer_conf()
|
||||
|
||||
|
||||
def keystone_joined():
|
||||
port = utils.config_get("service-port")
|
||||
url = "http://"+utils.get_host_ip()+":"+port
|
||||
port = ceilometer_utils.CEILOMETER_PORT
|
||||
url = "http://" + utils.get_host_ip() + ":" + port
|
||||
region = utils.config_get("region")
|
||||
utils.relation_set(service=ceilometer_utils.CEILOMETER_SERVICE, public_url=url, admin_url=url, internal_url=url, region=region)
|
||||
utils.relation_set(service=ceilometer_utils.CEILOMETER_SERVICE,
|
||||
public_url=url, admin_url=url, internal_url=url, region=region)
|
||||
|
||||
|
||||
def keystone_changed():
|
||||
if render_ceilometer_conf():
|
||||
utils.restart(*ceilometer_utils.CEILOMETER_SERVICES)
|
||||
ceilometer_joined()
|
||||
|
||||
|
||||
def ceilometer_joined():
|
||||
pass
|
||||
|
||||
def ceilometer_changed():
|
||||
# check if we have rabbit and keystone already set
|
||||
context = get_rabbit_conf()
|
||||
contextkeystone = get_keystone_conf()
|
||||
|
@ -116,13 +135,13 @@ def ceilometer_changed():
|
|||
context.update(contextkeystone)
|
||||
context['metering_secret'] = ceilometer_utils.get_shared_secret()
|
||||
|
||||
utils.relation_set(metering_secret=context['metering_secret'])
|
||||
utils.relation_set(rabbit_host=context['rabbit_host'], rabbit_virtual_host=context['rabbit_virtual_host'], rabbit_userid=context['rabbit_userid'], rabbit_password=context['rabbit_password'])
|
||||
utils.relation_set(keystone_os_username=context['keystone_os_username'], keystone_os_password=context['keystone_os_password'], keystone_os_tenant=context['keystone_os_tenant'],
|
||||
keystone_host=context['keystone_host'], keystone_port=context['keystone_port'])
|
||||
for relid in utils.relation_ids('ceilometer-service'):
|
||||
context['rid'] = relid
|
||||
utils.relation_set(**context)
|
||||
else:
|
||||
# still waiting
|
||||
utils.juju_log("INFO", "ceilometer: rabbit and keystone credentials not yet received from peer.")
|
||||
utils.juju_log("INFO", "ceilometer: rabbit and keystone " + \
|
||||
"credentials not yet received from peer.")
|
||||
|
||||
utils.do_hooks({
|
||||
"install": install,
|
||||
|
@ -133,7 +152,6 @@ utils.do_hooks({
|
|||
"config-changed": config_changed,
|
||||
"identity-service-relation-joined": keystone_joined,
|
||||
"identity-service-relation-changed": keystone_changed,
|
||||
"ceilometer-service-relation-joined": ceilometer_joined,
|
||||
"ceilometer-service-relation-changed": ceilometer_changed
|
||||
"ceilometer-service-relation-joined": ceilometer_joined
|
||||
})
|
||||
sys.exit(0)
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ ubuntu_openstack_release = {
|
|||
'oneiric': 'diablo',
|
||||
'precise': 'essex',
|
||||
'quantal': 'folsom',
|
||||
'raring' : 'grizzly'
|
||||
'raring': 'grizzly'
|
||||
}
|
||||
|
||||
|
||||
|
@ -67,6 +67,7 @@ def get_os_codename_install_source(src):
|
|||
if v in src:
|
||||
return v
|
||||
|
||||
|
||||
def get_os_codename_version(vers):
|
||||
'''Determine OpenStack codename from version number.'''
|
||||
try:
|
||||
|
@ -142,7 +143,7 @@ def configure_installation_source(rel):
|
|||
subprocess.check_call(["add-apt-repository", "-y", src])
|
||||
elif rel[:3] == "deb":
|
||||
l = len(rel.split('|'))
|
||||
if l == 2:
|
||||
if l == 2:
|
||||
src, key = rel.split('|')
|
||||
juju_log("Importing PPA key from keyserver for %s" % src)
|
||||
_import_key(key)
|
||||
|
@ -166,7 +167,8 @@ def configure_installation_source(rel):
|
|||
|
||||
if ca_rel == 'folsom/staging':
|
||||
# staging is just a regular PPA.
|
||||
cmd = 'add-apt-repository -y ppa:ubuntu-cloud-archive/folsom-staging'
|
||||
cmd = 'add-apt-repository -y ppa:ubuntu-cloud-archive/'\
|
||||
'folsom-staging'
|
||||
subprocess.check_call(cmd.split(' '))
|
||||
return
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@ import apt_pkg as apt
|
|||
import re
|
||||
import ceilometer_utils
|
||||
|
||||
|
||||
def do_hooks(hooks):
|
||||
hook = os.path.basename(sys.argv[0])
|
||||
|
||||
|
@ -44,6 +45,7 @@ except ImportError:
|
|||
install('python-jinja2')
|
||||
import jinja2
|
||||
|
||||
|
||||
def render_template(template_name, context, template_dir=TEMPLATES_DIR):
|
||||
templates = jinja2.Environment(
|
||||
loader=jinja2.FileSystemLoader(template_dir)
|
||||
|
@ -65,6 +67,7 @@ CLOUD_ARCHIVE_POCKETS = {
|
|||
'precise-grizzly/proposed': 'precise-proposed/grizzly'
|
||||
}
|
||||
|
||||
|
||||
def configure_source():
|
||||
source = str(config_get('openstack-origin'))
|
||||
if not source:
|
||||
|
@ -105,18 +108,6 @@ def configure_source():
|
|||
TCP = 'TCP'
|
||||
UDP = 'UDP'
|
||||
|
||||
def update_ports():
|
||||
# extract old port from config and close it
|
||||
ceilometer_config = open(ceilometer_utils.CEILOMETER_CONF).read()
|
||||
exps = re.search("^#*metering_api_port\s*=\s*(\w+)", ceilometer_config, re.MULTILINE)
|
||||
if exps:
|
||||
current_api_port = exps.group(1)
|
||||
if current_api_port:
|
||||
unexpose(current_api_port)
|
||||
|
||||
port = config_get("service-port")
|
||||
if port:
|
||||
expose(port)
|
||||
|
||||
def expose(port, protocol='TCP'):
|
||||
cmd = [
|
||||
|
@ -125,6 +116,7 @@ def expose(port, protocol='TCP'):
|
|||
]
|
||||
subprocess.check_call(cmd)
|
||||
|
||||
|
||||
def unexpose(port, protocol='TCP'):
|
||||
cmd = [
|
||||
'close-port',
|
||||
|
@ -132,6 +124,7 @@ def unexpose(port, protocol='TCP'):
|
|||
]
|
||||
subprocess.check_call(cmd)
|
||||
|
||||
|
||||
def juju_log(severity, message):
|
||||
cmd = [
|
||||
'juju-log',
|
||||
|
@ -232,6 +225,7 @@ def get_host_ip(hostname=unit_get('private-address')):
|
|||
pass
|
||||
return None
|
||||
|
||||
|
||||
def _service_ctl(service, action):
|
||||
subprocess.check_call(['service', service, action])
|
||||
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
ceilometer:
|
||||
debug: "true"
|
||||
verbose: "true"
|
||||
openstack-origin: "ppa:openstack-ubuntu-testing/grizzly-trunk-testing"
|
||||
config-file: "/etc/ceilometer/ceilometer.conf"
|
||||
service-port: 8777
|
|
@ -8,8 +8,6 @@ description: |
|
|||
framework should be easily expandable to collect for other needs. To that
|
||||
effect, Ceilometer should be able to share collected data with a variety of consumers.
|
||||
provides:
|
||||
endpoint:
|
||||
interface: http
|
||||
ceilometer-service:
|
||||
interface: ceilometer
|
||||
requires:
|
||||
|
|
17
readme
17
readme
|
@ -1,17 +0,0 @@
|
|||
Overview
|
||||
--------
|
||||
|
||||
This charm provides the Ceilometer service for OpenStack. It is intended to
|
||||
be used alongside the other OpenStack components, starting with the Folsom
|
||||
release.
|
||||
|
||||
Ceilometer is made up of 2 separate services: an API service, and a collector
|
||||
service. This charm allows them to be deployed in different
|
||||
combination, depending on user preference and requirements.
|
||||
|
||||
This charm was developed to support deploying Folsom on both
|
||||
Ubuntu Quantal and Ubuntu Precise. Since Ceilometer is only available for
|
||||
Ubuntu 12.04 via the Ubuntu Cloud Archive, deploying this charm to a
|
||||
Precise machine will by default install Ceilometer and its dependencies from
|
||||
the Cloud Archive.
|
||||
|
|
@ -9,7 +9,7 @@ rabbit_port=5672
|
|||
rabbit_userid={{ rabbit_userid }}
|
||||
rabbit_password={{ rabbit_password }}
|
||||
rabbit_virtual_host={{ rabbit_virtual_host }}
|
||||
database_connection={{ db_connection }}
|
||||
database_connection=mongodb://{{ db_host }}:{{ db_port }}/{{ db_name }}
|
||||
os_auth_url=http://{{ keystone_host }}:{{ keystone_port }}/v2.0
|
||||
os_tenant_name = {{ keystone_os_tenant }}
|
||||
os_username = {{ keystone_os_username }}
|
||||
|
|
Loading…
Reference in New Issue