Merge pull request #10037 from ipmb/features/nginx_status

Adds Nginx status module
This commit is contained in:
Thomas S Hatch 2014-01-29 19:29:08 -08:00
commit a1561ec7e3
2 changed files with 95 additions and 1 deletions

View File

@ -2,7 +2,7 @@
'''
Support for nginx
'''
import urllib2
# Import salt libs
import salt.utils
import salt.utils.decorators as decorators
@ -93,3 +93,42 @@ def signal(signal=None):
else:
ret = 'Command: "{0}" completed successfully!'.format(cmd)
return ret
def status(url="http://127.0.0.1/status"):
"""
Return the data from an Nginx status page as a dictionary.
http://wiki.nginx.org/HttpStubStatusModule
url
The URL of the status page. Defaults to 'http://127.0.0.1/status'
CLI Example:
.. code-block:: bash
salt '*' nginx.status
"""
resp = urllib2.urlopen(url)
status = resp.read()
resp.close()
lines = status.splitlines()
if not len(lines) == 4:
return
# "Active connections: 1 "
active_connections = lines[0].split()[2]
# "server accepts handled requests"
# " 12 12 9 "
accepted, handled, requests = lines[2].split()
# "Reading: 0 Writing: 1 Waiting: 0 "
_, reading, _, writing, _, waiting = lines[3].split()
return {
'active connections': int(active_connections),
'accepted': int(accepted),
'handled': int(handled),
'requests': int(requests),
'reading': int(reading),
'writing': int(writing),
'waiting': int(waiting),
}

View File

@ -0,0 +1,55 @@
# -*- coding: utf-8 -*-
import urllib2
# Import Salt Testing libs
from salttesting import skipIf, TestCase
from salttesting.helpers import ensure_in_syspath
from salttesting.mock import NO_MOCK, NO_MOCK_REASON, Mock, patch
from salt.modules import nginx
ensure_in_syspath('../../')
MOCK_STATUS_OUTPUT = """Active connections: 7
server accepts handled requests
46756 46756 89318
Reading: 0 Writing: 7 Waiting: 0"""
class MockUrllibStatus(object):
"""Mock of urllib2 call for Nginx status"""
def read(self):
return MOCK_STATUS_OUTPUT
def close(self):
pass
@skipIf(NO_MOCK, NO_MOCK_REASON)
@patch('salt.utils.which', Mock(return_value='/usr/bin/nginx'))
class NginxTestCase(TestCase):
@patch('urllib2.urlopen', Mock(return_value=MockUrllibStatus()))
def test_nginx_status(self):
result = nginx.status()
urllib2.urlopen.assert_called_once_with('http://127.0.0.1/status')
self.assertEqual(result, {
'active connections': 7,
'accepted': 46756,
'handled': 46756,
'requests': 89318,
'reading': 0,
'writing': 7,
'waiting': 0,
})
@patch('urllib2.urlopen', Mock(return_value=MockUrllibStatus()))
def test_nginx_status_with_arg(self):
other_path = 'http://localhost/path'
result = nginx.status(other_path)
urllib2.urlopen.assert_called_once_with(other_path)
if __name__ == '__main__':
from integration import run_tests
run_tests(NginxTestCase, needs_daemon=False)