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)