Skip to content

Commit 151376e

Browse files
authored
Add testing for basic auth plugin for HTTP/gRPC clients (#5739)
* Add HTTP basic auth test * Add testing for gRPC basic auth * Fix up * Remove unused imports
1 parent 1046b0f commit 151376e

File tree

6 files changed

+282
-0
lines changed

6 files changed

+282
-0
lines changed

qa/L0_grpc/grpc_basic_auth_test.py

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#!/usr/bin/python
2+
# Copyright 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3+
#
4+
# Redistribution and use in source and binary forms, with or without
5+
# modification, are permitted provided that the following conditions
6+
# are met:
7+
# * Redistributions of source code must retain the above copyright
8+
# notice, this list of conditions and the following disclaimer.
9+
# * Redistributions in binary form must reproduce the above copyright
10+
# notice, this list of conditions and the following disclaimer in the
11+
# documentation and/or other materials provided with the distribution.
12+
# * Neither the name of NVIDIA CORPORATION nor the names of its
13+
# contributors may be used to endorse or promote products derived
14+
# from this software without specific prior written permission.
15+
#
16+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
17+
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19+
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20+
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21+
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22+
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23+
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24+
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27+
import unittest
28+
import sys
29+
30+
sys.path.append("../common")
31+
32+
import test_util as tu
33+
import tritonclient.grpc as tritongrpcclient
34+
import tritonclient.grpc.aio as asynctritongrpcclient
35+
36+
from tritonclient.grpc.auth import BasicAuth
37+
from tritonclient.grpc.aio.auth import BasicAuth as AsyncBasicAuth
38+
39+
40+
class GRPCBasicAuthTest(tu.TestResultCollector):
41+
42+
def setUp(self):
43+
# Use the nginx port
44+
self._client = tritongrpcclient.InferenceServerClient(
45+
url='localhost:8004')
46+
self._client.register_plugin(BasicAuth('username', 'password'))
47+
48+
def test_client_call(self):
49+
self.assertTrue(self._client.is_server_live())
50+
51+
def tearDown(self):
52+
self._client.close()
53+
54+
55+
class GRPCBasicAuthAsyncTest(unittest.IsolatedAsyncioTestCase):
56+
57+
async def asyncSetUp(self):
58+
# Use the nginx port
59+
self._client = asynctritongrpcclient.InferenceServerClient(
60+
url='localhost:8004')
61+
self._client.register_plugin(AsyncBasicAuth('username', 'password'))
62+
63+
async def test_client_call(self):
64+
self.assertTrue(await self._client.is_server_live())
65+
66+
async def asyncTearDown(self):
67+
await self._client.close()
68+
69+
70+
if __name__ == '__main__':
71+
unittest.main()

qa/L0_grpc/nginx.conf

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Copyright 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
#
3+
# Redistribution and use in source and binary forms, with or without
4+
# modification, are permitted provided that the following conditions
5+
# are met:
6+
# * Redistributions of source code must retain the above copyright
7+
# notice, this list of conditions and the following disclaimer.
8+
# * Redistributions in binary form must reproduce the above copyright
9+
# notice, this list of conditions and the following disclaimer in the
10+
# documentation and/or other materials provided with the distribution.
11+
# * Neither the name of NVIDIA CORPORATION nor the names of its
12+
# contributors may be used to endorse or promote products derived
13+
# from this software without specific prior written permission.
14+
#
15+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
16+
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18+
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
19+
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20+
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21+
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22+
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23+
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26+
27+
worker_processes 1;
28+
29+
error_log /var/log/nginx/error.log;
30+
31+
events {
32+
worker_connections 1024;
33+
}
34+
35+
http {
36+
# Configure basic authentication
37+
auth_basic "Restricted Content";
38+
auth_basic_user_file /opt/tritonserver/qa/L0_grpc/pswd;
39+
40+
# Define upstream server
41+
upstream backend {
42+
server localhost:8001;
43+
}
44+
45+
# Define server block for reverse proxy
46+
server {
47+
listen 8004 http2;
48+
49+
# Configure location for reverse proxy
50+
location / {
51+
grpc_pass grpc://backend;
52+
}
53+
}
54+
}

qa/L0_grpc/test.sh

+15
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ export CUDA_VISIBLE_DEVICES=0
4343
RET=0
4444

4545
CLIENT_PLUGIN_TEST="./grpc_client_plugin_test.py"
46+
BASIC_AUTH_TEST="./grpc_basic_auth_test.py"
47+
NGINX_CONF="./nginx.conf"
4648
# On windows the paths invoked by the script (running in WSL) must use
4749
# /mnt/c when needed but the paths on the tritonserver command-line
4850
# must be C:/ style.
@@ -352,6 +354,19 @@ if [ $? -ne 0 ]; then
352354
RET=1
353355
fi
354356
set -e
357+
358+
# Create a password file with username:password
359+
echo -n 'username:' > pswd
360+
echo "password" | openssl passwd -stdin -apr1 >> pswd
361+
nginx -c `pwd`/$NGINX_CONF
362+
363+
python3 $BASIC_AUTH_TEST
364+
if [ $? -ne 0 ]; then
365+
cat ${CLIENT_LOG}.python.plugin.auth
366+
RET=1
367+
fi
368+
service nginx stop
369+
355370
kill $SERVER_PID
356371
wait $SERVER_PID
357372

qa/L0_http/http_basic_auth_test.py

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#!/usr/bin/python
2+
# Copyright 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3+
#
4+
# Redistribution and use in source and binary forms, with or without
5+
# modification, are permitted provided that the following conditions
6+
# are met:
7+
# * Redistributions of source code must retain the above copyright
8+
# notice, this list of conditions and the following disclaimer.
9+
# * Redistributions in binary form must reproduce the above copyright
10+
# notice, this list of conditions and the following disclaimer in the
11+
# documentation and/or other materials provided with the distribution.
12+
# * Neither the name of NVIDIA CORPORATION nor the names of its
13+
# contributors may be used to endorse or promote products derived
14+
# from this software without specific prior written permission.
15+
#
16+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
17+
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19+
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20+
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21+
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22+
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23+
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24+
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27+
import unittest
28+
import sys
29+
30+
sys.path.append("../common")
31+
32+
import test_util as tu
33+
import tritonclient.http as tritonhttpclient
34+
import tritonclient.http.aio as asynctritonhttpclient
35+
36+
from tritonclient.http.auth import BasicAuth
37+
from tritonclient.http.aio.auth import BasicAuth as AsyncBasicAuth
38+
39+
40+
class HTTPBasicAuthTest(tu.TestResultCollector):
41+
42+
def setUp(self):
43+
# Use the nginx port
44+
self._client = tritonhttpclient.InferenceServerClient(
45+
url='localhost:8004')
46+
self._client.register_plugin(BasicAuth('username', 'password'))
47+
48+
def test_client_call(self):
49+
self.assertTrue(self._client.is_server_live())
50+
51+
def tearDown(self):
52+
self._client.close()
53+
54+
55+
class HTTPBasicAuthAsyncTest(unittest.IsolatedAsyncioTestCase):
56+
57+
async def asyncSetUp(self):
58+
# Use the nginx port
59+
self._client = asynctritonhttpclient.InferenceServerClient(
60+
url='localhost:8004')
61+
self._client.register_plugin(AsyncBasicAuth('username', 'password'))
62+
63+
async def test_client_call(self):
64+
self.assertTrue(await self._client.is_server_live())
65+
66+
async def asyncTearDown(self):
67+
await self._client.close()
68+
69+
70+
if __name__ == '__main__':
71+
unittest.main()

qa/L0_http/nginx.conf

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Copyright 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
#
3+
# Redistribution and use in source and binary forms, with or without
4+
# modification, are permitted provided that the following conditions
5+
# are met:
6+
# * Redistributions of source code must retain the above copyright
7+
# notice, this list of conditions and the following disclaimer.
8+
# * Redistributions in binary form must reproduce the above copyright
9+
# notice, this list of conditions and the following disclaimer in the
10+
# documentation and/or other materials provided with the distribution.
11+
# * Neither the name of NVIDIA CORPORATION nor the names of its
12+
# contributors may be used to endorse or promote products derived
13+
# from this software without specific prior written permission.
14+
#
15+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
16+
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18+
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
19+
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20+
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21+
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22+
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23+
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26+
27+
worker_processes 1;
28+
29+
error_log /var/log/nginx/error.log;
30+
31+
events {
32+
worker_connections 1024;
33+
}
34+
35+
http {
36+
# Configure basic authentication
37+
auth_basic "Restricted Content";
38+
auth_basic_user_file /opt/tritonserver/qa/L0_http/pswd;
39+
40+
# Define upstream server
41+
upstream backend {
42+
server localhost:8000;
43+
}
44+
45+
# Define server block for reverse proxy
46+
server {
47+
listen 8004;
48+
49+
# Configure location for reverse proxy
50+
location / {
51+
proxy_pass http://backend;
52+
proxy_set_header Host $host;
53+
proxy_set_header X-Real-IP $remote_addr;
54+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
55+
}
56+
}
57+
}

qa/L0_http/test.sh

+14
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ export CUDA_VISIBLE_DEVICES=0
4343
RET=0
4444

4545
CLIENT_PLUGIN_TEST="./http_client_plugin_test.py"
46+
BASIC_AUTH_TEST="./http_basic_auth_test.py"
47+
NGINX_CONF="./nginx.conf"
4648
# On windows the paths invoked by the script (running in WSL) must use
4749
# /mnt/c when needed but the paths on the tritonserver command-line
4850
# must be C:/ style.
@@ -240,6 +242,18 @@ if [ $? -ne 0 ]; then
240242
RET=1
241243
fi
242244

245+
# Create a password file with username:password
246+
echo -n 'username:' > pswd
247+
echo "password" | openssl passwd -stdin -apr1 >> pswd
248+
nginx -c `pwd`/$NGINX_CONF
249+
250+
python3 $BASIC_AUTH_TEST
251+
if [ $? -ne 0 ]; then
252+
cat ${CLIENT_LOG}.python.plugin.auth
253+
RET=1
254+
fi
255+
service nginx stop
256+
243257
# Test with the base path in url.
244258
$SIMPLE_INFER_CLIENT -u localhost:8000/base_path -v >> ${CLIENT_LOG}.c++.base_path_url 2>&1
245259
if [ $? -eq 0 ]; then

0 commit comments

Comments
 (0)