Skip to content

Commit 4c1638c

Browse files
committed
Add fapi advanced tests
1 parent 1670105 commit 4c1638c

6 files changed

Lines changed: 266 additions & 18 deletions

File tree

config/settings.yaml.tpl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,25 @@ default:
9494
token: # token for openshift where the testenv tools are deployed (unnecessary for for default openshift)
9595
private_base_url:
9696
default: echo_api # tool name to be used by default for backend
97+
shared_certs:
98+
# config for obtaining certificates which are signed by same CA as tools.
99+
# If this config is not set, testsuite will use same openshift and namespace as tools
100+
namespace: tools # openshift namespace/project where the secrets with certificates are deployed
101+
server_url: # openshift url where the secrets with certificates are deployed
102+
token: # token for openshift where the secrets with certificates are deployed
103+
# certs can be also added manually
104+
client_certs:
105+
valid:
106+
- name: client1
107+
crt: "cert1"
108+
key: "key1"
109+
- name: client2
110+
crt: "cert2"
111+
key: "key2"
112+
invalid:
113+
- name: client3
114+
crt: "cert3"
115+
key: "key3"
97116
warn_and_skip:
98117
# section to control how warn_and_skip should behave for particular tests
99118
# works just for tests and fixture that use warn_and_skip

testsuite/dynaconf_loader.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,43 @@ def _rhsso_credentials(tools_config, rhsso_config):
153153
return None, None
154154

155155

156+
def _shared_tool_certs(tools_config, shared_certs_config):
157+
"""Search for SSO clients certificates"""
158+
if not shared_certs_config:
159+
shared_certs_config = tools_config
160+
server_url = shared_certs_config.get("server_url")
161+
project = shared_certs_config.get("namespace")
162+
token = shared_certs_config.get("token")
163+
client = OpenShiftClient(project_name=project, server_url=server_url, token=token)
164+
try:
165+
iter(client.secrets)
166+
except OpenShiftPythonException:
167+
return {"valid": [], "invalid": []}
168+
169+
valid_certs = []
170+
invalid_certs = []
171+
for secret in client.secrets:
172+
try:
173+
name = secret["metadata"]["name"]
174+
annotations = secret["metadata"]["annotations"]
175+
shared_cert = annotations["shared_cert"]
176+
valid = annotations["valid"]
177+
except KeyError:
178+
continue
179+
if shared_cert != "True":
180+
continue
181+
cert = {
182+
"name": name,
183+
"crt": client.secrets[name]["tls.crt"].decode("utf-8"),
184+
"key": client.secrets[name]["tls.key"].decode("utf-8"),
185+
}
186+
if valid == "True":
187+
valid_certs.append(cert)
188+
if valid == "False":
189+
invalid_certs.append(cert)
190+
return {"valid": valid_certs, "invalid": invalid_certs}
191+
192+
156193
def _threescale_operator_ocp(ocp):
157194
try:
158195
ocp.threescale_operator # pylint: disable=pointless-statement
@@ -257,6 +294,8 @@ def load(obj, env=None, silent=None, key=None):
257294
rhsso_setup = obj.get("rhsso", {})
258295
rhsso_username, rhsso_password = _rhsso_credentials(ocp_tools_setup, rhsso_setup)
259296

297+
shared_certs_setup = obj.get("shared_certs", {})
298+
260299
ocp = OpenShiftClient(
261300
project_name=project, server_url=ocp_setup.get("server_url"), token=ocp_setup.get("token")
262301
)
@@ -346,6 +385,7 @@ def load(obj, env=None, silent=None, key=None):
346385
"apicast": {"openshift": apicast_operator_ocp},
347386
},
348387
"rhsso": {"password": rhsso_password, "username": rhsso_username},
388+
"shared_certs": {"client_certs": _shared_tool_certs(ocp_tools_setup, shared_certs_setup)},
349389
}
350390

351391
# this overwrites what's already in settings to ensure NAMESPACE is propagated

testsuite/rhsso/__init__.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,19 @@ def __getstate__(self):
117117
more info here: https://docs.python.org/3/library/pickle.html#object.__getstate__
118118
"""
119119
return {
120-
"client": self.client.client_id,
121-
"realm": self.realm.name,
120+
"client": {
121+
"client_id": self.client.client_id,
122+
"verify": self.client.verify,
123+
},
124+
"realm": {
125+
"name": self.realm.name,
126+
"verify": self.realm.verify,
127+
},
122128
"rhsso": {
123129
"url": self.rhsso.server_url,
124130
"username": self.rhsso.master.connection.username,
125131
"password": self.rhsso.master.connection.password,
132+
"verify": self.rhsso.verify,
126133
},
127134
"user": self.user,
128135
"username": self.username,
@@ -135,11 +142,14 @@ def __setstate__(self, state):
135142
more info here: https://docs.python.org/3/library/pickle.html#object.__setstate__
136143
"""
137144
self.rhsso = RHSSO(
138-
server_url=state["rhsso"]["url"], username=state["rhsso"]["username"], password=state["rhsso"]["password"]
145+
server_url=state["rhsso"]["url"],
146+
username=state["rhsso"]["username"],
147+
password=state["rhsso"]["password"],
148+
verify=state["rhsso"]["verify"],
139149
)
140-
self.realm = Realm(self.rhsso.master, state["realm"])
150+
self.realm = Realm(self.rhsso.master, state["realm"]["name"], verify=state["realm"]["verify"])
141151
self.user = state["user"]
142-
self.client = Client(self.realm, state["client"])
152+
self.client = Client(self.realm, state["client"]["client_id"], verify=state["client"]["verify"])
143153
self.username = state["username"]
144154
self.password = state["password"]
145155
self._oidc_client = self.client.oidc_client

testsuite/rhsso/objects.py

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,34 @@
55
from keycloak import KeycloakAdmin, KeycloakOpenID, KeycloakPostError
66

77

8+
def _fallback(value, default):
9+
return default if value is None else value
10+
11+
812
class Realm:
913
"""Helper class for RHSSO realm manipulation"""
1014

11-
def __init__(self, master: KeycloakAdmin, name) -> None:
15+
def __init__(self, master: KeycloakAdmin, name, verify=True) -> None:
1216
self.admin = KeycloakAdmin(
1317
server_url=master.connection.server_url,
1418
username=master.connection.username,
1519
password=master.connection.password,
1620
realm_name=name,
1721
user_realm_name="master",
18-
verify=False,
22+
verify=verify,
1923
)
2024
self.name = name
25+
self.verify = verify
2126

2227
def delete(self):
2328
"""Deletes realm"""
2429
self.admin.delete_realm(self.name)
2530

26-
def create_client(self, name, **kwargs):
31+
def create_client(self, name, cert=None, verify=None, **kwargs):
2732
"""Creates new client"""
2833
self.admin.create_client(payload={**kwargs, "clientId": name})
2934
client_id = self.admin.get_client_id(name)
30-
return Client(self, client_id)
35+
return Client(self, client_id, cert, _fallback(verify, self.verify))
3136

3237
def create_user(self, username, password, **kwargs):
3338
"""Creates new user"""
@@ -42,23 +47,27 @@ def create_user(self, username, password, **kwargs):
4247
self.admin.update_user(user_id, {"emailVerified": True})
4348
return user_id
4449

45-
def oidc_client(self, client_id, client_secret) -> KeycloakOpenID:
50+
def oidc_client(self, client_id, client_secret, cert=None, verify=None) -> KeycloakOpenID:
4651
"""Create OIDC client for this realm"""
4752
return KeycloakOpenID(
4853
server_url=self.admin.connection.server_url,
4954
client_id=client_id,
5055
realm_name=self.name,
5156
client_secret_key=client_secret,
57+
cert=cert,
58+
verify=_fallback(verify, self.verify),
5259
)
5360

5461

5562
class Client:
5663
"""Helper class for RHSSO client manipulation"""
5764

58-
def __init__(self, realm: Realm, client_id) -> None:
65+
def __init__(self, realm: Realm, client_id, cert=None, verify=None) -> None:
5966
self.admin = realm.admin
6067
self.realm = realm
6168
self.client_id = client_id
69+
self.cert = cert
70+
self.verify = verify
6271

6372
def assign_role(self, role_name):
6473
"""Assign client role from realm management client"""
@@ -73,23 +82,24 @@ def oidc_client(self) -> KeycloakOpenID:
7382
# Note This is different clientId (clientId) than self.client_id (Id), because RHSSO
7483
client_id = self.admin.get_client(self.client_id)["clientId"]
7584
secret = self.admin.get_client_secrets(self.client_id)["value"]
76-
return self.realm.oidc_client(client_id, secret)
85+
return self.realm.oidc_client(client_id, secret, self.cert, verify=self.verify)
7786

7887

7988
# pylint: disable=too-few-public-methods
8089
class RHSSO:
8190
"""Helper class for RHSSO server"""
8291

83-
def __init__(self, server_url, username, password) -> None:
92+
def __init__(self, server_url, username, password, verify=True) -> None:
8493
# python-keycloak API requires url to be pointed at auth/ endpoint
8594
# pylint: disable=protected-access
95+
self.verify = verify
8696
try:
8797
self.master = KeycloakAdmin(
8898
server_url=server_url,
8999
username=username,
90100
password=password,
91101
realm_name="master",
92-
verify=False,
102+
verify=verify,
93103
)
94104
self.master.get_clients() # test whether the server url is valid
95105
self.server_url = server_url
@@ -100,14 +110,14 @@ def __init__(self, server_url, username, password) -> None:
100110
username=username,
101111
password=password,
102112
realm_name="master",
103-
verify=False,
113+
verify=verify,
104114
)
105115
self.master.get_clients() # test whether the server url is valid
106116

107-
def create_realm(self, name: str, **kwargs) -> Realm:
117+
def create_realm(self, name: str, verify=None, **kwargs) -> Realm:
108118
"""Creates new realm"""
109119
self.master.create_realm(payload={"realm": name, "enabled": True, "sslRequired": "None", **kwargs})
110-
return Realm(self.master, name)
120+
return Realm(self.master, name, verify=_fallback(verify, self.verify))
111121

112122

113123
# pylint: disable=too-few-public-methods

0 commit comments

Comments
 (0)