Don't use gnocchiclient during publisher init

We can't create archive policies in publisher init because if it fail
because Gnocchi is not yet ready the publisher fail to load. Ceilometer
will work, but samples will go to nowhere.

This change creates/checks archive policies when we publish a sample for
the very first time. If that fail because Gnocchi is not ready, this
will just retry next time Ceilometer will publish samples.

Closes-Bug: #1752420

Change-Id: Ib6b4da54592ad99a4e6561a73473b6c7ec73a21f
This commit is contained in:
Mehdi Abaakouk 2018-03-01 12:06:33 +01:00
parent e4c513b476
commit 14906f8672
2 changed files with 11 additions and 9 deletions

View File

@ -246,7 +246,7 @@ class GnocchiPublisher(publisher.ConfigPublisherBase):
self._already_logged_event_types = set()
self._already_logged_metric_names = set()
self.ensures_archives_policies()
self._already_configured_archive_policies = False
@staticmethod
def _load_definitions(conf, archive_policy_override,
@ -273,11 +273,13 @@ class GnocchiPublisher(publisher.ConfigPublisherBase):
return resource_defs, data.get("archive_policies", [])
def ensures_archives_policies(self):
for ap in self.archive_policies_definition:
try:
self._gnocchi.archive_policy.get(ap["name"])
except gnocchi_exc.ArchivePolicyNotFound:
self._gnocchi.archive_policy.create(ap)
if not self._already_configured_archive_policies:
for ap in self.archive_policies_definition:
try:
self._gnocchi.archive_policy.get(ap["name"])
except gnocchi_exc.ArchivePolicyNotFound:
self._gnocchi.archive_policy.create(ap)
self._already_configured_archive_policies = True
@property
def gnocchi_project_id(self):
@ -325,6 +327,8 @@ class GnocchiPublisher(publisher.ConfigPublisherBase):
return rd, operation
def publish_samples(self, data):
self.ensures_archives_policies()
# NOTE(sileht): skip sample generated by gnocchi itself
data = [s for s in data if not self._is_gnocchi_activity(s)]
data.sort(key=operator.attrgetter('resource_id'))

View File

@ -474,8 +474,6 @@ class PublisherWorkflowTest(base.BaseTestCase,
self.useFixture(utils_fixture.TimeFixture(now))
expected_calls = [
mock.call.archive_policy.get("ceilometer-low"),
mock.call.archive_policy.get("ceilometer-low-rate"),
mock.call.resource.search('instance_network_interface',
search_params),
mock.call.resource.search('instance_disk', search_params),
@ -505,7 +503,7 @@ class PublisherWorkflowTest(base.BaseTestCase,
IMAGE_DELETE_START,
VOLUME_DELETE_START,
FLOATINGIP_DELETE_END])
self.assertEqual(10, len(fakeclient.mock_calls))
self.assertEqual(8, len(fakeclient.mock_calls))
for call in expected_calls:
self.assertIn(call, fakeclient.mock_calls)