diff --git a/README.md b/README.md new file mode 100644 index 0000000..498bce1 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +Overview +-------- + +This charm provides the Ceilometer Compute Agent for OpenStack. +It must be deployed in each nova-compute node. +See Ceilometer charm (lp:~yolanda.robla/charms/precise/ceilometer/trunk) +for usage details. diff --git a/hooks/ceilometer_utils.py b/hooks/ceilometer_utils.py index 24445e8..ff2012e 100644 --- a/hooks/ceilometer_utils.py +++ b/hooks/ceilometer_utils.py @@ -1,6 +1,11 @@ import os import uuid -NOVA_CONF="/etc/nova/nova.conf" -CEILOMETER_CONF="/etc/ceilometer/ceilometer.conf" +NOVA_CONF = "/etc/nova/nova.conf" +CEILOMETER_CONF = "/etc/ceilometer/ceilometer.conf" CEILOMETER_COMPUTE_SERVICES = ['ceilometer-agent-compute'] +CEILOMETER_PACKAGES = ['ceilometer-common', 'ceilometer-agent-compute'] +NOVA_SETTINGS = ['instance_usage_audit=True', + 'instance_usage_audit_period=hour', + 'notification_driver=nova.openstack.common.notifier.rabbit_notifier', + 'notification_driver=ceilometer.compute.nova_notifier'] diff --git a/hooks/hooks.py b/hooks/hooks.py index 043da50..8cef934 100755 --- a/hooks/hooks.py +++ b/hooks/hooks.py @@ -6,50 +6,56 @@ import os import utils import ceilometer_utils + def install(): utils.configure_source() - packages = ['ceilometer-common', 'ceilometer-agent-compute'] - utils.install(*packages) - -def container_joined(): - utils.modify_config_file(ceilometer_utils.NOVA_CONF) + utils.install(*ceilometer_utils.CEILOMETER_PACKAGES) + utils.modify_config_file(ceilometer_utils.NOVA_CONF, + *ceilometer_utils.NOVA_SETTINGS) utils.restart(*ceilometer_utils.CEILOMETER_COMPUTE_SERVICES) -def ceilometer_joined(): - pass def get_ceilometer_conf(): for relid in utils.relation_ids('ceilometer-service'): for unit in utils.relation_list(relid): conf = { - 'metering_secret': utils.relation_get('metering_secret', unit, relid), + 'metering_secret': utils.relation_get('metering_secret', + unit, relid), 'rabbit_host': utils.relation_get('rabbit_host', unit, relid), - 'rabbit_virtual_host': utils.relation_get('rabbit_virtual_host', unit, relid), - 'rabbit_userid': utils.relation_get('rabbit_userid', unit, relid), - 'rabbit_password': utils.relation_get('rabbit_password', unit, relid), - 'keystone_os_username': utils.relation_get('keystone_os_username', unit, relid), - 'keystone_os_password': utils.relation_get('keystone_os_password', unit, relid), - 'keystone_os_tenant': utils.relation_get('keystone_os_tenant', unit, relid), - 'keystone_host': utils.relation_get('keystone_host', unit, relid), - 'keystone_port': utils.relation_get('keystone_port', unit, relid) + 'rabbit_virtual_host': utils.relation_get( + 'rabbit_virtual_host', unit, relid), + 'rabbit_userid': utils.relation_get('rabbit_userid', + unit, relid), + 'rabbit_password': utils.relation_get('rabbit_password', + unit, relid), + 'keystone_os_username': utils.relation_get( + 'keystone_os_username', unit, relid), + 'keystone_os_password': utils.relation_get( + 'keystone_os_password', unit, relid), + 'keystone_os_tenant': utils.relation_get('keystone_os_tenant', + unit, relid), + 'keystone_host': utils.relation_get('keystone_host', + unit, relid), + 'keystone_port': utils.relation_get('keystone_port', + unit, relid) } if None not in conf.itervalues(): return conf return None + def ceilometer_changed(): # read settings context = get_ceilometer_conf() if context: 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)) utils.restart(*ceilometer_utils.CEILOMETER_COMPUTE_SERVICES) utils.do_hooks({ "install": install, - "container-relation-joined": container_joined, - "ceilometer-service-relation-joined": ceilometer_joined, "ceilometer-service-relation-changed": ceilometer_changed }) sys.exit(0) diff --git a/hooks/lib/openstack_common.py b/hooks/lib/openstack_common.py index c9cbb3b..e686399 100644 --- a/hooks/lib/openstack_common.py +++ b/hooks/lib/openstack_common.py @@ -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 diff --git a/hooks/utils.py b/hooks/utils.py index d7cbc0c..01306ad 100644 --- a/hooks/utils.py +++ b/hooks/utils.py @@ -134,26 +134,21 @@ def get_os_version(package=None): else: return None -def modify_config_file(nova_conf): - f = open(nova_conf, 'r') - data = f.readlines() - f.close() +def modify_config_file(nova_conf, values): + try: + config = ConfigParser.ConfigParser() + f = open(nova_conf, "r+") + config.readfp(f) - # if lines are not in the script, add there - contents = ['instance_usage_audit=True', 'instance_usage_audit_period=hour', 'notification_driver=nova.openstack.common.notifier.rabbit_notifier', - 'notification_driver=ceilometer.compute.nova_notifier'] - for content in contents: - found = False - for line in data: - if content in line: - found = True - break + # add needed config lines - tuple with section,key,value + for value in values: + config.set(value[0], value[1], value[2]) + config.write() - # not found it, write and continue - if not found: - f1 = open(nova_conf, 'a') - f1.write(content+"\n") - f1.close() + f.close() + except IOError as e: + juju_log('ERROR', 'nova config file must exist at this point') + sys.exit(1) def relation_ids(relation): cmd = [ diff --git a/readme b/readme deleted file mode 100644 index caec721..0000000 --- a/readme +++ /dev/null @@ -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. -