pyegeria 0.2.3__py3-none-any.whl → 0.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyegeria/__init__.py +13 -8
- pyegeria/_client.py +164 -105
- pyegeria/_exceptions.py +2 -1
- pyegeria/_validators.py +2 -2
- pyegeria/automated_curation_omvs.py +2188 -0
- pyegeria/core_omag_server_config.py +38 -7
- pyegeria/full_omag_server_config.py +99 -10
- pyegeria/glossary_omvs.py +204 -66
- pyegeria/gov_engine.py +92 -201
- pyegeria/governance_author.py +184 -0
- pyegeria/my_profile_omvs.py +976 -0
- pyegeria/platform_services.py +67 -35
- pyegeria/server_operations.py +92 -25
- pyegeria/utils.py +5 -17
- {pyegeria-0.2.3.dist-info → pyegeria-0.3.0.dist-info}/METADATA +21 -17
- pyegeria-0.3.0.dist-info/RECORD +21 -0
- {pyegeria-0.2.3.dist-info → pyegeria-0.3.0.dist-info}/WHEEL +2 -1
- pyegeria-0.3.0.dist-info/top_level.txt +1 -0
- pyegeria/_client-orig.py +0 -480
- pyegeria/automated_curation.py +0 -446
- pyegeria/config.toml +0 -11
- pyegeria/curation_omvs.py +0 -458
- pyegeria/exceptions.py +0 -382
- pyegeria-0.2.3.dist-info/RECORD +0 -22
- {pyegeria-0.2.3.dist-info/licenses → pyegeria-0.3.0.dist-info}/LICENSE +0 -0
pyegeria/_client-orig.py
DELETED
@@ -1,480 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
SPDX-License-Identifier: Apache-2.0
|
3
|
-
Copyright Contributors to the ODPi Egeria project.
|
4
|
-
|
5
|
-
This is a simple class to create and manage a connection to an Egeria backend. It is the Superclass for the
|
6
|
-
different client capabilities. It also provides the common methods used to make restful requests to Egeria.
|
7
|
-
|
8
|
-
"""
|
9
|
-
import inspect
|
10
|
-
import json
|
11
|
-
import os
|
12
|
-
|
13
|
-
import requests
|
14
|
-
from requests import Response
|
15
|
-
|
16
|
-
from pyegeria._globals import max_paging_size
|
17
|
-
from pyegeria._validators import (
|
18
|
-
validate_name,
|
19
|
-
validate_server_name,
|
20
|
-
validate_url,
|
21
|
-
validate_user_id,
|
22
|
-
is_json
|
23
|
-
)
|
24
|
-
from pyegeria.exceptions import (
|
25
|
-
OMAGCommonErrorCode,
|
26
|
-
InvalidParameterException,
|
27
|
-
PropertyServerException,
|
28
|
-
UserNotAuthorizedException,
|
29
|
-
)
|
30
|
-
|
31
|
-
# class RequestType(Enum):
|
32
|
-
# """
|
33
|
-
# Enum class for RequestType containing 4 values - GET, POST, PUT, PATCH, DELETE
|
34
|
-
# """
|
35
|
-
#
|
36
|
-
# GET = "GET"
|
37
|
-
# POST = "POST"
|
38
|
-
# PUT = "PUT"
|
39
|
-
# PATCH = "PATCH"
|
40
|
-
# DELETE = "DELETE"
|
41
|
-
|
42
|
-
|
43
|
-
...
|
44
|
-
|
45
|
-
|
46
|
-
class Client:
|
47
|
-
"""
|
48
|
-
An abstract class used to establish connectivity for an Egeria Client
|
49
|
-
for a particular server, platform and user.
|
50
|
-
|
51
|
-
Attributes
|
52
|
-
----------
|
53
|
-
server_name : str (required)
|
54
|
-
Name of the OMAG server to use
|
55
|
-
platform_url : str (required)
|
56
|
-
URL of the server platform to connect to
|
57
|
-
user_id : str
|
58
|
-
The identity of the user calling the method - this sets a default optionally used by the methods
|
59
|
-
when the user doesn't pass the user_id on a method call.
|
60
|
-
user_id : str (required)
|
61
|
-
The identity used to connect to the server
|
62
|
-
user_pwd : str
|
63
|
-
The password used to authenticate the server identity
|
64
|
-
|
65
|
-
Methods
|
66
|
-
-------
|
67
|
-
create_egeria_bearer_token(user_Id: str, password: str = None) -> str
|
68
|
-
Create a bearer token using the simple Egeria token service - store the bearer token in the object instance.
|
69
|
-
|
70
|
-
refresh_egeria_bearer_token()-> None
|
71
|
-
Refresh the bearer token using the attributes of the object instance.
|
72
|
-
|
73
|
-
set_bearer_token(token: str) -> None
|
74
|
-
Set the bearer token attribute in the object instance - used when the token is generated
|
75
|
-
by an external service.
|
76
|
-
|
77
|
-
get_token() -> str
|
78
|
-
Retrieve the bearer token.
|
79
|
-
|
80
|
-
make_request(request_type: str, endpoint: str, payload: str | dict = None,
|
81
|
-
time_out: int = 30) -> Response
|
82
|
-
Make an HTTP Restful request and handle potential errors and exceptions.
|
83
|
-
|
84
|
-
"""
|
85
|
-
|
86
|
-
json_header = {"Content-Type": "application/json"}
|
87
|
-
|
88
|
-
def __init__(
|
89
|
-
self,
|
90
|
-
server_name: str,
|
91
|
-
platform_url: str,
|
92
|
-
user_id: str = None,
|
93
|
-
user_pwd: str = None,
|
94
|
-
verify_flag: bool = False,
|
95
|
-
api_key: str = None,
|
96
|
-
page_size: int = max_paging_size,
|
97
|
-
token: str = None,
|
98
|
-
token_src: str = None,
|
99
|
-
):
|
100
|
-
self.server_name = None
|
101
|
-
self.platform_url = None
|
102
|
-
self.user_id = user_id
|
103
|
-
self.user_pwd = user_pwd
|
104
|
-
self.ssl_verify = verify_flag
|
105
|
-
self.page_size = page_size
|
106
|
-
self.token_src = token_src
|
107
|
-
self.token = token
|
108
|
-
|
109
|
-
#
|
110
|
-
# I'm commenting this out since you should only have to use tokens if you want - just have to
|
111
|
-
# create or set the token with the appropriate methods as desired.
|
112
|
-
# if token is None:
|
113
|
-
# token = os.environ.get("Egeria_Bearer_Token", None)
|
114
|
-
# if token is None: # No token found - so make one
|
115
|
-
# self.create_egeria_bearer_token(self.user_id, self.user_pwd)
|
116
|
-
# else:
|
117
|
-
# self.token = token
|
118
|
-
|
119
|
-
if api_key is None:
|
120
|
-
api_key = os.environ.get("API_KEY",None)
|
121
|
-
self.api_key = api_key
|
122
|
-
|
123
|
-
self.headers = {
|
124
|
-
"Content-Type": "application/json",
|
125
|
-
"x-api-key": api_key,
|
126
|
-
}
|
127
|
-
self.text_headers = {
|
128
|
-
"Content-Type": "text/plain",
|
129
|
-
"x-api-key": api_key,
|
130
|
-
}
|
131
|
-
# if no token is set yet, allow it to be set by a subsequent method
|
132
|
-
if token is None:
|
133
|
-
# validate_user_id(user_id)
|
134
|
-
pass
|
135
|
-
else:
|
136
|
-
self.headers["Authorization"] = f"Bearer {token}"
|
137
|
-
self.text_headers["Authorization"] = f"Bearer {token}"
|
138
|
-
|
139
|
-
calling_frame = inspect.currentframe().f_back
|
140
|
-
caller_method = inspect.getframeinfo(calling_frame).function
|
141
|
-
|
142
|
-
v_url = validate_url(platform_url)
|
143
|
-
|
144
|
-
if v_url:
|
145
|
-
self.platform_url = platform_url
|
146
|
-
if validate_server_name(server_name):
|
147
|
-
self.server_name = server_name
|
148
|
-
self.session = requests.Session()
|
149
|
-
|
150
|
-
def create_egeria_bearer_token(self, user_Id: str, password: str = None) -> str:
|
151
|
-
""" Create and set an Egeria Bearer Token for the user
|
152
|
-
Parameters
|
153
|
-
----------
|
154
|
-
user_Id : str
|
155
|
-
The user id to authenticate with.
|
156
|
-
password : str
|
157
|
-
The password for the user.
|
158
|
-
|
159
|
-
Returns
|
160
|
-
-------
|
161
|
-
token
|
162
|
-
The bearer token for the specified user.
|
163
|
-
|
164
|
-
Raises
|
165
|
-
------
|
166
|
-
InvalidParameterException
|
167
|
-
If the client passes incorrect parameters on the request - such as bad URLs or invalid values
|
168
|
-
PropertyServerException
|
169
|
-
Raised by the server when an issue arises in processing a valid request
|
170
|
-
NotAuthorizedException
|
171
|
-
The principle specified by the user_id does not have authorization for the requested action
|
172
|
-
Notes
|
173
|
-
-----
|
174
|
-
This routine creates a new bearer token for the user and updates the object with it.
|
175
|
-
It uses Egeria's mechanisms to create a token. This is useful if an Egeria token expires.
|
176
|
-
A bearer token from another source can be set with the set_bearer_token() method.
|
177
|
-
|
178
|
-
"""
|
179
|
-
validate_name(user_Id)
|
180
|
-
validate_name(password)
|
181
|
-
|
182
|
-
url = f"{self.platform_url}/api/token"
|
183
|
-
data = {
|
184
|
-
"userId": user_Id,
|
185
|
-
"password": password
|
186
|
-
}
|
187
|
-
response = self.session.post(url, json=data, headers=self.headers, verify=self.ssl_verify, timeout=30)
|
188
|
-
# response = self.make_request("POST", url, data)
|
189
|
-
token = response.text
|
190
|
-
if token:
|
191
|
-
self.token_src = 'Egeria'
|
192
|
-
self.headers["Authorization"] = f"Bearer {token}"
|
193
|
-
self.text_headers["Authorization"] = f"Bearer {token}"
|
194
|
-
return token
|
195
|
-
else:
|
196
|
-
raise InvalidParameterException("No token returned - request issue")
|
197
|
-
|
198
|
-
def refresh_egeria_bearer_token(self)-> None:
|
199
|
-
if (self.token_src == 'Egeria') and validate_user_id(self.user_id) and validate_name(self.user_pwd):
|
200
|
-
self.create_egeria_bearer_token(self.user_id, self.user_pwd)
|
201
|
-
else:
|
202
|
-
raise InvalidParameterException("Invalid token source")
|
203
|
-
# todo - should I turn the above into a regular exception?
|
204
|
-
|
205
|
-
def set_bearer_token(self, token: str) -> None:
|
206
|
-
""" Retrieve and set a Bearer Token
|
207
|
-
Parameters
|
208
|
-
----------
|
209
|
-
token: str
|
210
|
-
A bearer token supplied to the method.
|
211
|
-
|
212
|
-
Returns
|
213
|
-
-------
|
214
|
-
None
|
215
|
-
This method does not return anything.
|
216
|
-
|
217
|
-
Raises
|
218
|
-
------
|
219
|
-
InvalidParameterException
|
220
|
-
If the client passes incorrect parameters on the request - such as bad URLs or invalid values
|
221
|
-
PropertyServerException
|
222
|
-
Raised by the server when an issue arises in processing a valid request
|
223
|
-
NotAuthorizedException
|
224
|
-
The principle specified by the user_id does not have authorization for the requested action
|
225
|
-
Notes
|
226
|
-
-----
|
227
|
-
This routine sets the bearer token for the current object. The user is responsible for providing the token.
|
228
|
-
|
229
|
-
"""
|
230
|
-
validate_name(token)
|
231
|
-
self.headers["Authorization"] = f"Bearer {token}"
|
232
|
-
self.text_headers["Authorization"] = f"Bearer {token}"
|
233
|
-
|
234
|
-
|
235
|
-
def get_token(self) -> str:
|
236
|
-
return self.text_headers["Authorization"]
|
237
|
-
|
238
|
-
def make_request(
|
239
|
-
self, request_type: str, endpoint: str, payload: str | dict = None, time_out: int = 30) -> Response:
|
240
|
-
"""
|
241
|
-
Function to make an API call via the Requests Library. Raise an exception if the HTTP response code
|
242
|
-
is not 200/201. IF there is a REST communication exception, raise InvalidParameterException.
|
243
|
-
|
244
|
-
:param request_type: Type of Request.
|
245
|
-
Supported Values - GET, POST, (not PUT, PATCH, DELETE).
|
246
|
-
Type - String
|
247
|
-
:param endpoint: API Endpoint. Type - String
|
248
|
-
:param payload: API Request Parameters or Query String.
|
249
|
-
Type - String or Dict
|
250
|
-
:return: Response. Type - JSON Formatted String
|
251
|
-
|
252
|
-
"""
|
253
|
-
class_name = __class__.__name__
|
254
|
-
calling_frame = inspect.currentframe().f_back
|
255
|
-
caller_method = inspect.getframeinfo(calling_frame).function
|
256
|
-
|
257
|
-
|
258
|
-
try:
|
259
|
-
response = ""
|
260
|
-
if request_type == "GET":
|
261
|
-
response = requests.get(
|
262
|
-
endpoint, params=payload, verify=self.ssl_verify, headers=self.headers
|
263
|
-
)
|
264
|
-
elif request_type == "POST":
|
265
|
-
if type(payload) is str:
|
266
|
-
response = requests.post(
|
267
|
-
endpoint,
|
268
|
-
headers=self.text_headers,
|
269
|
-
timeout=time_out,
|
270
|
-
data=payload,
|
271
|
-
verify=self.ssl_verify,
|
272
|
-
)
|
273
|
-
else:
|
274
|
-
response = requests.post(
|
275
|
-
endpoint,
|
276
|
-
headers=self.headers,
|
277
|
-
timeout=time_out,
|
278
|
-
json=payload,
|
279
|
-
verify=self.ssl_verify,
|
280
|
-
)
|
281
|
-
elif request_type == "POST-DATA":
|
282
|
-
response = requests.post(
|
283
|
-
endpoint,
|
284
|
-
headers=self.headers,
|
285
|
-
timeout=time_out,
|
286
|
-
data=payload,
|
287
|
-
verify=self.ssl_verify,
|
288
|
-
)
|
289
|
-
elif request_type == "DELETE":
|
290
|
-
response = requests.delete(endpoint, timeout=30, verify=self.ssl_verify, headers=self.headers)
|
291
|
-
status_code = response.status_code
|
292
|
-
|
293
|
-
if status_code in (200, 201):
|
294
|
-
# Success
|
295
|
-
if is_json(response.text):
|
296
|
-
# now look at the response itself and throw an exception if an issue
|
297
|
-
related_code = response.json().get("relatedHTTPCode")
|
298
|
-
if related_code == 200:
|
299
|
-
return response
|
300
|
-
else:
|
301
|
-
exc_message = response.text
|
302
|
-
raise InvalidParameterException(exc_message)
|
303
|
-
else:
|
304
|
-
msg = OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
305
|
-
"message_template"
|
306
|
-
].format(
|
307
|
-
"**invalid JSON response - check parameters**",
|
308
|
-
caller_method,
|
309
|
-
class_name,
|
310
|
-
endpoint,
|
311
|
-
OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
312
|
-
"message_id"
|
313
|
-
],
|
314
|
-
)
|
315
|
-
exc_msg = json.dumps(
|
316
|
-
{
|
317
|
-
"class": "VoidResponse",
|
318
|
-
"relatedHTTPCode": response.status_code,
|
319
|
-
"exceptionClassName": "InvalidParameterException",
|
320
|
-
"actionDescription": caller_method,
|
321
|
-
"exceptionErrorMessage": msg,
|
322
|
-
"exceptionErrorMessageId": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
323
|
-
"message_id"
|
324
|
-
],
|
325
|
-
"exceptionErrorMessageParameters": [
|
326
|
-
endpoint,
|
327
|
-
self.server_name,
|
328
|
-
self.user_id,
|
329
|
-
],
|
330
|
-
"exceptionSystemAction": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
331
|
-
"system_action"
|
332
|
-
],
|
333
|
-
"exceptionUserAction": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
334
|
-
"user_action"
|
335
|
-
],
|
336
|
-
"exceptionProperties": {
|
337
|
-
"endpoint": endpoint,
|
338
|
-
"server": self.server_name,
|
339
|
-
"user_id": self.user_id,
|
340
|
-
},
|
341
|
-
}
|
342
|
-
)
|
343
|
-
raise InvalidParameterException(exc_msg)
|
344
|
-
|
345
|
-
if response.status_code in (400, 401, 403, 404, 405):
|
346
|
-
# 4xx are client side errors - 400 bad request, 401 unauthorized
|
347
|
-
msg = OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
348
|
-
"message_template"
|
349
|
-
].format(
|
350
|
-
str(response.status_code),
|
351
|
-
caller_method,
|
352
|
-
class_name,
|
353
|
-
endpoint,
|
354
|
-
OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value["message_id"],
|
355
|
-
)
|
356
|
-
exc_msg = json.dumps(
|
357
|
-
{
|
358
|
-
"class": "VoidResponse",
|
359
|
-
"relatedHTTPCode": response.status_code,
|
360
|
-
"exceptionClassName": "InvalidParameterException",
|
361
|
-
"actionDescription": caller_method,
|
362
|
-
"exceptionErrorMessage": msg,
|
363
|
-
"exceptionErrorMessageId": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
364
|
-
"message_id"
|
365
|
-
],
|
366
|
-
"exceptionErrorMessageParameters": [
|
367
|
-
endpoint,
|
368
|
-
self.server_name,
|
369
|
-
self.user_id,
|
370
|
-
],
|
371
|
-
"exceptionSystemAction": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
372
|
-
"system_action"
|
373
|
-
],
|
374
|
-
"exceptionUserAction": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
375
|
-
"user_action"
|
376
|
-
],
|
377
|
-
"exceptionProperties": {
|
378
|
-
"endpoint": endpoint,
|
379
|
-
"server": self.server_name,
|
380
|
-
"user_id": self.user_id,
|
381
|
-
},
|
382
|
-
}
|
383
|
-
)
|
384
|
-
if response.status_code in (401,403,405):
|
385
|
-
raise UserNotAuthorizedException(exc_msg)
|
386
|
-
else:
|
387
|
-
raise InvalidParameterException(exc_msg)
|
388
|
-
|
389
|
-
elif response.status_code in (500, 501, 502, 503, 504):
|
390
|
-
# server errors
|
391
|
-
msg = OMAGCommonErrorCode.EXCEPTION_RESPONSE_FROM_API.value[
|
392
|
-
"message_template"
|
393
|
-
].format(
|
394
|
-
str(response.status_code),
|
395
|
-
caller_method,
|
396
|
-
endpoint,
|
397
|
-
OMAGCommonErrorCode.EXCEPTION_RESPONSE_FROM_API.value["message_id"],
|
398
|
-
)
|
399
|
-
exc_msg = json.dumps(
|
400
|
-
{
|
401
|
-
"class": "VoidResponse",
|
402
|
-
"relatedHTTPCode": response.status_code,
|
403
|
-
"exceptionClassName": "PropertyServerException",
|
404
|
-
"actionDescription": caller_method,
|
405
|
-
"exceptionErrorMessage": msg,
|
406
|
-
"exceptionErrorMessageId": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
407
|
-
"message_id"
|
408
|
-
],
|
409
|
-
"exceptionErrorMessageParameters": [
|
410
|
-
endpoint,
|
411
|
-
self.server_name,
|
412
|
-
self.user_id,
|
413
|
-
],
|
414
|
-
"exceptionSystemAction": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
415
|
-
"system_action"
|
416
|
-
],
|
417
|
-
"exceptionUserAction": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
418
|
-
"user_action"
|
419
|
-
],
|
420
|
-
"exceptionProperties": {
|
421
|
-
"endpoint": endpoint,
|
422
|
-
"server": self.server_name,
|
423
|
-
"user_id": self.user_id,
|
424
|
-
},
|
425
|
-
}
|
426
|
-
)
|
427
|
-
raise PropertyServerException(exc_msg)
|
428
|
-
|
429
|
-
except InvalidParameterException:
|
430
|
-
raise
|
431
|
-
except UserNotAuthorizedException:
|
432
|
-
raise
|
433
|
-
except (
|
434
|
-
requests.ConnectionError,
|
435
|
-
requests.ConnectTimeout,
|
436
|
-
requests.HTTPError,
|
437
|
-
requests.RequestException,
|
438
|
-
requests.Timeout,
|
439
|
-
# InvalidParameterException
|
440
|
-
# HTTPSConnectionPool,
|
441
|
-
) as e:
|
442
|
-
msg = OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
443
|
-
"message_template"
|
444
|
-
].format(
|
445
|
-
e.args[0],
|
446
|
-
caller_method,
|
447
|
-
class_name,
|
448
|
-
endpoint,
|
449
|
-
OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value["message_id"],
|
450
|
-
)
|
451
|
-
exc_msg = json.dumps(
|
452
|
-
{
|
453
|
-
"class": "VoidResponse",
|
454
|
-
"relatedHTTPCode": 400,
|
455
|
-
"exceptionClassName": "InvalidParameterException",
|
456
|
-
"actionDescription": caller_method,
|
457
|
-
"exceptionErrorMessage": msg,
|
458
|
-
"exceptionErrorMessageId": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
459
|
-
"message_id"
|
460
|
-
],
|
461
|
-
"exceptionErrorMessageParameters": endpoint,
|
462
|
-
"exceptionSystemAction": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
463
|
-
"system_action"
|
464
|
-
],
|
465
|
-
"exceptionUserAction": OMAGCommonErrorCode.CLIENT_SIDE_REST_API_ERROR.value[
|
466
|
-
"user_action"
|
467
|
-
],
|
468
|
-
"exceptionProperties": {"endpoint": endpoint},
|
469
|
-
}
|
470
|
-
)
|
471
|
-
raise InvalidParameterException(exc_msg)
|
472
|
-
|
473
|
-
|
474
|
-
if __name__ == "__main__":
|
475
|
-
try:
|
476
|
-
connection = Client(
|
477
|
-
"active-metadata-store", "https://127.0.0.1:9443", "garygeeke", "foo"
|
478
|
-
)
|
479
|
-
except Exception as e:
|
480
|
-
print(e)
|