b8bb2ff4c3
Use the six library to get monasca-agent to work with python2.7 and python3. Story: 2004148 Task: 27621 Change-Id: I0de315967dd5a745741fda0c53ce8cc85cda8cc5 Signed-off-by: Chuck Short <chucks@redhat.com>
188 lines
6.3 KiB
Python
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 logging
|
|
|
|
from tests.common import load_check, kill_subprocess
|
|
from nose.plugins.attrib import attr
|
|
from nose.plugins.skip import SkipTest
|
|
|
|
from six.moves import urllib
|
|
|
|
|
|
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()
|