fixes due to review

This commit is contained in:
yolanda.robla@canonical.com 2013-02-14 12:45:03 +01:00
parent f6380d7393
commit af33c6fe17
11 changed files with 115 additions and 87 deletions

41
README.md Normal file
View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -1 +1,2 @@

View File

@ -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

View File

@ -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])

View File

@ -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

View File

@ -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
View File

@ -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.

View File

@ -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 }}