github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/acceptancetests/repository/trusty/haproxy/hooks/tests/test_metrics.py (about) 1 import textwrap 2 3 from testtools import TestCase 4 from mock import patch, mock_open 5 6 import hooks 7 8 9 class MetricsTestCase(TestCase): 10 11 def add_patch(self, *args, **kwargs): 12 p = patch(*args, **kwargs) 13 self.addCleanup(p.stop) 14 return p.start() 15 16 def setUp(self): 17 super(MetricsTestCase, self).setUp() 18 19 self.open = mock_open() 20 self.add_patch("hooks.open", self.open, create=True) 21 self.copy2 = self.add_patch("shutil.copy2") 22 self.config_get = self.add_patch("hooks.config_get") 23 self.local_unit = self.add_patch("hooks.local_unit") 24 self.log = self.add_patch("hooks.log") 25 self.apt_install = self.add_patch("hooks.apt_install") 26 self.get_monitoring_password = self.add_patch( 27 "hooks.get_monitoring_password") 28 29 self.config_get.return_value = { 30 'metrics_sample_interval': 5, 31 'metrics_prefix': 'prefix.$UNIT', 32 'metrics_target': 'localhost:4321', 33 'enable_monitoring': True, 34 'monitoring_port': '1234', 35 'monitoring_username': 'monitor', 36 'monitoring_password': 'monitorpass', 37 } 38 self.local_unit.return_value = "unit/0" 39 40 @patch('hooks.os.unlink') 41 def test_write_metrics_cronjob_disabled_no_monitoring(self, mock_unlink): 42 self.config_get.return_value['enable_monitoring'] = False 43 hooks.write_metrics_cronjob('/script', '/cron') 44 self.assertEqual(mock_unlink.mock_calls[0][1][0], '/cron') 45 46 @patch('hooks.os.unlink') 47 def test_write_metrics_cronjob_disabled_no_target(self, mock_unlink): 48 self.config_get.return_value['metrics_target'] = '' 49 hooks.write_metrics_cronjob('/script', '/cron') 50 self.assertEqual(mock_unlink.mock_calls[0][1][0], '/cron') 51 52 @patch('hooks.os.unlink') 53 def test_write_metrics_cronjob_disabled_bad_target(self, mock_unlink): 54 self.config_get.return_value['metrics_target'] = 'sadfsadf' 55 hooks.write_metrics_cronjob('/script', '/cron') 56 self.assertEqual(mock_unlink.mock_calls[0][1][0], '/cron') 57 58 def test_write_metrics_cronjob_enabled(self): 59 self.get_monitoring_password.return_value = 'monitorpass' 60 self.config_get.return_value['metrics_target'] = 'localhost:4321' 61 62 hooks.write_metrics_cronjob('/script', '/cron') 63 64 cron_open_args = self.open.mock_calls[0][1] 65 self.assertEqual(cron_open_args, ('/cron', 'w')) 66 67 cron_write = self.open.mock_calls[2][1][0] 68 expected_cron = textwrap.dedent(""" 69 # crontab for pushing haproxy metrics to statsd 70 */5 * * * * root bash /script prefix.unit-0 5min localhost:1234\ 71 monitor:monitorpass | python -c "import socket, sys; sock =\ 72 socket.socket(socket.AF_INET, socket.SOCK_DGRAM); map(lambda line:\ 73 sock.sendto(line, ('localhost', 4321)), sys.stdin)" 74 """).lstrip() 75 self.assertEqual(expected_cron, cron_write)