Add custom property for ``heartbeat_key``

Change-Id: Icd328e0b75cfb712b1519a6e2184b8ca0b6b137f
This commit is contained in:
Frode Nordahl 2018-10-24 14:02:45 +02:00
parent e0c0d38541
commit 5c4553e641
No known key found for this signature in database
GPG Key ID: 6A5D59A3BA48373F
8 changed files with 50 additions and 3 deletions

View File

@ -1,4 +1,5 @@
includes:
- layer:leadership
- layer:openstack-api
- interface:mysql-shared
- interface:rabbitmq

View File

@ -20,6 +20,8 @@ import charms_openstack.charm
import charms_openstack.adapters
import charms_openstack.ip as os_ip
import charms.leadership as leadership
import charmhelpers.core.host as ch_host
OCTAVIA_DIR = '/etc/octavia'
@ -95,3 +97,7 @@ class OctaviaCharm(charms_openstack.charm.HAOpenStackCharm):
OCTAVIA_WEBSERVER_SITE])
ch_host.service_reload('apache2',
restart_on_failure=True)
@charms_openstack.adapters.config_property
def heartbeat_key(self):
return leadership.leader_get('heartbeat-key')

View File

@ -12,7 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import uuid
import charms.reactive as reactive
import charms.leadership as leadership
import charms_openstack.charm as charm
@ -28,9 +31,17 @@ charm.use_defaults(
'update-status')
@reactive.when('leadership.is_leader')
@reactive.when_not('leadership.set.heartbeat-key')
def generate_heartbeat_key():
"""Generate a unique key for ``heartbeat_key`` configuration option."""
leadership.leader_set({'heartbeat-key': str(uuid.uuid4())})
@reactive.when('shared-db.available')
@reactive.when('identity-service.available')
@reactive.when('amqp.available')
@reactive.when('leadership.set.heartbeat-key')
def render(*args):
"""
Render the configuration for Octavia when all interfaces are available.

View File

@ -1,6 +1,9 @@
[DEFAULT]
debug = {{ options.debug }}
[health_manager]
heartbeat_key = {{ options.heartbeat_key }}
[database]
{% include "parts/database" %}

View File

@ -19,7 +19,7 @@ applications:
num_units: 1
octavia:
series: bionic
charm: octavia
charm: ../../../octavia
num_units: 1
options:
openstack-origin: cloud:bionic-rocky

View File

@ -20,3 +20,8 @@ sys.path.append('src/lib')
# Mock out charmhelpers so that we can test without it.
import charms_openstack.test_mocks # noqa
charms_openstack.test_mocks.mock_charmhelpers()
import mock
import charms
charms.leadership = mock.MagicMock()
sys.modules['charms.leadership'] = charms.leadership

View File

@ -55,3 +55,12 @@ class TestOctaviaCharm(Helper):
self.sp_check_call.assert_called_with(['a2ensite', 'octavia-api'])
self.service_reload.assert_called_with(
'apache2', restart_on_failure=True)
def test_heartbeat_key(self):
self.patch('charms.leadership.leader_get', 'leader_get')
self.leader_get.return_value = None
c = octavia.OctaviaCharm()
self.assertEqual(c.heartbeat_key(), None)
self.leader_get.return_value = 'FAKE-STORED-UUID-STRING'
self.assertEqual(c.heartbeat_key(), 'FAKE-STORED-UUID-STRING')
self.leader_get.assert_called_with('heartbeat-key')

View File

@ -37,13 +37,16 @@ class TestRegisteredHooks(test_utils.TestRegisteredHooks):
'when': {
'render': ('shared-db.available',
'identity-service.available',
'amqp.available',),
'amqp.available',
'leadership.set.heartbeat-key',),
'init_db': ('config.rendered',),
'cluster_connected': ('ha.connected',),
'generate_heartbeat_key': ('leadership.is_leader',),
},
'when_not': {
'init_db': ('db.synced',),
'cluster_connected': ('ha.available',),
'generate_heartbeat_key': ('leadership.set.heartbeat-key',),
},
}
# test that the hooks were registered via the
@ -51,7 +54,7 @@ class TestRegisteredHooks(test_utils.TestRegisteredHooks):
self.registered_hooks_test_helper(handlers, hook_set, defaults)
class TestRender(test_utils.PatchHelper):
class TestOctaviaHandlers(test_utils.PatchHelper):
def setUp(self):
super().setUp()
@ -62,6 +65,15 @@ class TestRender(test_utils.PatchHelper):
self.octavia_charm
self.provide_charm_instance().__exit__.return_value = None
def test_generate_heartbeat_key(self):
self.patch('charms.leadership.leader_set', 'leader_set')
self.patch('uuid.uuid4', 'uuid4')
self.uuid4.return_value = fake_uuid4 = 'FAKE-UUID4-STRING'
handlers.generate_heartbeat_key()
self.leader_set.assert_called_once_with(
{'heartbeat-key': fake_uuid4})
self.uuid4.assert_called_once_with()
def test_render(self):
self.patch('charms.reactive.set_state', 'set_state')
handlers.render('arg1', 'arg2')