Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[network] Use ss instead of netstat on linux #1859

Merged
merged 4 commits into from
Sep 24, 2015
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[network] Add mock test to verify ss/netstat equivalence
olivielpeau committed Aug 25, 2015
commit 11590017e32384ad5e76895a56fef9956afc4f96
16 changes: 16 additions & 0 deletions tests/checks/fixtures/network/netstat
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 128 0.0.0.0:6379 0.0.0.0:* LISTEN
tcp 0 128 0.0.0.0:6380 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:80 127.0.0.1:51650 TIME_WAIT
tcp 0 0 127.0.0.1:58414 127.0.0.1:9200 TIME_WAIT
tcp 0 0 10.0.2.15:45637 10.0.2.15:9300 ESTABLISHED
tcp6 0 128 :::6380 :::* LISTEN
tcp6 0 0 127.0.0.1:58488 127.0.0.1:7199 TIME_WAIT
tcp6 0 0 127.0.0.1:42395 127.0.0.1:2181 ESTABLISHED
tcp6 0 0 127.0.0.1:58439 127.0.0.1:7199 CLOSING
udp 0 0 127.0.0.1:48135 127.0.0.1:8125 ESTABLISHED
udp 0 0 127.0.0.1:8125 0.0.0.0:*
udp6 0 0 fe80::a00:27ff:fee9:123 :::* ESTABLISHED
udp6 0 0 fe80::a00:27ff:fe1c:123 :::*
udp6 0 0 :::111 :::*
8 changes: 8 additions & 0 deletions tests/checks/fixtures/network/ss_ipv4
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp ESTAB 0 0 127.0.0.1:48135 127.0.0.1:8125
udp UNCONN 0 0 127.0.0.1:8125 *:*
tcp LISTEN 0 128 *:6379 *:*
tcp LISTEN 0 128 *:6380 *:*
tcp TIME-WAIT 0 0 127.0.0.1:80 127.0.0.1:51650
tcp TIME-WAIT 0 0 127.0.0.1:58414 127.0.0.1:9200
tcp ESTAB 0 0 10.0.2.15:45637 10.0.2.15:9300
8 changes: 8 additions & 0 deletions tests/checks/fixtures/network/ss_ipv6
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 :::111 :::*
udp UNCONN 0 0 fe80::a00:27ff:fe1c:3c4:123 :::*
udp ESTAB 0 0 fe80::a00:27ff:fee9:10ee:123 :::*
tcp LISTEN 0 128 :::6380 :::*
tcp TIME-WAIT 0 0 ::ffff:127.0.0.1:58488 ::ffff:127.0.0.1:7199
tcp ESTAB 0 0 ::ffff:127.0.0.1:42395 ::ffff:127.0.0.1:2181
tcp CLOSING 0 0 ::ffff:127.0.0.1:58439 ::ffff:127.0.0.1:7199
71 changes: 71 additions & 0 deletions tests/checks/mock/test_network.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# 3p
import mock

# project
from tests.checks.common import AgentCheckTest, Fixtures


def ss_popen_mock(*args, **kwargs):
popen_mock = mock.Mock()
if args[0][-1] == '-4':
popen_mock.communicate.return_value = (Fixtures.read_file('ss_ipv4'), None)
elif args[0][-1] == '-6':
popen_mock.communicate.return_value = (Fixtures.read_file('ss_ipv6'), None)

return popen_mock


def netstat_popen_mock(*args, **kwargs):
if args[0][0] == 'ss':
raise OSError
elif args[0][0] == 'netstat':
popen_mock = mock.Mock()
popen_mock.communicate.return_value = (Fixtures.read_file('netstat'), None)
return popen_mock


class TestCheckNetwork(AgentCheckTest):
CHECK_NAME = 'network'

def setUp(self):
self.config = {
"instances": [
{
"collect_connection_state": True
}
]
}
self.load_check(self.config)

CX_STATE_GAUGES_VALUES = {
'system.net.udp4.connections': 2,
'system.net.udp6.connections': 3,
'system.net.tcp4.established': 1,
'system.net.tcp4.opening': 0,
'system.net.tcp4.closing': 0,
'system.net.tcp4.listening': 2,
'system.net.tcp4.time_wait': 2,
'system.net.tcp6.established': 1,
'system.net.tcp6.opening': 0,
'system.net.tcp6.closing': 1,
'system.net.tcp6.listening': 1,
'system.net.tcp6.time_wait': 1,
}

@mock.patch('subprocess.Popen', side_effect=ss_popen_mock)
@mock.patch('network.Platform.is_linux', return_value=True)
def test_cx_state_linux_ss(self, mock_popen, mock_platform):
self.run_check({})

# Assert metrics
for metric, value in self.CX_STATE_GAUGES_VALUES.iteritems():
self.assertMetric(metric, value=value)

@mock.patch('subprocess.Popen', side_effect=netstat_popen_mock)
@mock.patch('network.Platform.is_linux', return_value=True)
def test_cx_state_linux_netstat(self, mock_popen, mock_platform):
self.run_check({})

# Assert metrics
for metric, value in self.CX_STATE_GAUGES_VALUES.iteritems():
self.assertMetric(metric, value=value)