Skip to content

Commit

Permalink
working metrics plugin
Browse files Browse the repository at this point in the history
with makeService tests, yet to write test for options
  • Loading branch information
Manish Tomar committed Oct 7, 2014
1 parent ba26357 commit 2ec0617
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 3 deletions.
3 changes: 2 additions & 1 deletion config.json
Expand Up @@ -57,6 +57,7 @@
"region": "IAD",
"username": "stretchdev",
"password": "REPLACE_WITH_REAL_PASSWORD",
"ttl": 432000
"ttl": 432000,
"interval": 60
}
}
29 changes: 28 additions & 1 deletion otter/metrics.py
Expand Up @@ -12,6 +12,8 @@

from twisted.internet import task, defer
from twisted.internet.endpoints import clientFromString
from twisted.application.internet import TimerService
from twisted.python import usage

from silverberg.client import ConsistencyLevel
from silverberg.cluster import RoundRobinCassandraCluster
Expand Down Expand Up @@ -290,8 +292,33 @@ def main(reactor, config, _print=False):
yield client.disconnect()


class Options(usage.Options):
"""
Options for otter-metrics service
"""

optParameters = [["config", "c", "config.json", "path to JSON configuration file"]]

def postOptions(self):
"""
Parse config file and add nova service name
"""
self.update(json.load(open(self['config'])))
self.update({'services': {'nova': 'cloudServersOpenStack'}})


def makeService(config):
"""
Set up the otter-metrics service.
"""
from twisted.internet import reactor
config = dict(config)
return TimerService(
get_in(['metrics', 'interval'], config, default=60), main, reactor, config)


if __name__ == '__main__':
config = json.load(open(sys.argv[1]))
config = json.load(open(sys.argv[2]))
config['services'] = {'nova': 'cloudServersOpenStack'}
# TODO: Take _print as cmd-line arg and pass it.
task.react(main, (config, True))
30 changes: 29 additions & 1 deletion otter/test/test_metrics.py
Expand Up @@ -11,10 +11,11 @@

from twisted.trial.unittest import SynchronousTestCase
from twisted.internet.defer import succeed
from twisted.application.internet import TimerService

from otter.metrics import (
get_scaling_groups, get_tenant_metrics, get_all_metrics, GroupMetrics,
add_to_cloud_metrics, main as metrics_main)
add_to_cloud_metrics, main as metrics_main, makeService)
from otter.test.utils import patch, StubTreq2, matches
from otter.util.http import headers
from otter.log import BoundLog
Expand Down Expand Up @@ -250,3 +251,30 @@ def test_metrics_collected(self):
self.add_to_cloud_metrics.assert_called_once_with(
'm', 'id', 'r', 107, 26, 1)
client.disconnect.assert_called_once_with()


class ServiceTests(SynchronousTestCase):
"""
Tests for :func:`otter.metrics.makeService` and :func:`otter.metrics.Options`
"""

def test_make_service(self):
"""
TimerService is returned with main as its function
"""
c = {'metrics': {'interval': 20}}
s = makeService(c)
self.assertIsInstance(s, TimerService)
self.assertEqual(s.step, 20)
from twisted.internet.base import ReactorBase
self.assertEqual(
s.call,
(metrics_main, (matches(IsInstance(ReactorBase)), c), {}))

def test_make_service_no_interval(self):
"""
makeService uses 60 as default interval if not provided in config
"""
s = makeService({})
self.assertIsInstance(s, TimerService)
self.assertEqual(s.step, 60)

0 comments on commit 2ec0617

Please sign in to comment.