Merge lp:~openstack-charmers/charms/trusty/nova-cloud-controller/0mq into lp:~openstack-charmers-archive/charms/trusty/nova-cloud-controller/next
- Trusty Tahr (14.04)
- 0mq
- Merge into next
Status: | Merged |
---|---|
Merged at revision: | 150 |
Proposed branch: | lp:~openstack-charmers/charms/trusty/nova-cloud-controller/0mq |
Merge into: | lp:~openstack-charmers-archive/charms/trusty/nova-cloud-controller/next |
Diff against target: |
919 lines (+554/-91) 16 files modified
hooks/charmhelpers/contrib/openstack/amulet/deployment.py (+25/-2) hooks/charmhelpers/contrib/openstack/context.py (+144/-1) hooks/charmhelpers/contrib/openstack/templates/git.upstart (+13/-0) hooks/charmhelpers/contrib/openstack/templates/section-zeromq (+14/-0) hooks/charmhelpers/contrib/openstack/templates/zeromq (+0/-14) hooks/charmhelpers/contrib/openstack/utils.py (+124/-69) hooks/charmhelpers/core/unitdata.py (+1/-1) hooks/nova_cc_hooks.py (+20/-2) hooks/nova_cc_utils.py (+9/-0) metadata.yaml (+3/-0) templates/icehouse/neutron.conf (+2/-0) templates/juno/nova.conf (+156/-0) templates/kilo/nova.conf (+2/-0) templates/kilo/zeromq (+14/-0) tests/charmhelpers/contrib/openstack/amulet/deployment.py (+25/-2) unit_tests/test_nova_cc_hooks.py (+2/-0) |
To merge this branch: | bzr merge lp:~openstack-charmers/charms/trusty/nova-cloud-controller/0mq |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Liam Young (community) | Approve | ||
Ryan Beisner (community) | Needs Fixing | ||
James Page | Needs Fixing | ||
Review via email: mp+238878@code.launchpad.net |
Commit message
Description of the change
Ryan Beisner (1chb1n) wrote : | # |
Ryan Beisner (1chb1n) wrote : | # |
UOSCI bot says:
This MP triggered a test on the Ubuntu OSCI system. Here is a summary of results.
#500 nova-cloud-
charm_unit_test
This build:
http://
MP URL:
https:/
Proposed branch:
lp:~openstack-charmers/charms/trusty/nova-cloud-controller/0mq
Results summary:
UNIT FAIL: unit-test failed
UNIT Results (max last 25 lines) from
/var/lib/
return func(*args, **keywargs)
File "/var/lib/
hooks.
File "hooks/
f(*args)
File "hooks/
f(*args)
File "hooks/
zeromq_
File "hooks/
" before %s" % ostack_release)
Exception: This hook is not supported on releases before juno
Name Stmts Miss Cover Missing
-------
hooks/nova_
hooks/nova_cc_hooks 453 147 68% 135-138, 151-152, 178, 189-190, 194, 229, 234-239, 250, 330-333, 341-344, 350-353, 363-379, 388-390, 400-414, 418-427, 513, 523, 527-528, 581, 587-597, 602-613, 623-633, 638-677, 687-702, 710-714, 739-748, 772, 777-785, 811, 863, 871, 875-878
hooks/nova_cc_utils 447 115 74% 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-905, 909-915, 919-921, 925-928, 932-944
-------
TOTAL 1051 371 65%
-------
Ran 97 tests in 10.713s
FAILED (errors=1)
make: *** [unit_test] Error 1
Ubuntu OSCI Jenkins is currently in development on a Canonical private network, but we plan to publish results to a public instance soon. Tests are triggered if the proposed branch rev changes, or if the MP is placed into "Needs review" status after being otherwise for >= 1hr. Human review of results is still recommended.
http://
- 108. By Liam Young
-
Fix unit tests and lint
Ryan Beisner (1chb1n) wrote : | # |
UOSCI bot says:
This MP triggered a test on the Ubuntu OSCI system. Here is a summary of results.
#702 nova-cloud-
charm_lint_check
This build:
http://
MP URL:
https:/
Proposed branch:
lp:~openstack-charmers/charms/trusty/nova-cloud-controller/0mq
Results summary:
LINT OK: believed to pass, but you should confirm results
LINT Results (max last 25 lines) from
/var/lib/
I: relation cloud-controller has no hooks
I: config.yaml: option ssl_key has no default value
I: config.yaml: option nvp-tz-uuid has no default value
I: config.yaml: option vip has no default value
I: config.yaml: option nvp-controllers has no default value
I: config.yaml: option console-
I: config.yaml: option ssl_ca has no default value
I: config.yaml: option os-public-network has no default value
I: config.yaml: option haproxy-
I: config.yaml: option os-admin-network has no default value
I: config.yaml: option haproxy-
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
Ubuntu OSCI Jenkins is currently in development on a Canonical private network, but we plan to publish results to a public instance soon. Tests are triggered if the proposed branch rev changes, or if the MP is placed into "Needs review" status after being otherwise for >= 1hr. Human review of results is still recommended.
http://
Ryan Beisner (1chb1n) wrote : | # |
UOSCI bot says:
This MP triggered a test on the Ubuntu OSCI system. Here is a summary of results.
#508 nova-cloud-
charm_unit_test
This build:
http://
MP URL:
https:/
Proposed branch:
lp:~openstack-charmers/charms/trusty/nova-cloud-controller/0mq
Results summary:
UNIT OK: believed to pass, but you should confirm results
UNIT Results (max last 25 lines) from
/var/lib/
Ensure services with incomplete interfaces are stopped ... ok
Ensure services with complete interfaces are not stopped ... ok
Ensure that if disabled, service guards nothing ... ok
test_ssh_
test_ssh_
test_ssh_
test_ssh_
test_ssh_
Simulate a call to do_openstack_
Verify get_step_
Simulate a call to do_openstack_
Simulate a call to do_openstack_
Verify get_step_
Name Stmts Miss Cover Missing
-------
hooks/nova_
hooks/nova_cc_hooks 453 147 68% 134-137, 150-151, 177, 188-189, 193, 228, 233-238, 249, 329-332, 340-343, 349-352, 362-378, 387-389, 399-413, 417-426, 512, 522, 526-527, 580, 586-596, 601-612, 622-632, 637-676, 686-701, 709-713, 738-747, 771, 776-784, 810, 862, 870, 874-877
hooks/nova_cc_utils 447 115 74% 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-905, 909-915, 919-921, 925-928, 932-944
-------
TOTAL 1051 371 65%
-------
Ran 97 tests in 8.907s
OK
Ubuntu OSCI Jenkins is currently in development on a Canonical private network, but we plan to publish results to a public instance soon. Tests are triggered if the proposed branch rev changes, or if the MP is placed into "Needs review" status after being otherwise for >= 1hr. Human review of results is still recommended.
http://
- 109. By James Page
-
Rebase on target
Ryan Beisner (1chb1n) wrote : | # |
UOSCI bot says: This MP triggered a test on the Ubuntu OSCI system.
charm_lint_check #166 nova-cloud-
LINT OK: believed to pass, but you should confirm results
Build: http://
MP: https:/
Proposed: lp:~openstack-charmers/charms/trusty/nova-cloud-controller/0mq
LINT Results (max last 4 lines) from
/var/lib/
I: config.yaml: option haproxy-
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 result: http://
Ryan Beisner (1chb1n) wrote : | # |
UOSCI bot says: This MP triggered a test on the Ubuntu OSCI system.
charm_unit_test #101 nova-cloud-
UNIT OK: believed to pass, but you should confirm results
Build: http://
MP: https:/
Proposed: lp:~openstack-charmers/charms/trusty/nova-cloud-controller/0mq
UNIT Results (max last 4 lines) from
/var/lib/
-------
Ran 97 tests in 9.282s
OK
Full unit result: http://
Ryan Beisner (1chb1n) wrote : | # |
UOSCI bot says:
charm_lint_check #725 nova-cloud-
LINT OK: believed to pass, but you should confirm results
LINT Results (max last 4 lines) from
/var/lib/
I: config.yaml: option haproxy-
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://
Build: http://
Ryan Beisner (1chb1n) wrote : | # |
UOSCI bot says:
charm_unit_test #531 nova-cloud-
UNIT OK: believed to pass, but you should confirm results
UNIT Results (max last 4 lines) from
/var/lib/
-------
Ran 97 tests in 9.073s
OK
Full unit output: http://
Build: http://
Ryan Beisner (1chb1n) wrote : | # |
UOSCI bot says:
charm_amulet_test #279 nova-cloud-
AMULET OK: believed to pass, but you should confirm results
AMULET Results (max last 4 lines) from
/var/lib/
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://
Build: http://
James Page (james-page) : | # |
- 110. By James Page
-
Rebase on next
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_lint_check #164 nova-cloud-
LINT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_unit_test #198 nova-cloud-
UNIT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_amulet_test #178 nova-cloud-
AMULET FAIL: amulet-test failed
AMULET Results (max last 2 lines):
ERROR subprocess encountered error code 124
make: *** [test] Error 124
Full amulet test output: http://
Build: http://
- 111. By James Page
-
Rebase on next
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_unit_test #737 nova-cloud-
UNIT FAIL: unit-test failed
UNIT Results (max last 2 lines):
FAILED (errors=1, failures=2)
make: *** [unit_test] Error 1
Full unit test output: http://
Build: http://
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_lint_check #708 nova-cloud-
LINT FAIL: lint-test failed
LINT Results (max last 2 lines):
hooks/
make: *** [lint] Error 1
Full lint test output: http://
Build: http://
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_amulet_test #893 nova-cloud-
AMULET FAIL: amulet-test failed
AMULET Results (max last 2 lines):
ERROR subprocess encountered error code 1
make: *** [test] Error 1
Full amulet test output: http://
Build: http://
Ryan Beisner (1chb1n) wrote : | # |
FYI, more info from juju unit log re: n-c-c install hook fail:
2015-01-13 09:41:49 INFO juju.worker.uniter modes.go:65 found queued "install" hook
2015-01-13 09:41:49 INFO juju.worker.uniter uniter.go:480 running "install" hook
2015-01-13 09:41:49 INFO install File "/var/lib/
2015-01-13 09:41:49 INFO install <<<<<<< TREE
2015-01-13 09:41:49 INFO install ^
2015-01-13 09:41:49 INFO install SyntaxError: invalid syntax
2015-01-13 09:41:49 ERROR juju.worker.uniter uniter.go:486 hook failed: exit status 1
- 112. By James Page
-
Fixup merge problem
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_lint_check #793 nova-cloud-
LINT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_unit_test #822 nova-cloud-
UNIT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_amulet_test #978 nova-cloud-
AMULET OK: passed
Ryan Beisner (1chb1n) wrote : | # |
FYI - P, T, U deploy tests fail with http://
- 113. By James Page
-
Use centralized zeromq template
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_lint_check #840 nova-cloud-
LINT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_unit_test #869 nova-cloud-
UNIT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_amulet_test #1064 nova-cloud-
AMULET OK: passed
Build: http://
- 114. By James Page
-
Fixup zeromq sections
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_lint_check #845 nova-cloud-
LINT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_unit_test #874 nova-cloud-
UNIT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_amulet_test #1069 nova-cloud-
AMULET OK: passed
Build: http://
- 115. By James Page
-
Resync helper
- 116. By James Page
-
Resync helper
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_lint_check #868 nova-cloud-
LINT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_unit_test #897 nova-cloud-
UNIT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_amulet_test #1092 nova-cloud-
AMULET OK: passed
Build: http://
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_lint_check #874 nova-cloud-
LINT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_unit_test #903 nova-cloud-
UNIT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_amulet_test #1098 nova-cloud-
AMULET OK: passed
Build: http://
- 117. By James Page
-
Rebase and resync
- 118. By James Page
-
Add zeromq support for kilo
- 119. By James Page
-
Use nova package for os check
- 120. By James Page
-
Drop zeromq support in icehouse
- 121. By James Page
-
Mark juno template as juno
- 122. By James Page
-
Move zeromq section to correct part of file
- 123. By James Page
-
Specialized zeromq snippet for kilo
- 124. By James Page
-
Reorder zeromq inclusion
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_lint_check #2202 nova-cloud-
LINT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_unit_test #1991 nova-cloud-
UNIT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_amulet_test #2148 nova-cloud-
AMULET FAIL: amulet-test failed
AMULET Results (max last 2 lines):
ERROR subprocess encountered error code 1
make: *** [test] Error 1
Full amulet test output: http://
Build: http://
- 125. By James Page
-
Rebase
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_lint_check #2682 nova-cloud-
LINT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_unit_test #2473 nova-cloud-
UNIT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_amulet_test #2511 nova-cloud-
AMULET FAIL: amulet-test failed
AMULET Results (max last 2 lines):
ERROR subprocess encountered error code 1
make: *** [test] Error 1
Full amulet test output: http://
Build: http://
- 126. By James Page
-
Make 0mq support >= kilo
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_lint_check #2692 nova-cloud-
LINT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_unit_test #2483 nova-cloud-
UNIT OK: passed
uosci-testing-bot (uosci-testing-bot) wrote : | # |
charm_amulet_test #2521 nova-cloud-
AMULET FAIL: amulet-test failed
AMULET Results (max last 2 lines):
ERROR subprocess encountered error code 124
make: *** [test] Error 124
Full amulet test output: http://
Build: http://
- 127. By James Page
-
Rebase, resync
- 128. By James Page
-
Rebase
Preview Diff
1 | === modified file 'hooks/charmhelpers/contrib/openstack/amulet/deployment.py' | |||
2 | --- hooks/charmhelpers/contrib/openstack/amulet/deployment.py 2015-03-31 11:39:19 +0000 | |||
3 | +++ hooks/charmhelpers/contrib/openstack/amulet/deployment.py 2015-03-31 14:56:40 +0000 | |||
4 | @@ -15,6 +15,7 @@ | |||
5 | 15 | # along with charm-helpers. If not, see <http://www.gnu.org/licenses/>. | 15 | # along with charm-helpers. If not, see <http://www.gnu.org/licenses/>. |
6 | 16 | 16 | ||
7 | 17 | import six | 17 | import six |
8 | 18 | from collections import OrderedDict | ||
9 | 18 | from charmhelpers.contrib.amulet.deployment import ( | 19 | from charmhelpers.contrib.amulet.deployment import ( |
10 | 19 | AmuletDeployment | 20 | AmuletDeployment |
11 | 20 | ) | 21 | ) |
12 | @@ -100,12 +101,34 @@ | |||
13 | 100 | """ | 101 | """ |
14 | 101 | (self.precise_essex, self.precise_folsom, self.precise_grizzly, | 102 | (self.precise_essex, self.precise_folsom, self.precise_grizzly, |
15 | 102 | self.precise_havana, self.precise_icehouse, | 103 | self.precise_havana, self.precise_icehouse, |
17 | 103 | self.trusty_icehouse) = range(6) | 104 | self.trusty_icehouse, self.trusty_juno, self.trusty_kilo) = range(8) |
18 | 104 | releases = { | 105 | releases = { |
19 | 105 | ('precise', None): self.precise_essex, | 106 | ('precise', None): self.precise_essex, |
20 | 106 | ('precise', 'cloud:precise-folsom'): self.precise_folsom, | 107 | ('precise', 'cloud:precise-folsom'): self.precise_folsom, |
21 | 107 | ('precise', 'cloud:precise-grizzly'): self.precise_grizzly, | 108 | ('precise', 'cloud:precise-grizzly'): self.precise_grizzly, |
22 | 108 | ('precise', 'cloud:precise-havana'): self.precise_havana, | 109 | ('precise', 'cloud:precise-havana'): self.precise_havana, |
23 | 109 | ('precise', 'cloud:precise-icehouse'): self.precise_icehouse, | 110 | ('precise', 'cloud:precise-icehouse'): self.precise_icehouse, |
25 | 110 | ('trusty', None): self.trusty_icehouse} | 111 | ('trusty', None): self.trusty_icehouse, |
26 | 112 | ('trusty', 'cloud:trusty-juno'): self.trusty_juno, | ||
27 | 113 | ('trusty', 'cloud:trusty-kilo'): self.trusty_kilo} | ||
28 | 111 | return releases[(self.series, self.openstack)] | 114 | return releases[(self.series, self.openstack)] |
29 | 115 | |||
30 | 116 | def _get_openstack_release_string(self): | ||
31 | 117 | """Get openstack release string. | ||
32 | 118 | |||
33 | 119 | Return a string representing the openstack release. | ||
34 | 120 | """ | ||
35 | 121 | releases = OrderedDict([ | ||
36 | 122 | ('precise', 'essex'), | ||
37 | 123 | ('quantal', 'folsom'), | ||
38 | 124 | ('raring', 'grizzly'), | ||
39 | 125 | ('saucy', 'havana'), | ||
40 | 126 | ('trusty', 'icehouse'), | ||
41 | 127 | ('utopic', 'juno'), | ||
42 | 128 | ('vivid', 'kilo'), | ||
43 | 129 | ]) | ||
44 | 130 | if self.openstack: | ||
45 | 131 | os_origin = self.openstack.split(':')[1] | ||
46 | 132 | return os_origin.split('%s-' % self.series)[1].split('/')[0] | ||
47 | 133 | else: | ||
48 | 134 | return releases[self.series] | ||
49 | 112 | 135 | ||
50 | === modified file 'hooks/charmhelpers/contrib/openstack/context.py' | |||
51 | --- hooks/charmhelpers/contrib/openstack/context.py 2015-03-31 11:39:19 +0000 | |||
52 | +++ hooks/charmhelpers/contrib/openstack/context.py 2015-03-31 14:56:40 +0000 | |||
53 | @@ -47,6 +47,7 @@ | |||
54 | 47 | ) | 47 | ) |
55 | 48 | 48 | ||
56 | 49 | from charmhelpers.core.sysctl import create as sysctl_create | 49 | from charmhelpers.core.sysctl import create as sysctl_create |
57 | 50 | from charmhelpers.core.strutils import bool_from_string | ||
58 | 50 | 51 | ||
59 | 51 | from charmhelpers.core.host import ( | 52 | from charmhelpers.core.host import ( |
60 | 52 | list_nics, | 53 | list_nics, |
61 | @@ -67,6 +68,7 @@ | |||
62 | 67 | ) | 68 | ) |
63 | 68 | from charmhelpers.contrib.openstack.neutron import ( | 69 | from charmhelpers.contrib.openstack.neutron import ( |
64 | 69 | neutron_plugin_attribute, | 70 | neutron_plugin_attribute, |
65 | 71 | parse_data_port_mappings, | ||
66 | 70 | ) | 72 | ) |
67 | 71 | from charmhelpers.contrib.openstack.ip import ( | 73 | from charmhelpers.contrib.openstack.ip import ( |
68 | 72 | resolve_address, | 74 | resolve_address, |
69 | @@ -82,7 +84,6 @@ | |||
70 | 82 | is_bridge_member, | 84 | is_bridge_member, |
71 | 83 | ) | 85 | ) |
72 | 84 | from charmhelpers.contrib.openstack.utils import get_host_ip | 86 | from charmhelpers.contrib.openstack.utils import get_host_ip |
73 | 85 | |||
74 | 86 | CA_CERT_PATH = '/usr/local/share/ca-certificates/keystone_juju_ca_cert.crt' | 87 | CA_CERT_PATH = '/usr/local/share/ca-certificates/keystone_juju_ca_cert.crt' |
75 | 87 | ADDRESS_TYPES = ['admin', 'internal', 'public'] | 88 | ADDRESS_TYPES = ['admin', 'internal', 'public'] |
76 | 88 | 89 | ||
77 | @@ -1162,3 +1163,145 @@ | |||
78 | 1162 | sysctl_create(sysctl_dict, | 1163 | sysctl_create(sysctl_dict, |
79 | 1163 | '/etc/sysctl.d/50-{0}.conf'.format(charm_name())) | 1164 | '/etc/sysctl.d/50-{0}.conf'.format(charm_name())) |
80 | 1164 | return {'sysctl': sysctl_dict} | 1165 | return {'sysctl': sysctl_dict} |
81 | 1166 | |||
82 | 1167 | |||
83 | 1168 | class NeutronAPIContext(OSContextGenerator): | ||
84 | 1169 | ''' | ||
85 | 1170 | Inspects current neutron-plugin-api relation for neutron settings. Return | ||
86 | 1171 | defaults if it is not present. | ||
87 | 1172 | ''' | ||
88 | 1173 | interfaces = ['neutron-plugin-api'] | ||
89 | 1174 | |||
90 | 1175 | def __call__(self): | ||
91 | 1176 | self.neutron_defaults = { | ||
92 | 1177 | 'l2_population': { | ||
93 | 1178 | 'rel_key': 'l2-population', | ||
94 | 1179 | 'default': False, | ||
95 | 1180 | }, | ||
96 | 1181 | 'overlay_network_type': { | ||
97 | 1182 | 'rel_key': 'overlay-network-type', | ||
98 | 1183 | 'default': 'gre', | ||
99 | 1184 | }, | ||
100 | 1185 | 'neutron_security_groups': { | ||
101 | 1186 | 'rel_key': 'neutron-security-groups', | ||
102 | 1187 | 'default': False, | ||
103 | 1188 | }, | ||
104 | 1189 | 'network_device_mtu': { | ||
105 | 1190 | 'rel_key': 'network-device-mtu', | ||
106 | 1191 | 'default': None, | ||
107 | 1192 | }, | ||
108 | 1193 | 'enable_dvr': { | ||
109 | 1194 | 'rel_key': 'enable-dvr', | ||
110 | 1195 | 'default': False, | ||
111 | 1196 | }, | ||
112 | 1197 | 'enable_l3ha': { | ||
113 | 1198 | 'rel_key': 'enable-l3ha', | ||
114 | 1199 | 'default': False, | ||
115 | 1200 | }, | ||
116 | 1201 | } | ||
117 | 1202 | ctxt = self.get_neutron_options({}) | ||
118 | 1203 | for rid in relation_ids('neutron-plugin-api'): | ||
119 | 1204 | for unit in related_units(rid): | ||
120 | 1205 | rdata = relation_get(rid=rid, unit=unit) | ||
121 | 1206 | if 'l2-population' in rdata: | ||
122 | 1207 | ctxt.update(self.get_neutron_options(rdata)) | ||
123 | 1208 | |||
124 | 1209 | return ctxt | ||
125 | 1210 | |||
126 | 1211 | def get_neutron_options(self, rdata): | ||
127 | 1212 | settings = {} | ||
128 | 1213 | for nkey in self.neutron_defaults.keys(): | ||
129 | 1214 | defv = self.neutron_defaults[nkey]['default'] | ||
130 | 1215 | rkey = self.neutron_defaults[nkey]['rel_key'] | ||
131 | 1216 | if rkey in rdata.keys(): | ||
132 | 1217 | if type(defv) is bool: | ||
133 | 1218 | settings[nkey] = bool_from_string(rdata[rkey]) | ||
134 | 1219 | else: | ||
135 | 1220 | settings[nkey] = rdata[rkey] | ||
136 | 1221 | else: | ||
137 | 1222 | settings[nkey] = defv | ||
138 | 1223 | return settings | ||
139 | 1224 | |||
140 | 1225 | |||
141 | 1226 | class ExternalPortContext(NeutronPortContext): | ||
142 | 1227 | |||
143 | 1228 | def __call__(self): | ||
144 | 1229 | ctxt = {} | ||
145 | 1230 | ports = config('ext-port') | ||
146 | 1231 | if ports: | ||
147 | 1232 | ports = [p.strip() for p in ports.split()] | ||
148 | 1233 | ports = self.resolve_ports(ports) | ||
149 | 1234 | if ports: | ||
150 | 1235 | ctxt = {"ext_port": ports[0]} | ||
151 | 1236 | napi_settings = NeutronAPIContext()() | ||
152 | 1237 | mtu = napi_settings.get('network_device_mtu') | ||
153 | 1238 | if mtu: | ||
154 | 1239 | ctxt['ext_port_mtu'] = mtu | ||
155 | 1240 | |||
156 | 1241 | return ctxt | ||
157 | 1242 | |||
158 | 1243 | |||
159 | 1244 | class DataPortContext(NeutronPortContext): | ||
160 | 1245 | |||
161 | 1246 | def __call__(self): | ||
162 | 1247 | ports = config('data-port') | ||
163 | 1248 | if ports: | ||
164 | 1249 | portmap = parse_data_port_mappings(ports) | ||
165 | 1250 | ports = portmap.values() | ||
166 | 1251 | resolved = self.resolve_ports(ports) | ||
167 | 1252 | normalized = {get_nic_hwaddr(port): port for port in resolved | ||
168 | 1253 | if port not in ports} | ||
169 | 1254 | normalized.update({port: port for port in resolved | ||
170 | 1255 | if port in ports}) | ||
171 | 1256 | if resolved: | ||
172 | 1257 | return {bridge: normalized[port] for bridge, port in | ||
173 | 1258 | six.iteritems(portmap) if port in normalized.keys()} | ||
174 | 1259 | |||
175 | 1260 | return None | ||
176 | 1261 | |||
177 | 1262 | |||
178 | 1263 | class PhyNICMTUContext(DataPortContext): | ||
179 | 1264 | |||
180 | 1265 | def __call__(self): | ||
181 | 1266 | ctxt = {} | ||
182 | 1267 | mappings = super(PhyNICMTUContext, self).__call__() | ||
183 | 1268 | if mappings and mappings.values(): | ||
184 | 1269 | ports = mappings.values() | ||
185 | 1270 | napi_settings = NeutronAPIContext()() | ||
186 | 1271 | mtu = napi_settings.get('network_device_mtu') | ||
187 | 1272 | if mtu: | ||
188 | 1273 | ctxt["devs"] = '\\n'.join(ports) | ||
189 | 1274 | ctxt['mtu'] = mtu | ||
190 | 1275 | |||
191 | 1276 | return ctxt | ||
192 | 1277 | |||
193 | 1278 | |||
194 | 1279 | class NetworkServiceContext(OSContextGenerator): | ||
195 | 1280 | |||
196 | 1281 | def __init__(self, rel_name='quantum-network-service'): | ||
197 | 1282 | self.rel_name = rel_name | ||
198 | 1283 | self.interfaces = [rel_name] | ||
199 | 1284 | |||
200 | 1285 | def __call__(self): | ||
201 | 1286 | for rid in relation_ids(self.rel_name): | ||
202 | 1287 | for unit in related_units(rid): | ||
203 | 1288 | rdata = relation_get(rid=rid, unit=unit) | ||
204 | 1289 | ctxt = { | ||
205 | 1290 | 'keystone_host': rdata.get('keystone_host'), | ||
206 | 1291 | 'service_port': rdata.get('service_port'), | ||
207 | 1292 | 'auth_port': rdata.get('auth_port'), | ||
208 | 1293 | 'service_tenant': rdata.get('service_tenant'), | ||
209 | 1294 | 'service_username': rdata.get('service_username'), | ||
210 | 1295 | 'service_password': rdata.get('service_password'), | ||
211 | 1296 | 'quantum_host': rdata.get('quantum_host'), | ||
212 | 1297 | 'quantum_port': rdata.get('quantum_port'), | ||
213 | 1298 | 'quantum_url': rdata.get('quantum_url'), | ||
214 | 1299 | 'region': rdata.get('region'), | ||
215 | 1300 | 'service_protocol': | ||
216 | 1301 | rdata.get('service_protocol') or 'http', | ||
217 | 1302 | 'auth_protocol': | ||
218 | 1303 | rdata.get('auth_protocol') or 'http', | ||
219 | 1304 | } | ||
220 | 1305 | if context_complete(ctxt): | ||
221 | 1306 | return ctxt | ||
222 | 1307 | return {} | ||
223 | 1165 | 1308 | ||
224 | === added file 'hooks/charmhelpers/contrib/openstack/templates/git.upstart' | |||
225 | --- hooks/charmhelpers/contrib/openstack/templates/git.upstart 1970-01-01 00:00:00 +0000 | |||
226 | +++ hooks/charmhelpers/contrib/openstack/templates/git.upstart 2015-03-31 14:56:40 +0000 | |||
227 | @@ -0,0 +1,13 @@ | |||
228 | 1 | description "{{ service_description }}" | ||
229 | 2 | author "Juju {{ service_name }} Charm <juju@localhost>" | ||
230 | 3 | |||
231 | 4 | start on runlevel [2345] | ||
232 | 5 | stop on runlevel [!2345] | ||
233 | 6 | |||
234 | 7 | respawn | ||
235 | 8 | |||
236 | 9 | exec start-stop-daemon --start --chuid {{ user_name }} \ | ||
237 | 10 | --chdir {{ start_dir }} --name {{ process_name }} \ | ||
238 | 11 | --exec {{ executable_name }} -- \ | ||
239 | 12 | --config-file={{ config_file }} \ | ||
240 | 13 | --log-file={{ log_file }} | ||
241 | 0 | 14 | ||
242 | === added file 'hooks/charmhelpers/contrib/openstack/templates/section-zeromq' | |||
243 | --- hooks/charmhelpers/contrib/openstack/templates/section-zeromq 1970-01-01 00:00:00 +0000 | |||
244 | +++ hooks/charmhelpers/contrib/openstack/templates/section-zeromq 2015-03-31 14:56:40 +0000 | |||
245 | @@ -0,0 +1,14 @@ | |||
246 | 1 | {% if zmq_host -%} | ||
247 | 2 | # ZeroMQ configuration (restart-nonce: {{ zmq_nonce }}) | ||
248 | 3 | rpc_backend = zmq | ||
249 | 4 | rpc_zmq_host = {{ zmq_host }} | ||
250 | 5 | {% if zmq_redis_address -%} | ||
251 | 6 | rpc_zmq_matchmaker = redis | ||
252 | 7 | matchmaker_heartbeat_freq = 15 | ||
253 | 8 | matchmaker_heartbeat_ttl = 30 | ||
254 | 9 | [matchmaker_redis] | ||
255 | 10 | host = {{ zmq_redis_address }} | ||
256 | 11 | {% else -%} | ||
257 | 12 | rpc_zmq_matchmaker = ring | ||
258 | 13 | {% endif -%} | ||
259 | 14 | {% endif -%} | ||
260 | 0 | 15 | ||
261 | === removed file 'hooks/charmhelpers/contrib/openstack/templates/zeromq' | |||
262 | --- hooks/charmhelpers/contrib/openstack/templates/zeromq 2015-02-24 12:37:34 +0000 | |||
263 | +++ hooks/charmhelpers/contrib/openstack/templates/zeromq 1970-01-01 00:00:00 +0000 | |||
264 | @@ -1,14 +0,0 @@ | |||
265 | 1 | {% if zmq_host -%} | ||
266 | 2 | # ZeroMQ configuration (restart-nonce: {{ zmq_nonce }}) | ||
267 | 3 | rpc_backend = zmq | ||
268 | 4 | rpc_zmq_host = {{ zmq_host }} | ||
269 | 5 | {% if zmq_redis_address -%} | ||
270 | 6 | rpc_zmq_matchmaker = oslo.messaging._drivers.matchmaker_redis.MatchMakerRedis | ||
271 | 7 | matchmaker_heartbeat_freq = 15 | ||
272 | 8 | matchmaker_heartbeat_ttl = 30 | ||
273 | 9 | [matchmaker_redis] | ||
274 | 10 | host = {{ zmq_redis_address }} | ||
275 | 11 | {% else -%} | ||
276 | 12 | rpc_zmq_matchmaker = oslo.messaging._drivers.matchmaker_ring.MatchMakerRing | ||
277 | 13 | {% endif -%} | ||
278 | 14 | {% endif -%} | ||
279 | 15 | 0 | ||
280 | === modified file 'hooks/charmhelpers/contrib/openstack/utils.py' | |||
281 | --- hooks/charmhelpers/contrib/openstack/utils.py 2015-03-31 11:39:19 +0000 | |||
282 | +++ hooks/charmhelpers/contrib/openstack/utils.py 2015-03-31 14:56:40 +0000 | |||
283 | @@ -30,6 +30,10 @@ | |||
284 | 30 | 30 | ||
285 | 31 | from charmhelpers.contrib.network import ip | 31 | from charmhelpers.contrib.network import ip |
286 | 32 | 32 | ||
287 | 33 | from charmhelpers.core import ( | ||
288 | 34 | unitdata, | ||
289 | 35 | ) | ||
290 | 36 | |||
291 | 33 | from charmhelpers.core.hookenv import ( | 37 | from charmhelpers.core.hookenv import ( |
292 | 34 | config, | 38 | config, |
293 | 35 | log as juju_log, | 39 | log as juju_log, |
294 | @@ -330,6 +334,21 @@ | |||
295 | 330 | error_out("Invalid openstack-release specified: %s" % rel) | 334 | error_out("Invalid openstack-release specified: %s" % rel) |
296 | 331 | 335 | ||
297 | 332 | 336 | ||
298 | 337 | def config_value_changed(option): | ||
299 | 338 | """ | ||
300 | 339 | Determine if config value changed since last call to this function. | ||
301 | 340 | """ | ||
302 | 341 | hook_data = unitdata.HookData() | ||
303 | 342 | with hook_data(): | ||
304 | 343 | db = unitdata.kv() | ||
305 | 344 | current = config(option) | ||
306 | 345 | saved = db.get(option) | ||
307 | 346 | db.set(option, current) | ||
308 | 347 | if saved is None: | ||
309 | 348 | return False | ||
310 | 349 | return current != saved | ||
311 | 350 | |||
312 | 351 | |||
313 | 333 | def save_script_rc(script_path="scripts/scriptrc", **env_vars): | 352 | def save_script_rc(script_path="scripts/scriptrc", **env_vars): |
314 | 334 | """ | 353 | """ |
315 | 335 | Write an rc file in the charm-delivered directory containing | 354 | Write an rc file in the charm-delivered directory containing |
316 | @@ -469,82 +488,95 @@ | |||
317 | 469 | 488 | ||
318 | 470 | 489 | ||
319 | 471 | def git_install_requested(): | 490 | def git_install_requested(): |
322 | 472 | """Returns true if openstack-origin-git is specified.""" | 491 | """ |
323 | 473 | return config('openstack-origin-git') != "None" | 492 | Returns true if openstack-origin-git is specified. |
324 | 493 | """ | ||
325 | 494 | return config('openstack-origin-git') is not None | ||
326 | 474 | 495 | ||
327 | 475 | 496 | ||
328 | 476 | requirements_dir = None | 497 | requirements_dir = None |
329 | 477 | 498 | ||
330 | 478 | 499 | ||
333 | 479 | def git_clone_and_install(file_name, core_project): | 500 | def git_clone_and_install(projects_yaml, core_project): |
334 | 480 | """Clone/install all OpenStack repos specified in yaml config file.""" | 501 | """ |
335 | 502 | Clone/install all specified OpenStack repositories. | ||
336 | 503 | |||
337 | 504 | The expected format of projects_yaml is: | ||
338 | 505 | repositories: | ||
339 | 506 | - {name: keystone, | ||
340 | 507 | repository: 'git://git.openstack.org/openstack/keystone.git', | ||
341 | 508 | branch: 'stable/icehouse'} | ||
342 | 509 | - {name: requirements, | ||
343 | 510 | repository: 'git://git.openstack.org/openstack/requirements.git', | ||
344 | 511 | branch: 'stable/icehouse'} | ||
345 | 512 | directory: /mnt/openstack-git | ||
346 | 513 | |||
347 | 514 | The directory key is optional. | ||
348 | 515 | """ | ||
349 | 481 | global requirements_dir | 516 | global requirements_dir |
350 | 517 | parent_dir = '/mnt/openstack-git' | ||
351 | 482 | 518 | ||
353 | 483 | if file_name == "None": | 519 | if not projects_yaml: |
354 | 484 | return | 520 | return |
355 | 485 | 521 | ||
414 | 486 | yaml_file = os.path.join(charm_dir(), file_name) | 522 | projects = yaml.load(projects_yaml) |
415 | 487 | 523 | _git_validate_projects_yaml(projects, core_project) | |
416 | 488 | # clone/install the requirements project first | 524 | |
417 | 489 | installed = _git_clone_and_install_subset(yaml_file, | 525 | if 'directory' in projects.keys(): |
418 | 490 | whitelist=['requirements']) | 526 | parent_dir = projects['directory'] |
419 | 491 | if 'requirements' not in installed: | 527 | |
420 | 492 | error_out('requirements git repository must be specified') | 528 | for p in projects['repositories']: |
421 | 493 | 529 | repo = p['repository'] | |
422 | 494 | # clone/install all other projects except requirements and the core project | 530 | branch = p['branch'] |
423 | 495 | blacklist = ['requirements', core_project] | 531 | if p['name'] == 'requirements': |
424 | 496 | _git_clone_and_install_subset(yaml_file, blacklist=blacklist, | 532 | repo_dir = _git_clone_and_install_single(repo, branch, parent_dir, |
425 | 497 | update_requirements=True) | 533 | update_requirements=False) |
426 | 498 | 534 | requirements_dir = repo_dir | |
427 | 499 | # clone/install the core project | 535 | else: |
428 | 500 | whitelist = [core_project] | 536 | repo_dir = _git_clone_and_install_single(repo, branch, parent_dir, |
429 | 501 | installed = _git_clone_and_install_subset(yaml_file, whitelist=whitelist, | 537 | update_requirements=True) |
430 | 502 | update_requirements=True) | 538 | |
431 | 503 | if core_project not in installed: | 539 | |
432 | 504 | error_out('{} git repository must be specified'.format(core_project)) | 540 | def _git_validate_projects_yaml(projects, core_project): |
433 | 505 | 541 | """ | |
434 | 506 | 542 | Validate the projects yaml. | |
435 | 507 | def _git_clone_and_install_subset(yaml_file, whitelist=[], blacklist=[], | 543 | """ |
436 | 508 | update_requirements=False): | 544 | _git_ensure_key_exists('repositories', projects) |
437 | 509 | """Clone/install subset of OpenStack repos specified in yaml config file.""" | 545 | |
438 | 510 | global requirements_dir | 546 | for project in projects['repositories']: |
439 | 511 | installed = [] | 547 | _git_ensure_key_exists('name', project.keys()) |
440 | 512 | 548 | _git_ensure_key_exists('repository', project.keys()) | |
441 | 513 | with open(yaml_file, 'r') as fd: | 549 | _git_ensure_key_exists('branch', project.keys()) |
442 | 514 | projects = yaml.load(fd) | 550 | |
443 | 515 | for proj, val in projects.items(): | 551 | if projects['repositories'][0]['name'] != 'requirements': |
444 | 516 | # The project subset is chosen based on the following 3 rules: | 552 | error_out('{} git repo must be specified first'.format('requirements')) |
445 | 517 | # 1) If project is in blacklist, we don't clone/install it, period. | 553 | |
446 | 518 | # 2) If whitelist is empty, we clone/install everything else. | 554 | if projects['repositories'][-1]['name'] != core_project: |
447 | 519 | # 3) If whitelist is not empty, we clone/install everything in the | 555 | error_out('{} git repo must be specified last'.format(core_project)) |
448 | 520 | # whitelist. | 556 | |
449 | 521 | if proj in blacklist: | 557 | |
450 | 522 | continue | 558 | def _git_ensure_key_exists(key, keys): |
451 | 523 | if whitelist and proj not in whitelist: | 559 | """ |
452 | 524 | continue | 560 | Ensure that key exists in keys. |
453 | 525 | repo = val['repository'] | 561 | """ |
454 | 526 | branch = val['branch'] | 562 | if key not in keys: |
455 | 527 | repo_dir = _git_clone_and_install_single(repo, branch, | 563 | error_out('openstack-origin-git key \'{}\' is missing'.format(key)) |
456 | 528 | update_requirements) | 564 | |
457 | 529 | if proj == 'requirements': | 565 | |
458 | 530 | requirements_dir = repo_dir | 566 | def _git_clone_and_install_single(repo, branch, parent_dir, update_requirements): |
459 | 531 | installed.append(proj) | 567 | """ |
460 | 532 | return installed | 568 | Clone and install a single git repository. |
461 | 533 | 569 | """ | |
462 | 534 | 570 | dest_dir = os.path.join(parent_dir, os.path.basename(repo)) | |
463 | 535 | def _git_clone_and_install_single(repo, branch, update_requirements=False): | 571 | |
464 | 536 | """Clone and install a single git repository.""" | 572 | if not os.path.exists(parent_dir): |
465 | 537 | dest_parent_dir = "/mnt/openstack-git/" | 573 | juju_log('Directory already exists at {}. ' |
466 | 538 | dest_dir = os.path.join(dest_parent_dir, os.path.basename(repo)) | 574 | 'No need to create directory.'.format(parent_dir)) |
467 | 539 | 575 | os.mkdir(parent_dir) | |
410 | 540 | if not os.path.exists(dest_parent_dir): | ||
411 | 541 | juju_log('Host dir not mounted at {}. ' | ||
412 | 542 | 'Creating directory there instead.'.format(dest_parent_dir)) | ||
413 | 543 | os.mkdir(dest_parent_dir) | ||
468 | 544 | 576 | ||
469 | 545 | if not os.path.exists(dest_dir): | 577 | if not os.path.exists(dest_dir): |
470 | 546 | juju_log('Cloning git repo: {}, branch: {}'.format(repo, branch)) | 578 | juju_log('Cloning git repo: {}, branch: {}'.format(repo, branch)) |
472 | 547 | repo_dir = install_remote(repo, dest=dest_parent_dir, branch=branch) | 579 | repo_dir = install_remote(repo, dest=parent_dir, branch=branch) |
473 | 548 | else: | 580 | else: |
474 | 549 | repo_dir = dest_dir | 581 | repo_dir = dest_dir |
475 | 550 | 582 | ||
476 | @@ -561,16 +593,39 @@ | |||
477 | 561 | 593 | ||
478 | 562 | 594 | ||
479 | 563 | def _git_update_requirements(package_dir, reqs_dir): | 595 | def _git_update_requirements(package_dir, reqs_dir): |
481 | 564 | """Update from global requirements. | 596 | """ |
482 | 597 | Update from global requirements. | ||
483 | 565 | 598 | ||
486 | 566 | Update an OpenStack git directory's requirements.txt and | 599 | Update an OpenStack git directory's requirements.txt and |
487 | 567 | test-requirements.txt from global-requirements.txt.""" | 600 | test-requirements.txt from global-requirements.txt. |
488 | 601 | """ | ||
489 | 568 | orig_dir = os.getcwd() | 602 | orig_dir = os.getcwd() |
490 | 569 | os.chdir(reqs_dir) | 603 | os.chdir(reqs_dir) |
492 | 570 | cmd = "python update.py {}".format(package_dir) | 604 | cmd = ['python', 'update.py', package_dir] |
493 | 571 | try: | 605 | try: |
495 | 572 | subprocess.check_call(cmd.split(' ')) | 606 | subprocess.check_call(cmd) |
496 | 573 | except subprocess.CalledProcessError: | 607 | except subprocess.CalledProcessError: |
497 | 574 | package = os.path.basename(package_dir) | 608 | package = os.path.basename(package_dir) |
498 | 575 | error_out("Error updating {} from global-requirements.txt".format(package)) | 609 | error_out("Error updating {} from global-requirements.txt".format(package)) |
499 | 576 | os.chdir(orig_dir) | 610 | os.chdir(orig_dir) |
500 | 611 | |||
501 | 612 | |||
502 | 613 | def git_src_dir(projects_yaml, project): | ||
503 | 614 | """ | ||
504 | 615 | Return the directory where the specified project's source is located. | ||
505 | 616 | """ | ||
506 | 617 | parent_dir = '/mnt/openstack-git' | ||
507 | 618 | |||
508 | 619 | if not projects_yaml: | ||
509 | 620 | return | ||
510 | 621 | |||
511 | 622 | projects = yaml.load(projects_yaml) | ||
512 | 623 | |||
513 | 624 | if 'directory' in projects.keys(): | ||
514 | 625 | parent_dir = projects['directory'] | ||
515 | 626 | |||
516 | 627 | for p in projects['repositories']: | ||
517 | 628 | if p['name'] == project: | ||
518 | 629 | return os.path.join(parent_dir, os.path.basename(p['repository'])) | ||
519 | 630 | |||
520 | 631 | return None | ||
521 | 577 | 632 | ||
522 | === modified file 'hooks/charmhelpers/core/unitdata.py' | |||
523 | --- hooks/charmhelpers/core/unitdata.py 2015-02-19 04:28:27 +0000 | |||
524 | +++ hooks/charmhelpers/core/unitdata.py 2015-03-31 14:56:40 +0000 | |||
525 | @@ -443,7 +443,7 @@ | |||
526 | 443 | data = hookenv.execution_environment() | 443 | data = hookenv.execution_environment() |
527 | 444 | self.conf = conf_delta = self.kv.delta(data['conf'], 'config') | 444 | self.conf = conf_delta = self.kv.delta(data['conf'], 'config') |
528 | 445 | self.rels = rels_delta = self.kv.delta(data['rels'], 'rels') | 445 | self.rels = rels_delta = self.kv.delta(data['rels'], 'rels') |
530 | 446 | self.kv.set('env', data['env']) | 446 | self.kv.set('env', dict(data['env'])) |
531 | 447 | self.kv.set('unit', data['unit']) | 447 | self.kv.set('unit', data['unit']) |
532 | 448 | self.kv.set('relid', data.get('relid')) | 448 | self.kv.set('relid', data.get('relid')) |
533 | 449 | return conf_delta, rels_delta | 449 | return conf_delta, rels_delta |
534 | 450 | 450 | ||
535 | === modified file 'hooks/nova_cc_hooks.py' | |||
536 | --- hooks/nova_cc_hooks.py 2015-03-31 11:39:19 +0000 | |||
537 | +++ hooks/nova_cc_hooks.py 2015-03-31 14:56:40 +0000 | |||
538 | @@ -46,6 +46,7 @@ | |||
539 | 46 | configure_installation_source, | 46 | configure_installation_source, |
540 | 47 | openstack_upgrade_available, | 47 | openstack_upgrade_available, |
541 | 48 | os_release, | 48 | os_release, |
542 | 49 | os_requires_version, | ||
543 | 49 | sync_db_with_multi_ipv6_addresses | 50 | sync_db_with_multi_ipv6_addresses |
544 | 50 | ) | 51 | ) |
545 | 51 | 52 | ||
546 | @@ -79,6 +80,7 @@ | |||
547 | 79 | migrate_nova_database, | 80 | migrate_nova_database, |
548 | 80 | neutron_plugin, | 81 | neutron_plugin, |
549 | 81 | save_script_rc, | 82 | save_script_rc, |
550 | 83 | services, | ||
551 | 82 | ssh_compute_add, | 84 | ssh_compute_add, |
552 | 83 | ssh_compute_remove, | 85 | ssh_compute_remove, |
553 | 84 | ssh_known_hosts_lines, | 86 | ssh_known_hosts_lines, |
554 | @@ -94,8 +96,8 @@ | |||
555 | 94 | console_attributes, | 96 | console_attributes, |
556 | 95 | service_guard, | 97 | service_guard, |
557 | 96 | guard_map, | 98 | guard_map, |
560 | 97 | services, | 99 | get_topics, |
561 | 98 | setup_ipv6 | 100 | setup_ipv6, |
562 | 99 | ) | 101 | ) |
563 | 100 | 102 | ||
564 | 101 | from charmhelpers.contrib.hahelpers.cluster import ( | 103 | from charmhelpers.contrib.hahelpers.cluster import ( |
565 | @@ -172,6 +174,8 @@ | |||
566 | 172 | for rid in relation_ids('cloud-compute')] | 174 | for rid in relation_ids('cloud-compute')] |
567 | 173 | for r_id in relation_ids('identity-service'): | 175 | for r_id in relation_ids('identity-service'): |
568 | 174 | identity_joined(rid=r_id) | 176 | identity_joined(rid=r_id) |
569 | 177 | for rid in relation_ids('zeromq-configuration'): | ||
570 | 178 | zeromq_configuration_relation_joined(rid) | ||
571 | 175 | [cluster_joined(rid) for rid in relation_ids('cluster')] | 179 | [cluster_joined(rid) for rid in relation_ids('cluster')] |
572 | 176 | update_nrpe_config() | 180 | update_nrpe_config() |
573 | 177 | 181 | ||
574 | @@ -866,6 +870,14 @@ | |||
575 | 866 | quantum_joined(rid=rid) | 870 | quantum_joined(rid=rid) |
576 | 867 | 871 | ||
577 | 868 | 872 | ||
578 | 873 | @hooks.hook('zeromq-configuration-relation-joined') | ||
579 | 874 | @os_requires_version('kilo', 'nova-common') | ||
580 | 875 | def zeromq_configuration_relation_joined(relid=None): | ||
581 | 876 | relation_set(relation_id=relid, | ||
582 | 877 | topics=" ".join(get_topics()), | ||
583 | 878 | users="nova") | ||
584 | 879 | |||
585 | 880 | |||
586 | 869 | @hooks.hook('nrpe-external-master-relation-joined', | 881 | @hooks.hook('nrpe-external-master-relation-joined', |
587 | 870 | 'nrpe-external-master-relation-changed') | 882 | 'nrpe-external-master-relation-changed') |
588 | 871 | def update_nrpe_config(): | 883 | def update_nrpe_config(): |
589 | @@ -889,6 +901,12 @@ | |||
590 | 889 | CONFIGS.write(NOVA_CONF) | 901 | CONFIGS.write(NOVA_CONF) |
591 | 890 | 902 | ||
592 | 891 | 903 | ||
593 | 904 | @hooks.hook('zeromq-configuration-relation-changed') | ||
594 | 905 | @restart_on_change(restart_map(), stopstart=True) | ||
595 | 906 | def zeromq_configuration_relation_changed(): | ||
596 | 907 | CONFIGS.write(NOVA_CONF) | ||
597 | 908 | |||
598 | 909 | |||
599 | 892 | def main(): | 910 | def main(): |
600 | 893 | try: | 911 | try: |
601 | 894 | hooks.execute(sys.argv) | 912 | hooks.execute(sys.argv) |
602 | 895 | 913 | ||
603 | === modified file 'hooks/nova_cc_utils.py' | |||
604 | --- hooks/nova_cc_utils.py 2015-03-31 11:39:19 +0000 | |||
605 | +++ hooks/nova_cc_utils.py 2015-03-31 14:56:40 +0000 | |||
606 | @@ -128,6 +128,8 @@ | |||
607 | 128 | service='nova', | 128 | service='nova', |
608 | 129 | service_user='nova'), | 129 | service_user='nova'), |
609 | 130 | nova_cc_context.VolumeServiceContext(), | 130 | nova_cc_context.VolumeServiceContext(), |
610 | 131 | context.ZeroMQContext(), | ||
611 | 132 | context.NotificationDriverContext(), | ||
612 | 131 | nova_cc_context.NovaIPv6Context(), | 133 | nova_cc_context.NovaIPv6Context(), |
613 | 132 | nova_cc_context.NeutronCCContext(), | 134 | nova_cc_context.NeutronCCContext(), |
614 | 133 | nova_cc_context.NovaConfigContext(), | 135 | nova_cc_context.NovaConfigContext(), |
615 | @@ -928,6 +930,13 @@ | |||
616 | 928 | return wrap | 930 | return wrap |
617 | 929 | 931 | ||
618 | 930 | 932 | ||
619 | 933 | def get_topics(): | ||
620 | 934 | topics = ['scheduler', 'conductor'] | ||
621 | 935 | if 'nova-consoleauth' in services(): | ||
622 | 936 | topics.append('consoleauth') | ||
623 | 937 | return topics | ||
624 | 938 | |||
625 | 939 | |||
626 | 931 | def cmd_all_services(cmd): | 940 | def cmd_all_services(cmd): |
627 | 932 | if cmd == 'start': | 941 | if cmd == 'start': |
628 | 933 | for svc in services(): | 942 | for svc in services(): |
629 | 934 | 943 | ||
630 | === added symlink 'hooks/zeromq-configuration-relation-changed' | |||
631 | === target is u'nova_cc_hooks.py' | |||
632 | === added symlink 'hooks/zeromq-configuration-relation-joined' | |||
633 | === target is u'nova_cc_hooks.py' | |||
634 | === modified file 'metadata.yaml' | |||
635 | --- metadata.yaml 2015-01-09 15:47:07 +0000 | |||
636 | +++ metadata.yaml 2015-03-31 14:56:40 +0000 | |||
637 | @@ -45,6 +45,9 @@ | |||
638 | 45 | scope: container | 45 | scope: container |
639 | 46 | memcache: | 46 | memcache: |
640 | 47 | interface: memcache | 47 | interface: memcache |
641 | 48 | zeromq-configuration: | ||
642 | 49 | interface: zeromq-configuration | ||
643 | 50 | scope: container | ||
644 | 48 | peers: | 51 | peers: |
645 | 49 | cluster: | 52 | cluster: |
646 | 50 | interface: nova-ha | 53 | interface: nova-ha |
647 | 51 | 54 | ||
648 | === modified file 'templates/icehouse/neutron.conf' | |||
649 | --- templates/icehouse/neutron.conf 2015-02-20 10:21:52 +0000 | |||
650 | +++ templates/icehouse/neutron.conf 2015-03-31 14:56:40 +0000 | |||
651 | @@ -7,7 +7,9 @@ | |||
652 | 7 | lock_path = $state_path/lock | 7 | lock_path = $state_path/lock |
653 | 8 | bind_host = {{ bind_host }} | 8 | bind_host = {{ bind_host }} |
654 | 9 | auth_strategy = keystone | 9 | auth_strategy = keystone |
655 | 10 | {% if notifications == 'True' -%} | ||
656 | 10 | notification_driver = neutron.openstack.common.notifier.rpc_notifier | 11 | notification_driver = neutron.openstack.common.notifier.rpc_notifier |
657 | 12 | {% endif -%} | ||
658 | 11 | api_workers = {{ workers }} | 13 | api_workers = {{ workers }} |
659 | 12 | use_syslog = {{ use_syslog }} | 14 | use_syslog = {{ use_syslog }} |
660 | 13 | 15 | ||
661 | 14 | 16 | ||
662 | === added directory 'templates/juno' | |||
663 | === added file 'templates/juno/nova.conf' | |||
664 | --- templates/juno/nova.conf 1970-01-01 00:00:00 +0000 | |||
665 | +++ templates/juno/nova.conf 2015-03-31 14:56:40 +0000 | |||
666 | @@ -0,0 +1,156 @@ | |||
667 | 1 | # juno | ||
668 | 2 | ############################################################################### | ||
669 | 3 | # [ WARNING ] | ||
670 | 4 | # Configuration file maintained by Juju. Local changes may be overwritten. | ||
671 | 5 | ############################################################################### | ||
672 | 6 | [DEFAULT] | ||
673 | 7 | verbose={{ verbose }} | ||
674 | 8 | debug={{ debug }} | ||
675 | 9 | dhcpbridge_flagfile=/etc/nova/nova.conf | ||
676 | 10 | dhcpbridge=/usr/bin/nova-dhcpbridge | ||
677 | 11 | logdir=/var/log/nova | ||
678 | 12 | state_path=/var/lib/nova | ||
679 | 13 | lock_path=/var/lock/nova | ||
680 | 14 | force_dhcp_release=True | ||
681 | 15 | iscsi_helper=tgtadm | ||
682 | 16 | libvirt_use_virtio_for_bridges=True | ||
683 | 17 | connection_type=libvirt | ||
684 | 18 | root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf | ||
685 | 19 | ec2_private_dns_show_ip=True | ||
686 | 20 | api_paste_config=/etc/nova/api-paste.ini | ||
687 | 21 | volumes_path=/var/lib/nova/volumes | ||
688 | 22 | enabled_apis=ec2,osapi_compute,metadata | ||
689 | 23 | auth_strategy=keystone | ||
690 | 24 | compute_driver=libvirt.LibvirtDriver | ||
691 | 25 | use_ipv6 = {{ use_ipv6 }} | ||
692 | 26 | osapi_compute_listen = {{ bind_host }} | ||
693 | 27 | metadata_host = {{ bind_host }} | ||
694 | 28 | s3_listen = {{ bind_host }} | ||
695 | 29 | ec2_listen = {{ bind_host }} | ||
696 | 30 | |||
697 | 31 | osapi_compute_workers = {{ workers }} | ||
698 | 32 | ec2_workers = {{ workers }} | ||
699 | 33 | |||
700 | 34 | scheduler_default_filters = RetryFilter,AvailabilityZoneFilter,CoreFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter | ||
701 | 35 | cpu_allocation_ratio = {{ cpu_allocation_ratio }} | ||
702 | 36 | ram_allocation_ratio = {{ ram_allocation_ratio }} | ||
703 | 37 | |||
704 | 38 | use_syslog={{ use_syslog }} | ||
705 | 39 | my_ip = {{ host_ip }} | ||
706 | 40 | |||
707 | 41 | {% if memcached_servers %} | ||
708 | 42 | memcached_servers = {{ memcached_servers }} | ||
709 | 43 | {% endif %} | ||
710 | 44 | |||
711 | 45 | {% if keystone_ec2_url -%} | ||
712 | 46 | keystone_ec2_url = {{ keystone_ec2_url }} | ||
713 | 47 | {% endif -%} | ||
714 | 48 | |||
715 | 49 | {% include "parts/rabbitmq" %} | ||
716 | 50 | |||
717 | 51 | {% if glance_api_servers -%} | ||
718 | 52 | glance_api_servers = {{ glance_api_servers }} | ||
719 | 53 | {% endif -%} | ||
720 | 54 | |||
721 | 55 | {% if rbd_pool -%} | ||
722 | 56 | rbd_pool = {{ rbd_pool }} | ||
723 | 57 | rbd_user = {{ rbd_user }} | ||
724 | 58 | rbd_secret_uuid = {{ rbd_secret_uuid }} | ||
725 | 59 | {% endif -%} | ||
726 | 60 | |||
727 | 61 | {% if neutron_plugin and neutron_plugin == 'ovs' -%} | ||
728 | 62 | libvirt_vif_driver = nova.virt.libvirt.vif.LibvirtGenericVIFDriver | ||
729 | 63 | libvirt_user_virtio_for_bridges = True | ||
730 | 64 | {% if neutron_security_groups -%} | ||
731 | 65 | security_group_api = {{ network_manager }} | ||
732 | 66 | nova_firewall_driver = nova.virt.firewall.NoopFirewallDriver | ||
733 | 67 | {% endif -%} | ||
734 | 68 | {% if external_network -%} | ||
735 | 69 | default_floating_pool = {{ external_network }} | ||
736 | 70 | {% endif -%} | ||
737 | 71 | {% endif -%} | ||
738 | 72 | |||
739 | 73 | {% if neutron_plugin and neutron_plugin == 'nvp' -%} | ||
740 | 74 | security_group_api = neutron | ||
741 | 75 | nova_firewall_driver = nova.virt.firewall.NoopFirewallDriver | ||
742 | 76 | {% if external_network -%} | ||
743 | 77 | default_floating_pool = {{ external_network }} | ||
744 | 78 | {% endif -%} | ||
745 | 79 | {% endif -%} | ||
746 | 80 | |||
747 | 81 | {% if network_manager_config -%} | ||
748 | 82 | {% for key, value in network_manager_config.iteritems() -%} | ||
749 | 83 | {{ key }} = {{ value }} | ||
750 | 84 | {% endfor -%} | ||
751 | 85 | {% endif -%} | ||
752 | 86 | |||
753 | 87 | {% if network_manager and network_manager == 'quantum' -%} | ||
754 | 88 | network_api_class = nova.network.quantumv2.api.API | ||
755 | 89 | quantum_url = {{ neutron_url }} | ||
756 | 90 | {% if auth_host -%} | ||
757 | 91 | quantum_auth_strategy = keystone | ||
758 | 92 | quantum_admin_tenant_name = {{ admin_tenant_name }} | ||
759 | 93 | quantum_admin_username = {{ admin_user }} | ||
760 | 94 | quantum_admin_password = {{ admin_password }} | ||
761 | 95 | quantum_admin_auth_url = {{ auth_protocol }}://{{ auth_host }}:{{ auth_port }}/v2.0 | ||
762 | 96 | {% endif -%} | ||
763 | 97 | {% elif network_manager and network_manager == 'neutron' -%} | ||
764 | 98 | network_api_class = nova.network.neutronv2.api.API | ||
765 | 99 | neutron_url = {{ neutron_url }} | ||
766 | 100 | {% if auth_host -%} | ||
767 | 101 | neutron_auth_strategy = keystone | ||
768 | 102 | neutron_admin_tenant_name = {{ admin_tenant_name }} | ||
769 | 103 | neutron_admin_username = {{ admin_user }} | ||
770 | 104 | neutron_admin_password = {{ admin_password }} | ||
771 | 105 | neutron_admin_auth_url = {{ auth_protocol }}://{{ auth_host }}:{{ auth_port }}/v2.0 | ||
772 | 106 | {% endif -%} | ||
773 | 107 | {% else -%} | ||
774 | 108 | network_manager = nova.network.manager.FlatDHCPManager | ||
775 | 109 | {% endif -%} | ||
776 | 110 | |||
777 | 111 | {% if default_floating_pool -%} | ||
778 | 112 | default_floating_pool = {{ default_floating_pool }} | ||
779 | 113 | {% endif -%} | ||
780 | 114 | |||
781 | 115 | {% if volume_service -%} | ||
782 | 116 | volume_api_class=nova.volume.cinder.API | ||
783 | 117 | {% endif -%} | ||
784 | 118 | |||
785 | 119 | {% if user_config_flags -%} | ||
786 | 120 | {% for key, value in user_config_flags.iteritems() -%} | ||
787 | 121 | {{ key }} = {{ value }} | ||
788 | 122 | {% endfor -%} | ||
789 | 123 | {% endif -%} | ||
790 | 124 | |||
791 | 125 | {% if listen_ports -%} | ||
792 | 126 | {% for key, value in listen_ports.iteritems() -%} | ||
793 | 127 | {{ key }} = {{ value }} | ||
794 | 128 | {% endfor -%} | ||
795 | 129 | {% endif -%} | ||
796 | 130 | |||
797 | 131 | {% if sections and 'DEFAULT' in sections -%} | ||
798 | 132 | {% for key, value in sections['DEFAULT'] -%} | ||
799 | 133 | {{ key }} = {{ value }} | ||
800 | 134 | {% endfor -%} | ||
801 | 135 | {% endif %} | ||
802 | 136 | |||
803 | 137 | {% include "parts/database-v2" %} | ||
804 | 138 | |||
805 | 139 | {% if auth_host -%} | ||
806 | 140 | [keystone_authtoken] | ||
807 | 141 | auth_uri = {{ service_protocol }}://{{ service_host }}:{{ service_port }}/ | ||
808 | 142 | auth_host = {{ auth_host }} | ||
809 | 143 | auth_port = {{ auth_port }} | ||
810 | 144 | auth_protocol = {{ auth_protocol }} | ||
811 | 145 | admin_tenant_name = {{ admin_tenant_name }} | ||
812 | 146 | admin_user = {{ admin_user }} | ||
813 | 147 | admin_password = {{ admin_password }} | ||
814 | 148 | {% endif -%} | ||
815 | 149 | |||
816 | 150 | [osapi_v3] | ||
817 | 151 | enabled=True | ||
818 | 152 | |||
819 | 153 | {% include "parts/cell" %} | ||
820 | 154 | |||
821 | 155 | [conductor] | ||
822 | 156 | workers = {{ workers }} | ||
823 | 0 | 157 | ||
824 | === modified file 'templates/kilo/nova.conf' | |||
825 | --- templates/kilo/nova.conf 2015-03-31 11:39:19 +0000 | |||
826 | +++ templates/kilo/nova.conf 2015-03-31 14:56:40 +0000 | |||
827 | @@ -114,6 +114,8 @@ | |||
828 | 114 | {% endfor -%} | 114 | {% endfor -%} |
829 | 115 | {% endif %} | 115 | {% endif %} |
830 | 116 | 116 | ||
831 | 117 | {% include "section-zeromq" %} | ||
832 | 118 | |||
833 | 117 | {% include "parts/database-v2" %} | 119 | {% include "parts/database-v2" %} |
834 | 118 | 120 | ||
835 | 119 | {% if glance_api_servers -%} | 121 | {% if glance_api_servers -%} |
836 | 120 | 122 | ||
837 | === added file 'templates/kilo/zeromq' | |||
838 | --- templates/kilo/zeromq 1970-01-01 00:00:00 +0000 | |||
839 | +++ templates/kilo/zeromq 2015-03-31 14:56:40 +0000 | |||
840 | @@ -0,0 +1,14 @@ | |||
841 | 1 | {% if zmq_host -%} | ||
842 | 2 | # ZeroMQ configuration (restart-nonce: {{ zmq_nonce }}) | ||
843 | 3 | rpc_backend = zmq | ||
844 | 4 | rpc_zmq_host = {{ zmq_host }} | ||
845 | 5 | {% if zmq_redis_address -%} | ||
846 | 6 | rpc_zmq_matchmaker = oslo_messaging._drivers.matchmaker_redis.MatchMakerRedis | ||
847 | 7 | matchmaker_heartbeat_freq = 15 | ||
848 | 8 | matchmaker_heartbeat_ttl = 30 | ||
849 | 9 | [matchmaker_redis] | ||
850 | 10 | host = {{ zmq_redis_address }} | ||
851 | 11 | {% else -%} | ||
852 | 12 | rpc_zmq_matchmaker = oslo_messaging._drivers.matchmaker_ring.MatchMakerRing | ||
853 | 13 | {% endif -%} | ||
854 | 14 | {% endif -%} | ||
855 | 0 | 15 | ||
856 | === modified file 'tests/charmhelpers/contrib/openstack/amulet/deployment.py' | |||
857 | --- tests/charmhelpers/contrib/openstack/amulet/deployment.py 2015-03-31 11:39:19 +0000 | |||
858 | +++ tests/charmhelpers/contrib/openstack/amulet/deployment.py 2015-03-31 14:56:40 +0000 | |||
859 | @@ -15,6 +15,7 @@ | |||
860 | 15 | # along with charm-helpers. If not, see <http://www.gnu.org/licenses/>. | 15 | # along with charm-helpers. If not, see <http://www.gnu.org/licenses/>. |
861 | 16 | 16 | ||
862 | 17 | import six | 17 | import six |
863 | 18 | from collections import OrderedDict | ||
864 | 18 | from charmhelpers.contrib.amulet.deployment import ( | 19 | from charmhelpers.contrib.amulet.deployment import ( |
865 | 19 | AmuletDeployment | 20 | AmuletDeployment |
866 | 20 | ) | 21 | ) |
867 | @@ -100,12 +101,34 @@ | |||
868 | 100 | """ | 101 | """ |
869 | 101 | (self.precise_essex, self.precise_folsom, self.precise_grizzly, | 102 | (self.precise_essex, self.precise_folsom, self.precise_grizzly, |
870 | 102 | self.precise_havana, self.precise_icehouse, | 103 | self.precise_havana, self.precise_icehouse, |
872 | 103 | self.trusty_icehouse) = range(6) | 104 | self.trusty_icehouse, self.trusty_juno, self.trusty_kilo) = range(8) |
873 | 104 | releases = { | 105 | releases = { |
874 | 105 | ('precise', None): self.precise_essex, | 106 | ('precise', None): self.precise_essex, |
875 | 106 | ('precise', 'cloud:precise-folsom'): self.precise_folsom, | 107 | ('precise', 'cloud:precise-folsom'): self.precise_folsom, |
876 | 107 | ('precise', 'cloud:precise-grizzly'): self.precise_grizzly, | 108 | ('precise', 'cloud:precise-grizzly'): self.precise_grizzly, |
877 | 108 | ('precise', 'cloud:precise-havana'): self.precise_havana, | 109 | ('precise', 'cloud:precise-havana'): self.precise_havana, |
878 | 109 | ('precise', 'cloud:precise-icehouse'): self.precise_icehouse, | 110 | ('precise', 'cloud:precise-icehouse'): self.precise_icehouse, |
880 | 110 | ('trusty', None): self.trusty_icehouse} | 111 | ('trusty', None): self.trusty_icehouse, |
881 | 112 | ('trusty', 'cloud:trusty-juno'): self.trusty_juno, | ||
882 | 113 | ('trusty', 'cloud:trusty-kilo'): self.trusty_kilo} | ||
883 | 111 | return releases[(self.series, self.openstack)] | 114 | return releases[(self.series, self.openstack)] |
884 | 115 | |||
885 | 116 | def _get_openstack_release_string(self): | ||
886 | 117 | """Get openstack release string. | ||
887 | 118 | |||
888 | 119 | Return a string representing the openstack release. | ||
889 | 120 | """ | ||
890 | 121 | releases = OrderedDict([ | ||
891 | 122 | ('precise', 'essex'), | ||
892 | 123 | ('quantal', 'folsom'), | ||
893 | 124 | ('raring', 'grizzly'), | ||
894 | 125 | ('saucy', 'havana'), | ||
895 | 126 | ('trusty', 'icehouse'), | ||
896 | 127 | ('utopic', 'juno'), | ||
897 | 128 | ('vivid', 'kilo'), | ||
898 | 129 | ]) | ||
899 | 130 | if self.openstack: | ||
900 | 131 | os_origin = self.openstack.split(':')[1] | ||
901 | 132 | return os_origin.split('%s-' % self.series)[1].split('/')[0] | ||
902 | 133 | else: | ||
903 | 134 | return releases[self.series] | ||
904 | 112 | 135 | ||
905 | === modified file 'unit_tests/test_nova_cc_hooks.py' | |||
906 | --- unit_tests/test_nova_cc_hooks.py 2015-03-31 11:39:19 +0000 | |||
907 | +++ unit_tests/test_nova_cc_hooks.py 2015-03-31 14:56:40 +0000 | |||
908 | @@ -120,10 +120,12 @@ | |||
909 | 120 | identity_joined, cluster_joined): | 120 | identity_joined, cluster_joined): |
910 | 121 | self.openstack_upgrade_available.return_value = True | 121 | self.openstack_upgrade_available.return_value = True |
911 | 122 | self.relation_ids.return_value = ['generic_rid'] | 122 | self.relation_ids.return_value = ['generic_rid'] |
912 | 123 | _zmq_joined = self.patch('zeromq_configuration_relation_joined') | ||
913 | 123 | hooks.config_changed() | 124 | hooks.config_changed() |
914 | 124 | self.assertTrue(self.do_openstack_upgrade.called) | 125 | self.assertTrue(self.do_openstack_upgrade.called) |
915 | 125 | self.assertTrue(neutron_api_joined.called) | 126 | self.assertTrue(neutron_api_joined.called) |
916 | 126 | self.assertTrue(identity_joined.called) | 127 | self.assertTrue(identity_joined.called) |
917 | 128 | self.assertTrue(_zmq_joined.called) | ||
918 | 127 | self.assertTrue(cluster_joined.called) | 129 | self.assertTrue(cluster_joined.called) |
919 | 128 | self.assertTrue(self.save_script_rc.called) | 130 | self.assertTrue(self.save_script_rc.called) |
920 | 129 | 131 |
UOSCI bot says:
This MP triggered a test on the Ubuntu OSCI system. Here is a summary of results.
#694 nova-cloud- controller- next for gnuoy mp238878
charm_lint_check
This build: 10.98.191. 181:8080/ job/charm_ lint_check/ 694/
http://
MP URL: /code.launchpad .net/~openstack -charmers/ charms/ trusty/ nova-cloud- controller/ 0mq/+merge/ 238878
https:/
Proposed branch:
lp:~openstack-charmers/charms/trusty/nova-cloud-controller/0mq
Results summary:
LINT FAIL: lint-check failed
LINT Results (max last 25 lines) from jenkins/ workspace/ charm_lint_ check/make- lint.694: cc_hooks. py:64:1: F811 redefinition of unused 'services' from line 64
/var/lib/
hooks/nova_
make: *** [lint] Error 1
Ubuntu OSCI Jenkins is currently in development on a Canonical private network, but we plan to publish results to a public instance soon. Tests are triggered if the proposed branch rev changes, or if the MP is placed into "Needs review" status after being otherwise for >= 1hr. Human review of results is still recommended. 10.98.191. 181:8080/
http://