monasca-agent/tests_to_fix/test_haproxy.py

188 lines
6.3 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import unittest
import subprocess
import time
import tempfile
import os
import urllib
import logging
from tests.common import load_check, kill_subprocess
from nose.plugins.attrib import attr
from nose.plugins.skip import SkipTest
logging.basicConfig()
MAX_WAIT = 30
HAPROXY_CFG = os.path.realpath(os.path.join(os.path.dirname(__file__), "haproxy.cfg"))
HAPROXY_OPEN_CFG = os.path.realpath(os.path.join(os.path.dirname(__file__), "haproxy-open.cfg"))
class HaproxyTestCase(unittest.TestCase):
def _wait(self, url):
loop = 0
while True:
try:
STATS_URL = ";csv;norefresh"
passman = urllib.request.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, "datadog", "isdevops")
authhandler = urllib.request.HTTPBasicAuthHandler(passman)
opener = urllib.request.build_opener(authhandler)
urllib.request.install_opener(opener)
url = "%s%s" % (url, STATS_URL)
req = urllib.request.Request(url)
request = urllib.request.urlopen(req)
break
except Exception:
time.sleep(0.5)
loop += 1
if loop >= MAX_WAIT:
break
return request
def setUp(self):
self.process = None
self.cfg = None
def start_server(self, config_fn, config):
self.agent_config = {
'version': '0.1',
'api_key': 'toto'
}
# Initialize the check from checks_d
self.check = load_check('haproxy', config, self.agent_config)
try:
self.cfg = tempfile.NamedTemporaryFile()
self.cfg.write(open(config_fn).read())
self.cfg.flush()
# Start haproxy
self.process = subprocess.Popen(["haproxy", "-d", "-f", self.cfg.name],
executable="haproxy",
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
# Wait for it to really start
self._wait("http://localhost:3834/stats")
except Exception:
logging.getLogger().exception("Cannot instantiate haproxy")
@attr('haproxy')
def testCheck(self):
raise SkipTest('Requires Haproxy')
config = {
'init_config': {},
'instances': [{
'url': 'http://localhost:3834/stats',
'username': 'datadog',
'password': 'isdevops',
'status_check': True,
'collect_aggregates_only': False,
}]
}
self.start_server(HAPROXY_CFG, config)
# Run the check against our running server
self.check.check(config['instances'][0])
# Sleep for 1 second so the rate interval >=1
time.sleep(1)
# Run the check again so we get the rates
self.check.check(config['instances'][0])
# Metric assertions
metrics = self.check.get_metrics()
assert metrics
self.assertIsInstance(metrics, list)
self.assertTrue(len(metrics) > 0)
self.assertEqual(len([t for t in metrics
if t[0] == "haproxy.backend.bytes.in_rate"]), 4, metrics)
self.assertEqual(len([t for t in metrics
if t[0] == "haproxy.frontend.session.current"]), 1, metrics)
inst = config['instances'][0]
data = self.check._fetch_data(inst['url'], inst['username'], inst['password'])
new_data = [l.replace("OPEN", "DOWN") for l in data]
self.check._process_data(new_data, False, True, inst['url']),
assert self.check.has_events()
assert len(self.check.get_events()) == 1
@attr('haproxy')
def testWrongConfig(self):
# Same check, with wrong data
config = {
'init_config': {},
'instances': [{
'url': 'http://localhost:3834/stats',
'username': 'wrong',
'password': 'isdevops',
'collect_aggregates_only': False,
}]
}
self.start_server(HAPROXY_CFG, config)
# Run the check, make sure there are no metrics or events
try:
self.check.check(config['instances'][0])
except Exception:
pass
else:
assert False, "Should raise an error"
metrics = self.check.get_metrics()
assert len(metrics) == 0
assert self.check.has_events() is False
@attr('haproxy')
def testOpenConfig(self):
raise SkipTest('Requires Haproxy')
# No passwords this time
config = {
'init_config': {},
'instances': [{
'url': 'http://localhost:3834/stats',
'collect_aggregates_only': False,
}]
}
self.start_server(HAPROXY_OPEN_CFG, config)
# Run the check against our running server
self.check.check(config['instances'][0])
# Sleep for 1 second so the rate interval >=1
time.sleep(1)
# Run the check again so we get the rates
self.check.check(config['instances'][0])
metrics = self.check.get_metrics()
assert metrics
self.assertIsInstance(metrics, list)
self.assertTrue(len(metrics) > 0)
self.assertEqual(len([t for t in metrics
if t[0] == "haproxy.backend.bytes.in_rate"]), 4, metrics)
self.assertEqual(len([t for t in metrics
if t[0] == "haproxy.frontend.session.current"]), 1, metrics)
def tearDown(self):
if self.process is not None:
kill_subprocess(self.process)
del self.cfg
if __name__ == "__main__":
unittest.main()