Merge lp:~freyes/charms/trusty/nova-cloud-controller/bug-989337 into lp:~openstack-charmers-archive/charms/trusty/nova-cloud-controller/next

Proposed by Felipe Reyes
Status: Superseded
Proposed branch: lp:~freyes/charms/trusty/nova-cloud-controller/bug-989337
Merge into: lp:~openstack-charmers-archive/charms/trusty/nova-cloud-controller/next
Diff against target: 345 lines (+133/-22)
10 files modified
hooks/nova_cc_context.py (+36/-17)
hooks/nova_cc_hooks.py (+9/-0)
hooks/nova_cc_utils.py (+3/-1)
metadata.yaml (+2/-0)
templates/folsom/nova.conf (+5/-0)
templates/grizzly/nova.conf (+5/-0)
templates/havana/nova.conf (+4/-0)
templates/icehouse/nova.conf (+4/-0)
unit_tests/test_nova_cc_contexts.py (+56/-0)
unit_tests/test_nova_cc_utils.py (+9/-4)
To merge this branch: bzr merge lp:~freyes/charms/trusty/nova-cloud-controller/bug-989337
Reviewer Review Type Date Requested Status
Edward Hope-Morley Needs Fixing
OpenStack Charmers Pending
Review via email: mp+239671@code.launchpad.net

This proposal has been superseded by a proposal from 2014-11-10.

Description of the change

This branch extends the charm to install python-memcache, and configure nova.conf adding the key memcached_servers when a relationship with memcached service is established.

If multiple units of memcached are available, all of them are used (memcached_servers = host1:port1,host2:port,host3:port3)

To post a comment you must log in.
Revision history for this message
Ryan Beisner (1chb1n) wrote :

UOSCI bot says:
charm_lint_check #771 nova-cloud-controller-next for freyes mp239671
    LINT OK: believed to pass, but you should confirm results

LINT Results (max last 4 lines) from
/var/lib/jenkins/workspace/charm_lint_check/make-lint.771:
I: config.yaml: option haproxy-client-timeout has no default value
I: config.yaml: option ssl_cert has no default value
I: config.yaml: option nvp-l3-uuid has no default value
I: config.yaml: option os-internal-network has no default value

Full lint output: http://paste.ubuntu.com/8694351/
Build: http://10.98.191.181:8080/job/charm_lint_check/771/

Revision history for this message
Ryan Beisner (1chb1n) wrote :

UOSCI bot says:
charm_unit_test #579 nova-cloud-controller-next for freyes mp239671
    UNIT FAIL: unit-test failed

UNIT Results (max last 4 lines) from
/var/lib/jenkins/workspace/charm_unit_test/unit-test.579:
Ran 4 tests in 0.150s

FAILED (errors=2)
make: *** [unit_test] Error 1

Full unit output: http://paste.ubuntu.com/8694352/
Build: http://10.98.191.181:8080/job/charm_unit_test/579/

Revision history for this message
Ryan Beisner (1chb1n) wrote :

UOSCI bot says:
charm_amulet_test #304 nova-cloud-controller-next for freyes mp239671
    AMULET OK: believed to pass, but you should confirm results

AMULET Results (max last 4 lines) from
/var/lib/jenkins/workspace/charm_amulet_test/make-test.304:
juju-test.conductor DEBUG : Tearing down osci-sv05 juju environment
juju-test.conductor DEBUG : Calling "juju destroy-environment -y osci-sv05"
WARNING cannot delete security group "juju-osci-sv05-0". Used by another environment?
juju-test INFO : Results: 3 passed, 0 failed, 0 errored

Full amulet output: http://paste.ubuntu.com/8694683/
Build: http://10.98.191.181:8080/job/charm_amulet_test/304/

Revision history for this message
Ryan Beisner (1chb1n) wrote :

UOSCI bot says:
charm_unit_test #582 nova-cloud-controller-next for freyes mp239671
    UNIT FAIL: unit-test failed

UNIT Results (max last 4 lines) from
/var/lib/jenkins/workspace/charm_unit_test/unit-test.582:
Ran 4 tests in 0.153s

FAILED (errors=2)
make: *** [unit_test] Error 1

Full unit output: http://paste.ubuntu.com/8705925/
Build: http://10.98.191.181:8080/job/charm_unit_test/582/

Revision history for this message
Ryan Beisner (1chb1n) wrote :

UOSCI bot says:
charm_lint_check #774 nova-cloud-controller-next for freyes mp239671
    LINT OK: believed to pass, but you should confirm results

LINT Results (max last 4 lines) from
/var/lib/jenkins/workspace/charm_lint_check/make-lint.774:
I: config.yaml: option haproxy-client-timeout has no default value
I: config.yaml: option ssl_cert has no default value
I: config.yaml: option nvp-l3-uuid has no default value
I: config.yaml: option os-internal-network has no default value

Full lint output: http://paste.ubuntu.com/8705924/
Build: http://10.98.191.181:8080/job/charm_lint_check/774/

Revision history for this message
Ryan Beisner (1chb1n) wrote :

UOSCI bot says:
charm_amulet_test #307 nova-cloud-controller-next for freyes mp239671
    AMULET FAIL: amulet-test failed

AMULET Results (max last 4 lines) from
/var/lib/jenkins/workspace/charm_amulet_test/make-test.307:
    return self.read(buflen)
  File "/usr/lib/python2.7/ssl.py", line 260, in read
    return self._sslobj.read(len)
socket.error: [Errno 110] Connection timed out

Full amulet output: http://paste.ubuntu.com/8706467/
Build: http://10.98.191.181:8080/job/charm_amulet_test/307/

Revision history for this message
Edward Hope-Morley (hopem) wrote :

I'm getting a couple of unit test failures here. Looks like a couple of extra mocks needed - see attached u/t output.

review: Needs Fixing
Revision history for this message
Edward Hope-Morley (hopem) wrote :
Download full text (3.7 KiB)

Hmm can't attach so pasting:

$ make unit_test
Starting unit tests...
nose.plugins.cover: ERROR: Coverage not available: unable to import coverage module
test_instance_console_context_with_memcache (unit_tests.test_nova_cc_contexts.NovaComputeContextTests) ... ok
test_instance_console_context_without_memcache (unit_tests.test_nova_cc_contexts.NovaComputeContextTests) ... ok
Failure: OSError ([Errno 2] No such file or directory) ... ERROR
Failure: OSError ([Errno 2] No such file or directory) ... ERROR

======================================================================
ERROR: Failure: OSError ([Errno 2] No such file or directory)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/nose/loader.py", line 411, in loadTestsFromName
    addr.filename, addr.module)
  File "/usr/lib/python2.7/dist-packages/nose/importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/usr/lib/python2.7/dist-packages/nose/importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/gizmo/Documents/reviews/nova-cloud-controller/bug-989337/unit_tests/test_nova_cc_hooks.py", line 6, in <module>
    import nova_cc_utils as utils
  File "hooks/nova_cc_utils.py", line 142, in <module>
    nova_cc_context.NeutronPostgresqlDBContext(),
  File "hooks/nova_cc_context.py", line 268, in __init__
    self).__init__(config('neutron-database'))
  File "hooks/charmhelpers/core/hookenv.py", line 44, in wrapper
    res = func(*args, **kwargs)
  File "hooks/charmhelpers/core/hookenv.py", line 281, in config
    config_data = json.loads(subprocess.check_output(config_cmd_line))
  File "/usr/lib/python2.7/subprocess.py", line 566, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

======================================================================
ERROR: Failure: OSError ([Errno 2] No such file or directory)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/nose/loader.py", line 411, in loadTestsFromName
    addr.filename, addr.module)
  File "/usr/lib/python2.7/dist-packages/nose/importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/usr/lib/python2.7/dist-packages/nose/importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/gizmo/Documents/reviews/nova-cloud-controller/bug-989337/unit_tests/test_nova_cc_utils.py", line 11, in <module>
    import nova_cc_utils as utils
  File "hooks/nova_cc_utils.py", line 142, in <module>
    nova_cc_context.NeutronPostgresqlDBContext(),
  File "hooks/nova_cc_context.py", line 268, in __init__
    self).__init__(config('neutron-database'))
  File "hooks/charmhelpers/core/hookenv.py", line 44, in wrapper
    res = func(*args, **kwa...

Read more...

Revision history for this message
Edward Hope-Morley (hopem) wrote :

FWIW, other than the above this lgtm

124. By Felipe Reyes

Changed the way charmhelpers.core.hookenv.config is imported

This change allows to easily monkey patch the function with a mock,
otherwise the 'config' function is left imported at the module level.

Revision history for this message
Felipe Reyes (freyes) wrote :

Edward, I fixed the broken tests, the patch was a little bit larger than what I expected, but they are working OK now.

Name Stmts Miss Cover Missing
-----------------------------------------------------
hooks/nova_cc_context 166 112 33% 21-28, 39-41, 48-59, 65-79, 86-104, 116-169, 180-195, 203-204, 208, 212-214, 219, 222-236, 242-256, 273-276, 281-283, 297-299
hooks/nova_cc_hooks 447 146 67% 132-135, 148-149, 173, 184-185, 189, 224, 229-234, 245, 325-328, 336-339, 345-348, 358-374, 383-385, 395-409, 413-422, 508, 518, 522-523, 576, 582-592, 597-608, 618-628, 633-672, 682-697, 705-709, 734-743, 767, 772-780, 806, 861, 865-868
hooks/nova_cc_utils 442 111 75% 296-301, 312-315, 325-326, 382, 384, 428-430, 434, 448-456, 463-468, 472-486, 592-594, 599-602, 607, 611, 635-636, 650-652, 673-674, 680-703, 707-713, 717-723, 729, 735, 742, 753-757, 842, 902-908, 912-914, 918-921, 925-937
-----------------------------------------------------
TOTAL 1055 369 65%
----------------------------------------------------------------------
Ran 99 tests in 7.518s

Revision history for this message
Ryan Beisner (1chb1n) wrote :

UOSCI bot says:
charm_lint_check #922 nova-cloud-controller-next for freyes mp239671
    LINT OK: passed

LINT Results (max last 5 lines):
  I: config.yaml: option os-admin-network has no default value
  I: config.yaml: option haproxy-client-timeout has no default value
  I: config.yaml: option ssl_cert has no default value
  I: config.yaml: option nvp-l3-uuid has no default value
  I: config.yaml: option os-internal-network has no default value

Full lint test output: http://paste.ubuntu.com/8822840/
Build: http://10.98.191.181:8080/job/charm_lint_check/922/

Revision history for this message
Ryan Beisner (1chb1n) wrote :

UOSCI bot says:
charm_unit_test #757 nova-cloud-controller-next for freyes mp239671
    UNIT OK: passed

UNIT Results (max last 5 lines):
  hooks/nova_cc_hooks 447 146 67% 132-135, 148-149, 173, 184-185, 189, 224, 229-234, 245, 325-328, 336-339, 345-348, 358-374, 383-385, 395-409, 413-422, 508, 518, 522-523, 576, 582-592, 597-608, 618-628, 633-672, 682-697, 705-709, 734-743, 767, 772-780, 806, 861, 865-868
  hooks/nova_cc_utils 442 111 75% 296-301, 312-315, 325-326, 382, 384, 428-430, 434, 448-456, 463-468, 472-486, 592-594, 599-602, 607, 611, 635-636, 650-652, 673-674, 680-703, 707-713, 717-723, 729, 735, 742, 753-757, 842, 902-908, 912-914, 918-921, 925-937
  TOTAL 1055 369 65%
  Ran 99 tests in 8.707s
  OK

Full unit test output: http://paste.ubuntu.com/8822843/
Build: http://10.98.191.181:8080/job/charm_unit_test/757/

Revision history for this message
Ryan Beisner (1chb1n) wrote :

UOSCI bot says:
charm_amulet_test #340 nova-cloud-controller-next for freyes mp239671
    AMULET OK: passed

AMULET Results (max last 5 lines):
  juju-test.conductor.15-basic-trusty-icehouse RESULT :
  juju-test.conductor DEBUG : Tearing down osci-sv07 juju environment
  juju-test.conductor DEBUG : Calling "juju destroy-environment -y osci-sv07"
  WARNING cannot delete security group "juju-osci-sv07-0". Used by another environment?
  juju-test INFO : Results: 3 passed, 0 failed, 0 errored

Full amulet test output: http://paste.ubuntu.com/8823194/
Build: http://10.98.191.181:8080/job/charm_amulet_test/340/

125. By Felipe Reyes

Revert "Changed the way charmhelpers.core.hookenv.config is imported"

126. By Felipe Reyes

Patch nova_cc_utils config() before it's imported by nova_cc_context

127. By Felipe Reyes

Format message, set proper level and include exception

128. By Felipe Reyes

Renamed relation from 'cache' to 'memcache'

129. By Felipe Reyes

Commit after merge

130. By Felipe Reyes

Commit after pulling changes from upstream

131. By Felipe Reyes

Added IPv6 support

Added test to check that IPv6 addresses are properly formatted.

132. By Felipe Reyes

Commit after merge

133. By Felipe Reyes

Replace "Couldn't get caching servers" with "Couldn't get memcache servers"

134. By Felipe Reyes

Refactor the way memcached_servers config is put in the templates

Instead of formatting the string with Jinja2, it's formatted with python
and passed to the template as a string.

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added symlink 'hooks/cache-relation-broken'
=== target is u'nova_cc_hooks.py'
=== added symlink 'hooks/cache-relation-changed'
=== target is u'nova_cc_hooks.py'
=== added symlink 'hooks/cache-relation-departed'
=== target is u'nova_cc_hooks.py'
=== added symlink 'hooks/cache-relation-joined'
=== target is u'nova_cc_hooks.py'
=== modified file 'hooks/nova_cc_context.py'
--- hooks/nova_cc_context.py 2014-10-13 16:18:58 +0000
+++ hooks/nova_cc_context.py 2014-11-04 18:12:57 +0000
@@ -1,7 +1,7 @@
1from charmhelpers.core.hookenv import (1from charmhelpers.core.hookenv import (
2 config, relation_ids, relation_set, log, ERROR,2 relation_ids, relation_set, log, ERROR,
3 unit_get, related_units, relation_get)3 unit_get, related_units, relation_get, relations_for_id)
44from charmhelpers.core import hookenv
5from charmhelpers.fetch import apt_install, filter_installed_packages5from charmhelpers.fetch import apt_install, filter_installed_packages
6from charmhelpers.contrib.openstack import context, neutron, utils6from charmhelpers.contrib.openstack import context, neutron, utils
77
@@ -181,14 +181,14 @@
181 if https():181 if https():
182 scheme = 'https'182 scheme = 'https'
183183
184 if config('prefer-ipv6'):184 if hookenv.config('prefer-ipv6'):
185 if is_clustered():185 if is_clustered():
186 addr = '[%s]' % config(vip_setting)186 addr = '[%s]' % hookenv.config(vip_setting)
187 else:187 else:
188 addr = '[%s]' % get_ipv6_addr(exc_list=[config('vip')])[0]188 addr = '[%s]' % get_ipv6_addr(exc_list=[hookenv.config('vip')])[0]
189 else:189 else:
190 if is_clustered():190 if is_clustered():
191 addr = config(vip_setting)191 addr = hookenv.config(vip_setting)
192 else:192 else:
193 addr = unit_get('private-address')193 addr = unit_get('private-address')
194194
@@ -209,8 +209,8 @@
209209
210 @property210 @property
211 def neutron_security_groups(self):211 def neutron_security_groups(self):
212 sec_groups = (config('neutron-security-groups') or212 sec_groups = (hookenv.config('neutron-security-groups') or
213 config('quantum-security-groups'))213 hookenv.config('quantum-security-groups'))
214 return sec_groups.lower() == 'yes'214 return sec_groups.lower() == 'yes'
215215
216 def _ensure_packages(self):216 def _ensure_packages(self):
@@ -220,9 +220,9 @@
220220
221 def __call__(self):221 def __call__(self):
222 ctxt = super(NeutronCCContext, self).__call__()222 ctxt = super(NeutronCCContext, self).__call__()
223 ctxt['external_network'] = config('neutron-external-network')223 ctxt['external_network'] = hookenv.config('neutron-external-network')
224 if config('quantum-plugin') in ['nvp', 'nsx']:224 if hookenv.config('quantum-plugin') in ['nvp', 'nsx']:
225 _config = config()225 _config = hookenv.config()
226 for k, v in _config.iteritems():226 for k, v in _config.iteritems():
227 if k.startswith('nvp'):227 if k.startswith('nvp'):
228 ctxt[k.replace('-', '_')] = v228 ctxt[k.replace('-', '_')] = v
@@ -251,7 +251,7 @@
251 ctxt['service_port']251 ctxt['service_port']
252 )252 )
253 ctxt['keystone_ec2_url'] = ec2_tokens253 ctxt['keystone_ec2_url'] = ec2_tokens
254 ctxt['region'] = config('region')254 ctxt['region'] = hookenv.config('region')
255255
256 return ctxt256 return ctxt
257257
@@ -265,19 +265,38 @@
265265
266 def __init__(self):266 def __init__(self):
267 super(NeutronPostgresqlDBContext,267 super(NeutronPostgresqlDBContext,
268 self).__init__(config('neutron-database'))268 self).__init__(hookenv.config('neutron-database'))
269269
270270
271class NovaConfigContext(context.WorkerConfigContext):271class NovaConfigContext(context.WorkerConfigContext):
272 def __call__(self):272 def __call__(self):
273 ctxt = super(NovaConfigContext, self).__call__()273 ctxt = super(NovaConfigContext, self).__call__()
274 ctxt['cpu_allocation_ratio'] = config('cpu-allocation-ratio')274 ctxt['cpu_allocation_ratio'] = hookenv.config('cpu-allocation-ratio')
275 ctxt['ram_allocation_ratio'] = config('ram-allocation-ratio')275 ctxt['ram_allocation_ratio'] = hookenv.config('ram-allocation-ratio')
276 return ctxt276 return ctxt
277277
278278
279class NovaIPv6Context(context.BindHostContext):279class NovaIPv6Context(context.BindHostContext):
280 def __call__(self):280 def __call__(self):
281 ctxt = super(NovaIPv6Context, self).__call__()281 ctxt = super(NovaIPv6Context, self).__call__()
282 ctxt['use_ipv6'] = config('prefer-ipv6')282 ctxt['use_ipv6'] = hookenv.config('prefer-ipv6')
283 return ctxt
284
285
286class InstanceConsoleContext(context.OSContextGenerator):
287 interfaces = []
288
289 def __call__(self):
290 ctxt = {}
291 servers = []
292 try:
293 for rid in relation_ids('cache'):
294 for rel in relations_for_id(rid):
295 servers.append({'private-address': rel['private-address'],
296 'port': rel['port']})
297 except Exception as ex:
298 log(str(ex))
299 servers = []
300
301 ctxt['memcached_servers'] = servers
283 return ctxt302 return ctxt
284303
=== modified file 'hooks/nova_cc_hooks.py'
--- hooks/nova_cc_hooks.py 2014-10-23 07:32:45 +0000
+++ hooks/nova_cc_hooks.py 2014-11-04 18:12:57 +0000
@@ -849,6 +849,15 @@
849 quantum_joined(rid=rid)849 quantum_joined(rid=rid)
850850
851851
852@hooks.hook('cache-relation-joined',
853 'cache-relation-departed',
854 'cache-relation-changed',
855 'cache-relation-broken')
856@restart_on_change(restart_map())
857def memcached_joined():
858 CONFIGS.write(NOVA_CONF)
859
860
852def main():861def main():
853 try:862 try:
854 hooks.execute(sys.argv)863 hooks.execute(sys.argv)
855864
=== modified file 'hooks/nova_cc_utils.py'
--- hooks/nova_cc_utils.py 2014-10-23 16:39:43 +0000
+++ hooks/nova_cc_utils.py 2014-11-04 18:12:57 +0000
@@ -68,6 +68,7 @@
68 'python-psycopg2',68 'python-psycopg2',
69 'python-psutil',69 'python-psutil',
70 'uuid',70 'uuid',
71 'python-memcache',
71]72]
7273
73BASE_SERVICES = [74BASE_SERVICES = [
@@ -123,7 +124,8 @@
123 nova_cc_context.VolumeServiceContext(),124 nova_cc_context.VolumeServiceContext(),
124 nova_cc_context.NovaIPv6Context(),125 nova_cc_context.NovaIPv6Context(),
125 nova_cc_context.NeutronCCContext(),126 nova_cc_context.NeutronCCContext(),
126 nova_cc_context.NovaConfigContext()],127 nova_cc_context.NovaConfigContext(),
128 nova_cc_context.InstanceConsoleContext()],
127 }),129 }),
128 (NOVA_API_PASTE, {130 (NOVA_API_PASTE, {
129 'services': [s for s in BASE_SERVICES if 'api' in s],131 'services': [s for s in BASE_SERVICES if 'api' in s],
130132
=== modified file 'metadata.yaml'
--- metadata.yaml 2014-07-11 09:14:57 +0000
+++ metadata.yaml 2014-11-04 18:12:57 +0000
@@ -40,6 +40,8 @@
40 nova-vmware:40 nova-vmware:
41 interface: nova-vmware41 interface: nova-vmware
42 scope: container42 scope: container
43 cache:
44 interface: memcache
43peers:45peers:
44 cluster:46 cluster:
45 interface: nova-ha47 interface: nova-ha
4648
=== modified file 'templates/folsom/nova.conf'
--- templates/folsom/nova.conf 2014-04-16 08:25:14 +0000
+++ templates/folsom/nova.conf 2014-11-04 18:12:57 +0000
@@ -21,6 +21,11 @@
21enabled_apis=ec2,osapi_compute,metadata21enabled_apis=ec2,osapi_compute,metadata
22auth_strategy=keystone22auth_strategy=keystone
23compute_driver=libvirt.LibvirtDriver23compute_driver=libvirt.LibvirtDriver
24
25{% if memcached_servers %}
26memcached_servers = {%for s in memcached_servers %}{% if loop.index0 != 0 %},{% endif %}{{s['private-address']}}:{{s['port']}}{% endfor %}
27{% endif %}
28
24{% if keystone_ec2_url -%}29{% if keystone_ec2_url -%}
25keystone_ec2_url = {{ keystone_ec2_url }}30keystone_ec2_url = {{ keystone_ec2_url }}
26{% endif -%}31{% endif -%}
2732
=== modified file 'templates/grizzly/nova.conf'
--- templates/grizzly/nova.conf 2014-03-31 11:56:09 +0000
+++ templates/grizzly/nova.conf 2014-11-04 18:12:57 +0000
@@ -20,6 +20,11 @@
20enabled_apis=ec2,osapi_compute,metadata20enabled_apis=ec2,osapi_compute,metadata
21auth_strategy=keystone21auth_strategy=keystone
22compute_driver=libvirt.LibvirtDriver22compute_driver=libvirt.LibvirtDriver
23
24{% if memcached_servers %}
25memcached_servers = {%for s in memcached_servers %}{% if loop.index0 != 0 %},{% endif %}{{s['private-address']}}:{{s['port']}}{% endfor %}
26{% endif %}
27
23{% if keystone_ec2_url -%}28{% if keystone_ec2_url -%}
24keystone_ec2_url = {{ keystone_ec2_url }}29keystone_ec2_url = {{ keystone_ec2_url }}
25{% endif -%}30{% endif -%}
2631
=== modified file 'templates/havana/nova.conf'
--- templates/havana/nova.conf 2014-08-08 09:31:32 +0000
+++ templates/havana/nova.conf 2014-11-04 18:12:57 +0000
@@ -26,6 +26,10 @@
26cpu_allocation_ratio = {{ cpu_allocation_ratio }}26cpu_allocation_ratio = {{ cpu_allocation_ratio }}
27use_syslog={{ use_syslog }}27use_syslog={{ use_syslog }}
2828
29{% if memcached_servers %}
30memcached_servers = {%for s in memcached_servers %}{% if loop.index0 != 0 %},{% endif %}{{s['private-address']}}:{{s['port']}}{% endfor %}
31{% endif %}
32
29{% if keystone_ec2_url -%}33{% if keystone_ec2_url -%}
30keystone_ec2_url = {{ keystone_ec2_url }}34keystone_ec2_url = {{ keystone_ec2_url }}
31{% endif -%}35{% endif -%}
3236
=== modified file 'templates/icehouse/nova.conf'
--- templates/icehouse/nova.conf 2014-10-07 11:37:20 +0000
+++ templates/icehouse/nova.conf 2014-11-04 18:12:57 +0000
@@ -38,6 +38,10 @@
3838
39use_syslog={{ use_syslog }}39use_syslog={{ use_syslog }}
4040
41{% if memcached_servers %}
42memcached_servers = {%for s in memcached_servers %}{% if loop.index0 != 0 %},{% endif %}{{s['private-address']}}:{{s['port']}}{% endfor %}
43{% endif %}
44
41{% if keystone_ec2_url -%}45{% if keystone_ec2_url -%}
42keystone_ec2_url = {{ keystone_ec2_url }}46keystone_ec2_url = {{ keystone_ec2_url }}
43{% endif -%}47{% endif -%}
4448
=== added file 'unit_tests/test_nova_cc_contexts.py'
--- unit_tests/test_nova_cc_contexts.py 1970-01-01 00:00:00 +0000
+++ unit_tests/test_nova_cc_contexts.py 2014-11-04 18:12:57 +0000
@@ -0,0 +1,56 @@
1from __future__ import print_function
2
3import mock
4import nova_cc_context as context
5
6from charmhelpers.contrib.openstack import utils
7
8from test_utils import CharmTestCase
9
10
11TO_PATCH = [
12 'apt_install',
13 'filter_installed_packages',
14 'relation_ids',
15 'relation_get',
16 'related_units',
17 'log',
18 'unit_get',
19 'relations_for_id',
20]
21
22
23def fake_log(msg, level=None):
24 level = level or 'INFO'
25 print('[juju test log (%s)] %s' % (level, msg))
26
27
28class NovaComputeContextTests(CharmTestCase):
29 def setUp(self):
30 super(NovaComputeContextTests, self).setUp(context, TO_PATCH)
31 self.relation_get.side_effect = self.test_relation.get
32 self.log.side_effect = fake_log
33
34 @mock.patch.object(utils, 'os_release')
35 def test_instance_console_context_without_memcache(self, os_release):
36 self.unit_get.return_value = '127.0.0.1'
37 self.relation_ids.return_value = 'cache:0'
38 self.related_units.return_value = 'memcached/0'
39 instance_console = context.InstanceConsoleContext()
40 os_release.return_value = 'icehouse'
41 self.assertEqual({'memcached_servers': []},
42 instance_console())
43
44 @mock.patch.object(utils, 'os_release')
45 def test_instance_console_context_with_memcache(self, os_release):
46 memcached_servers = [{'private-address': '127.0.1.1',
47 'port': '11211'}]
48 self.unit_get.return_value = '127.0.0.1'
49 self.relation_ids.return_value = ['cache:0']
50 self.relations_for_id.return_value = memcached_servers
51 self.related_units.return_value = 'memcached/0'
52 instance_console = context.InstanceConsoleContext()
53 os_release.return_value = 'icehouse'
54 self.maxDiff = None
55 self.assertEqual({'memcached_servers': memcached_servers},
56 instance_console())
057
=== modified file 'unit_tests/test_nova_cc_utils.py'
--- unit_tests/test_nova_cc_utils.py 2014-10-23 16:39:43 +0000
+++ unit_tests/test_nova_cc_utils.py 2014-11-04 18:12:57 +0000
@@ -155,8 +155,9 @@
155 _map = utils.resource_map()155 _map = utils.resource_map()
156 return _map156 return _map
157157
158 @patch('charmhelpers.core.hookenv.config')
158 @patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')159 @patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
159 def test_resource_map_quantum(self, subcontext):160 def test_resource_map_quantum(self, subcontext, config_):
160 self.is_relation_made.return_value = False161 self.is_relation_made.return_value = False
161 self._resource_map(network_manager='quantum')162 self._resource_map(network_manager='quantum')
162 _map = utils.resource_map()163 _map = utils.resource_map()
@@ -167,8 +168,9 @@
167 ]168 ]
168 [self.assertIn(q_conf, _map.keys()) for q_conf in confs]169 [self.assertIn(q_conf, _map.keys()) for q_conf in confs]
169170
171 @patch('charmhelpers.core.hookenv.config')
170 @patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')172 @patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
171 def test_resource_map_neutron(self, subcontext):173 def test_resource_map_neutron(self, subcontext, config_):
172 self.is_relation_made.return_value = False174 self.is_relation_made.return_value = False
173 self._resource_map(network_manager='neutron')175 self._resource_map(network_manager='neutron')
174 _map = utils.resource_map()176 _map = utils.resource_map()
@@ -259,9 +261,11 @@
259 for service in console_services:261 for service in console_services:
260 self.assertIn(service, _map['/etc/nova/nova.conf']['services'])262 self.assertIn(service, _map['/etc/nova/nova.conf']['services'])
261263
264 @patch('charmhelpers.core.hookenv.config')
262 @patch('os.path.exists')265 @patch('os.path.exists')
263 @patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')266 @patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
264 def test_restart_map_api_before_frontends(self, subcontext, _exists):267 def test_restart_map_api_before_frontends(self, subcontext, _exists,
268 config_):
265 self.is_relation_made.return_value = False269 self.is_relation_made.return_value = False
266 _exists.return_value = False270 _exists.return_value = False
267 self._resource_map(network_manager='neutron')271 self._resource_map(network_manager='neutron')
@@ -303,8 +307,9 @@
303 pkgs = utils.determine_packages()307 pkgs = utils.determine_packages()
304 self.assertIn('quantum-server', pkgs)308 self.assertIn('quantum-server', pkgs)
305309
310 @patch('charmhelpers.core.hookenv.config')
306 @patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')311 @patch('charmhelpers.contrib.openstack.context.SubordinateConfigContext')
307 def test_determine_packages_neutron(self, subcontext):312 def test_determine_packages_neutron(self, subcontext, config_):
308 self.is_relation_made.return_value = False313 self.is_relation_made.return_value = False
309 self._resource_map(network_manager='neutron')314 self._resource_map(network_manager='neutron')
310 pkgs = utils.determine_packages()315 pkgs = utils.determine_packages()

Subscribers

People subscribed via source and target branches