mirror of
https://github.com/hanzo-ml/kserve.git
synced 2026-10-30 20:53:49 +00:00
* Fix python linter Signed-off-by: Sivanantham Chinnaiyan <[email protected]> * Format e2e tests Signed-off-by: Sivanantham Chinnaiyan <[email protected]> * Format hack, docs Signed-off-by: Sivanantham Chinnaiyan <[email protected]> * Add py-fmt target Signed-off-by: Sivanantham Chinnaiyan <[email protected]> * Update python lint workflow Signed-off-by: Sivanantham Chinnaiyan <[email protected]> * Rebase master Signed-off-by: Sivanantham Chinnaiyan <[email protected]> --------- Signed-off-by: Sivanantham Chinnaiyan <[email protected]>
130 lines
5.0 KiB
Python
130 lines
5.0 KiB
Python
import re
|
|
from urllib.parse import urlsplit
|
|
import requests
|
|
|
|
|
|
def get_istio_auth_session(url: str, username: str, password: str) -> dict:
|
|
"""
|
|
Determine if the specified URL is secured by Dex and try to obtain a session cookie.
|
|
WARNING: only Dex `staticPasswords` and `LDAP` authentication are currently supported
|
|
(we default to using `staticPasswords` if both are enabled)
|
|
|
|
:param url: Kubeflow server URL, including protocol
|
|
:param username: Dex `staticPasswords` or `LDAP` username
|
|
:param password: Dex `staticPasswords` or `LDAP` password
|
|
:return: auth session information
|
|
"""
|
|
# define the default return object
|
|
auth_session = {
|
|
"endpoint_url": url, # KF endpoint URL
|
|
"redirect_url": None, # KF redirect URL, if applicable
|
|
"dex_login_url": None, # Dex login URL (for POST of credentials)
|
|
"is_secured": None, # True if KF endpoint is secured
|
|
"session_cookie": None, # Resulting session cookies in the form "key1=value1; key2=value2"
|
|
}
|
|
|
|
# use a persistent session (for cookies)
|
|
with requests.Session() as s:
|
|
################
|
|
# Determine if Endpoint is Secured
|
|
################
|
|
resp = s.get(url, allow_redirects=True)
|
|
if resp.status_code != 200:
|
|
raise RuntimeError(
|
|
f"HTTP status code '{resp.status_code}' for GET against: {url}"
|
|
)
|
|
|
|
auth_session["redirect_url"] = resp.url
|
|
|
|
# if we were NOT redirected, then the endpoint is UNSECURED
|
|
if len(resp.history) == 0:
|
|
auth_session["is_secured"] = False
|
|
return auth_session
|
|
else:
|
|
auth_session["is_secured"] = True
|
|
|
|
################
|
|
# Get Dex Login URL
|
|
################
|
|
redirect_url_obj = urlsplit(auth_session["redirect_url"])
|
|
|
|
# if we are at `/auth?=xxxx` path, we need to select an auth type
|
|
if re.search(r"/auth$", redirect_url_obj.path):
|
|
#######
|
|
# TIP: choose the default auth type by including ONE of the following
|
|
#######
|
|
|
|
# OPTION 1: set "staticPasswords" as default auth type
|
|
redirect_url_obj = redirect_url_obj._replace(
|
|
path=re.sub(r"/auth$", "/auth/local", redirect_url_obj.path)
|
|
)
|
|
# OPTION 2: set "ldap" as default auth type
|
|
# redirect_url_obj = redirect_url_obj._replace(
|
|
# path=re.sub(r"/auth$", "/auth/ldap", redirect_url_obj.path)
|
|
# )
|
|
|
|
# if we are at `/auth/xxxx/login` path, then no further action is needed (we can use it for login POST)
|
|
if re.search(r"/auth/.*/login$", redirect_url_obj.path):
|
|
auth_session["dex_login_url"] = redirect_url_obj.geturl()
|
|
|
|
# else, we need to be redirected to the actual login page
|
|
else:
|
|
# this GET should redirect us to the `/auth/xxxx/login` path
|
|
resp = s.get(redirect_url_obj.geturl(), allow_redirects=True)
|
|
if resp.status_code != 200:
|
|
raise RuntimeError(
|
|
f"HTTP status code '{resp.status_code}' for GET against: {redirect_url_obj.geturl()}"
|
|
)
|
|
|
|
# set the login url
|
|
auth_session["dex_login_url"] = resp.url
|
|
|
|
################
|
|
# Attempt Dex Login
|
|
################
|
|
resp = s.post(
|
|
auth_session["dex_login_url"],
|
|
data={"login": username, "password": password},
|
|
allow_redirects=True,
|
|
)
|
|
if len(resp.history) == 0:
|
|
raise RuntimeError(
|
|
f"Login credentials were probably invalid - "
|
|
f"No redirect after POST to: {auth_session['dex_login_url']}"
|
|
)
|
|
|
|
# store the session cookies in a "key1=value1; key2=value2" string
|
|
auth_session["session_cookie"] = "; ".join(
|
|
[f"{c.name}={c.value}" for c in s.cookies]
|
|
)
|
|
auth_session["authservice_session"] = s.cookies.get("authservice_session")
|
|
|
|
return auth_session
|
|
|
|
|
|
if __name__ == "__main__":
|
|
KUBEFLOW_ENDPOINT = "http://localhost:8080" # Cluster IP and port
|
|
KUBEFLOW_USERNAME = "[email protected]"
|
|
KUBEFLOW_PASSWORD = "12341234"
|
|
MODEL_NAME = "sklearn-iris"
|
|
SERVICE_HOSTNAME = "sklearn-iris.kubeflow-user-example-com.example.com"
|
|
PREDICT_ENDPOINT = f"{KUBEFLOW_ENDPOINT}/v1/models/{MODEL_NAME}:predict"
|
|
iris_input = {"instances": [[6.8, 2.8, 4.8, 1.4], [6.0, 3.4, 4.5, 1.6]]}
|
|
|
|
_auth_session = get_istio_auth_session(
|
|
url=KUBEFLOW_ENDPOINT, username=KUBEFLOW_USERNAME, password=KUBEFLOW_PASSWORD
|
|
)
|
|
|
|
cookies = {"authservice_session": _auth_session["authservice_session"]}
|
|
jar = requests.cookies.cookiejar_from_dict(cookies)
|
|
|
|
res = requests.post(
|
|
url=PREDICT_ENDPOINT,
|
|
headers={"Host": SERVICE_HOSTNAME, "Content-Type": "application/json"},
|
|
cookies=jar,
|
|
json=iris_input,
|
|
timeout=200,
|
|
)
|
|
print("Status Code: ", res.status_code)
|
|
print("Response: ", res.json())
|