Merge "Correct the interval between two reports" into stable/mitaka

This commit is contained in:
Jenkins 2016-05-30 22:22:51 +00:00 committed by Gerrit Code Review
commit 2c8a57f4d7
2 changed files with 49 additions and 6 deletions

View File

@ -13,7 +13,6 @@
# under the License.
import sys
import time
from oslo_config import cfg
from oslo_log import log as logging
@ -22,6 +21,7 @@ from oslo_service import loopingcall
from oslo_service import periodic_task
from oslo_service import service
from oslo_utils import importutils
from oslo_utils import timeutils
from neutron._i18n import _, _LE, _LI, _LW
from neutron.agent.common import config
@ -117,7 +117,7 @@ class MeteringAgent(MeteringPluginRpc, manager.Manager):
info['time'] = 0
def _purge_metering_info(self):
deadline_timestamp = int(time.time()) - self.conf.report_interval
deadline_timestamp = timeutils.utcnow_ts() - self.conf.report_interval
label_ids = [
label_id
for label_id, info in self.metering_infos.items()
@ -126,7 +126,7 @@ class MeteringAgent(MeteringPluginRpc, manager.Manager):
del self.metering_infos[label_id]
def _add_metering_info(self, label_id, pkts, bytes):
ts = int(time.time())
ts = timeutils.utcnow_ts()
info = self.metering_infos.get(label_id, {'bytes': 0,
'pkts': 0,
'time': 0,
@ -161,11 +161,11 @@ class MeteringAgent(MeteringPluginRpc, manager.Manager):
def _metering_loop(self):
self._add_metering_infos()
ts = int(time.time())
ts = timeutils.utcnow_ts()
delta = ts - self.last_report
report_interval = self.conf.report_interval
if delta > report_interval:
if delta >= report_interval:
self._metering_notification()
self._purge_metering_info()
self.last_report = ts

View File

@ -14,13 +14,14 @@
import mock
from oslo_config import cfg
from oslo_utils import fixture as utils_fixture
from oslo_utils import timeutils
from oslo_utils import uuidutils
from neutron.services.metering.agents import metering_agent
from neutron.tests import base
from neutron.tests import fake_notifier
_uuid = uuidutils.generate_uuid
TENANT_ID = _uuid()
@ -122,6 +123,48 @@ class TestMeteringOperations(base.BaseTestCase):
self.assertEqual(88, payload['pkts'])
self.assertEqual(444, payload['bytes'])
def test_notification_report_interval(self):
measure_interval = 30
report_interval = 600
now = timeutils.utcnow()
time_fixture = self.useFixture(utils_fixture.TimeFixture(now))
self.addCleanup(timeutils.clear_time_override)
self.agent.routers_updated(None, ROUTERS)
self.driver.get_traffic_counters.return_value = {LABEL_ID:
{'pkts': 889,
'bytes': 4440}}
cfg.CONF.set_override('measure_interval', measure_interval)
cfg.CONF.set_override('report_interval', report_interval)
for i in range(report_interval):
self.agent._metering_loop()
count = 0
if len(fake_notifier.NOTIFICATIONS) > 1:
for n in fake_notifier.NOTIFICATIONS:
if n['event_type'] == 'l3.meter':
#skip the first notification because the time is 0
count += 1
if count > 1:
break
time_fixture.advance_time_seconds(measure_interval)
self.assertEqual('l3.meter', n['event_type'])
payload = n['payload']
self.assertEqual(TENANT_ID, payload['tenant_id'])
self.assertEqual(LABEL_ID, payload['label_id'])
self.assertTrue((payload['time'] - report_interval)
< measure_interval, payload)
interval = (payload['last_update'] - payload['first_update']) \
- report_interval
self.assertTrue(interval < measure_interval, payload)
def test_router_deleted(self):
label_id = _uuid()
self.driver.get_traffic_counters = mock.MagicMock()