From 4391e60be74441b8cd3ff3eddcf351d381b4301f Mon Sep 17 00:00:00 2001 From: Felipe Reyes Date: Fri, 24 Oct 2014 10:20:36 -0300 Subject: [PATCH] Add relation with memcached to use it to store nova-authconsole tokens Fix bug #989337 --- hooks/cache-relation-broken | 1 + hooks/cache-relation-changed | 1 + hooks/cache-relation-departed | 1 + hooks/cache-relation-joined | 1 + hooks/nova_cc_context.py | 21 ++++++++++- hooks/nova_cc_hooks.py | 9 +++++ metadata.yaml | 2 + templates/folsom/nova.conf | 5 +++ templates/grizzly/nova.conf | 5 +++ templates/havana/nova.conf | 4 ++ templates/icehouse/nova.conf | 4 ++ unit_tests/test_nova_cc_contexts.py | 58 +++++++++++++++++++++++++++++ 12 files changed, 111 insertions(+), 1 deletion(-) create mode 120000 hooks/cache-relation-broken create mode 120000 hooks/cache-relation-changed create mode 120000 hooks/cache-relation-departed create mode 120000 hooks/cache-relation-joined create mode 100644 unit_tests/test_nova_cc_contexts.py diff --git a/hooks/cache-relation-broken b/hooks/cache-relation-broken new file mode 120000 index 00000000..f6702415 --- /dev/null +++ b/hooks/cache-relation-broken @@ -0,0 +1 @@ +nova_cc_hooks.py \ No newline at end of file diff --git a/hooks/cache-relation-changed b/hooks/cache-relation-changed new file mode 120000 index 00000000..f6702415 --- /dev/null +++ b/hooks/cache-relation-changed @@ -0,0 +1 @@ +nova_cc_hooks.py \ No newline at end of file diff --git a/hooks/cache-relation-departed b/hooks/cache-relation-departed new file mode 120000 index 00000000..f6702415 --- /dev/null +++ b/hooks/cache-relation-departed @@ -0,0 +1 @@ +nova_cc_hooks.py \ No newline at end of file diff --git a/hooks/cache-relation-joined b/hooks/cache-relation-joined new file mode 120000 index 00000000..f6702415 --- /dev/null +++ b/hooks/cache-relation-joined @@ -0,0 +1 @@ +nova_cc_hooks.py \ No newline at end of file diff --git a/hooks/nova_cc_context.py b/hooks/nova_cc_context.py index bb3db4fb..94557ffd 100644 --- a/hooks/nova_cc_context.py +++ b/hooks/nova_cc_context.py @@ -1,6 +1,6 @@ from charmhelpers.core.hookenv import ( config, relation_ids, relation_set, log, ERROR, - unit_get, related_units, relation_get) + unit_get, related_units, relation_get, relations_for_id) from charmhelpers.fetch import apt_install, filter_installed_packages from charmhelpers.contrib.openstack import context, neutron, utils @@ -281,3 +281,22 @@ class NovaIPv6Context(context.BindHostContext): ctxt = super(NovaIPv6Context, self).__call__() ctxt['use_ipv6'] = config('prefer-ipv6') return ctxt + + +class InstanceConsoleContext(context.OSContextGenerator): + interfaces = [] + + def __call__(self): + ctxt = {} + servers = [] + try: + for rid in relation_ids('cache'): + for rel in relations_for_id(rid): + servers.append({'private-address': rel['private-address'], + 'port': rel['port']}) + except Exception as ex: + log(str(ex)) + servers = [] + + ctxt['memcached_servers'] = servers + return ctxt diff --git a/hooks/nova_cc_hooks.py b/hooks/nova_cc_hooks.py index 7fd18916..5fe9eea7 100755 --- a/hooks/nova_cc_hooks.py +++ b/hooks/nova_cc_hooks.py @@ -852,6 +852,15 @@ def neutron_api_relation_broken(): quantum_joined(rid=rid) +@hooks.hook('cache-relation-joined', + 'cache-relation-departed', + 'cache-relation-changed', + 'cache-relation-broken') +@restart_on_change(restart_map()) +def memcached_joined(): + CONFIGS.write(NOVA_CONF) + + def main(): try: hooks.execute(sys.argv) diff --git a/metadata.yaml b/metadata.yaml index 573e5232..be2440de 100644 --- a/metadata.yaml +++ b/metadata.yaml @@ -40,6 +40,8 @@ requires: nova-vmware: interface: nova-vmware scope: container + cache: + interface: memcache peers: cluster: interface: nova-ha diff --git a/templates/folsom/nova.conf b/templates/folsom/nova.conf index ed0f13ac..bbc5d832 100644 --- a/templates/folsom/nova.conf +++ b/templates/folsom/nova.conf @@ -21,6 +21,11 @@ volumes_path=/var/lib/nova/volumes enabled_apis=ec2,osapi_compute,metadata auth_strategy=keystone compute_driver=libvirt.LibvirtDriver + +{% if memcached_servers %} +memcached_servers = {%for s in memcached_servers %}{% if loop.index0 != 0 %},{% endif %}{{s['private-address']}}:{{s['port']}}{% endfor %} +{% endif %} + {% if keystone_ec2_url -%} keystone_ec2_url = {{ keystone_ec2_url }} {% endif -%} diff --git a/templates/grizzly/nova.conf b/templates/grizzly/nova.conf index 9c308fae..e67c32fc 100644 --- a/templates/grizzly/nova.conf +++ b/templates/grizzly/nova.conf @@ -20,6 +20,11 @@ volumes_path=/var/lib/nova/volumes enabled_apis=ec2,osapi_compute,metadata auth_strategy=keystone compute_driver=libvirt.LibvirtDriver + +{% if memcached_servers %} +memcached_servers = {%for s in memcached_servers %}{% if loop.index0 != 0 %},{% endif %}{{s['private-address']}}:{{s['port']}}{% endfor %} +{% endif %} + {% if keystone_ec2_url -%} keystone_ec2_url = {{ keystone_ec2_url }} {% endif -%} diff --git a/templates/havana/nova.conf b/templates/havana/nova.conf index 24a0fcfd..22cd8ed9 100644 --- a/templates/havana/nova.conf +++ b/templates/havana/nova.conf @@ -26,6 +26,10 @@ scheduler_default_filters = RetryFilter,AvailabilityZoneFilter,CoreFilter,RamFil cpu_allocation_ratio = {{ cpu_allocation_ratio }} use_syslog={{ use_syslog }} +{% if memcached_servers %} +memcached_servers = {%for s in memcached_servers %}{% if loop.index0 != 0 %},{% endif %}{{s['private-address']}}:{{s['port']}}{% endfor %} +{% endif %} + {% if keystone_ec2_url -%} keystone_ec2_url = {{ keystone_ec2_url }} {% endif -%} diff --git a/templates/icehouse/nova.conf b/templates/icehouse/nova.conf index c2b62e42..a0e19da0 100644 --- a/templates/icehouse/nova.conf +++ b/templates/icehouse/nova.conf @@ -38,6 +38,10 @@ ram_allocation_ratio = {{ ram_allocation_ratio }} use_syslog={{ use_syslog }} +{% if memcached_servers %} +memcached_servers = {%for s in memcached_servers %}{% if loop.index0 != 0 %},{% endif %}{{s['private-address']}}:{{s['port']}}{% endfor %} +{% endif %} + {% if keystone_ec2_url -%} keystone_ec2_url = {{ keystone_ec2_url }} {% endif -%} diff --git a/unit_tests/test_nova_cc_contexts.py b/unit_tests/test_nova_cc_contexts.py new file mode 100644 index 00000000..1945d949 --- /dev/null +++ b/unit_tests/test_nova_cc_contexts.py @@ -0,0 +1,58 @@ +from __future__ import print_function + +import mock +import nova_cc_context as context + +from charmhelpers.contrib.openstack import utils + +from test_utils import CharmTestCase + + +TO_PATCH = [ + 'apt_install', + 'filter_installed_packages', + 'relation_ids', + 'relation_get', + 'related_units', + 'config', + 'log', + 'unit_get', + 'relations_for_id', +] + + +def fake_log(msg, level=None): + level = level or 'INFO' + print('[juju test log (%s)] %s' % (level, msg)) + + +class NovaComputeContextTests(CharmTestCase): + def setUp(self): + super(NovaComputeContextTests, self).setUp(context, TO_PATCH) + self.relation_get.side_effect = self.test_relation.get + self.config.side_effect = self.test_config.get + self.log.side_effect = fake_log + + @mock.patch.object(utils, 'os_release') + def test_instance_console_context_without_memcache(self, os_release): + self.unit_get.return_value = '127.0.0.1' + self.relation_ids.return_value = 'cache:0' + self.related_units.return_value = 'memcached/0' + instance_console = context.InstanceConsoleContext() + os_release.return_value = 'icehouse' + self.assertEqual({'memcached_servers': []}, + instance_console()) + + @mock.patch.object(utils, 'os_release') + def test_instance_console_context_with_memcache(self, os_release): + memcached_servers = [{'private-address': '127.0.1.1', + 'port': '11211'}] + self.unit_get.return_value = '127.0.0.1' + self.relation_ids.return_value = ['cache:0'] + self.relations_for_id.return_value = memcached_servers + self.related_units.return_value = 'memcached/0' + instance_console = context.InstanceConsoleContext() + os_release.return_value = 'icehouse' + self.maxDiff = None + self.assertEqual({'memcached_servers': memcached_servers}, + instance_console())