mirror of
https://git.collinwebdesigns.de/oscar.krause/fastapi-dls.git
synced 2025-08-26 22:47:00 +08:00
Compare commits
11 Commits
7c6aea5da7
...
f20232d425
Author | SHA1 | Date | |
---|---|---|---|
|
f20232d425 | ||
|
b6639f9bfb | ||
|
bd02e3d4b8 | ||
|
39bf74fba9 | ||
|
d46690fd0e | ||
|
7a3c8e2051 | ||
|
3ed7ae8fdb | ||
|
3dcfa66d15 | ||
|
6a50bdfb89 | ||
|
d0e64c3e94 | ||
|
ff4748fef9 |
61
app/main.py
61
app/main.py
@ -18,8 +18,7 @@ from jose.constants import ALGORITHMS
|
|||||||
from sqlalchemy import create_engine
|
from sqlalchemy import create_engine
|
||||||
from sqlalchemy.orm import sessionmaker
|
from sqlalchemy.orm import sessionmaker
|
||||||
from starlette.middleware.cors import CORSMiddleware
|
from starlette.middleware.cors import CORSMiddleware
|
||||||
from starlette.responses import StreamingResponse, JSONResponse as JSONr, HTMLResponse as HTMLr, Response, \
|
from starlette.responses import StreamingResponse, JSONResponse as JSONr, HTMLResponse as HTMLr, Response, RedirectResponse
|
||||||
RedirectResponse
|
|
||||||
|
|
||||||
from orm import Origin, Lease, init as db_init, migrate
|
from orm import Origin, Lease, init as db_init, migrate
|
||||||
from util import PrivateKey, PublicKey, load_file, Cert
|
from util import PrivateKey, PublicKey, load_file, Cert
|
||||||
@ -51,6 +50,7 @@ LEASE_RENEWAL_PERIOD = float(env('LEASE_RENEWAL_PERIOD', 0.15))
|
|||||||
LEASE_RENEWAL_DELTA = timedelta(days=int(env('LEASE_EXPIRE_DAYS', 90)), hours=int(env('LEASE_EXPIRE_HOURS', 0)))
|
LEASE_RENEWAL_DELTA = timedelta(days=int(env('LEASE_EXPIRE_DAYS', 90)), hours=int(env('LEASE_EXPIRE_HOURS', 0)))
|
||||||
CLIENT_TOKEN_EXPIRE_DELTA = relativedelta(years=12)
|
CLIENT_TOKEN_EXPIRE_DELTA = relativedelta(years=12)
|
||||||
CORS_ORIGINS = str(env('CORS_ORIGINS', '')).split(',') if (env('CORS_ORIGINS')) else [f'https://{DLS_URL}']
|
CORS_ORIGINS = str(env('CORS_ORIGINS', '')).split(',') if (env('CORS_ORIGINS')) else [f'https://{DLS_URL}']
|
||||||
|
DT_FORMAT = '%Y-%m-%dT%H:%M:%S.%fZ'
|
||||||
|
|
||||||
jwt_encode_key = jwk.construct(INSTANCE_KEY_RSA.pem(), algorithm=ALGORITHMS.RS256)
|
jwt_encode_key = jwk.construct(INSTANCE_KEY_RSA.pem(), algorithm=ALGORITHMS.RS256)
|
||||||
jwt_decode_key = jwk.construct(INSTANCE_KEY_PUB.pem(), algorithm=ALGORITHMS.RS256)
|
jwt_decode_key = jwk.construct(INSTANCE_KEY_PUB.pem(), algorithm=ALGORITHMS.RS256)
|
||||||
@ -249,6 +249,7 @@ async def _client_token():
|
|||||||
"iat": timegm(cur_time.timetuple()),
|
"iat": timegm(cur_time.timetuple()),
|
||||||
"nbf": timegm(cur_time.timetuple()),
|
"nbf": timegm(cur_time.timetuple()),
|
||||||
"exp": timegm(exp_time.timetuple()),
|
"exp": timegm(exp_time.timetuple()),
|
||||||
|
"protocol_version": "2.0",
|
||||||
"update_mode": "ABSOLUTE",
|
"update_mode": "ABSOLUTE",
|
||||||
"scope_ref_list": [ALLOTMENT_REF],
|
"scope_ref_list": [ALLOTMENT_REF],
|
||||||
"fulfillment_class_ref_list": [],
|
"fulfillment_class_ref_list": [],
|
||||||
@ -299,14 +300,19 @@ async def auth_v1_origin(request: Request):
|
|||||||
|
|
||||||
Origin.create_or_update(db, data)
|
Origin.create_or_update(db, data)
|
||||||
|
|
||||||
|
environment = {
|
||||||
|
'raw_env': j.get('environment')
|
||||||
|
}
|
||||||
|
environment.update(j.get('environment'))
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
"origin_ref": origin_ref,
|
"origin_ref": origin_ref,
|
||||||
"environment": j.get('environment'),
|
"environment": environment,
|
||||||
"svc_port_set_list": None,
|
"svc_port_set_list": None,
|
||||||
"node_url_list": None,
|
"node_url_list": None,
|
||||||
"node_query_order": None,
|
"node_query_order": None,
|
||||||
"prompts": None,
|
"prompts": None,
|
||||||
"sync_timestamp": cur_time.isoformat()
|
"sync_timestamp": cur_time.strftime(DT_FORMAT)
|
||||||
}
|
}
|
||||||
|
|
||||||
return JSONr(response)
|
return JSONr(response)
|
||||||
@ -332,7 +338,7 @@ async def auth_v1_origin_update(request: Request):
|
|||||||
response = {
|
response = {
|
||||||
"environment": j.get('environment'),
|
"environment": j.get('environment'),
|
||||||
"prompts": None,
|
"prompts": None,
|
||||||
"sync_timestamp": cur_time.isoformat()
|
"sync_timestamp": cur_time.strftime(DT_FORMAT)
|
||||||
}
|
}
|
||||||
|
|
||||||
return JSONr(response)
|
return JSONr(response)
|
||||||
@ -363,7 +369,7 @@ async def auth_v1_code(request: Request):
|
|||||||
|
|
||||||
response = {
|
response = {
|
||||||
"auth_code": auth_code,
|
"auth_code": auth_code,
|
||||||
"sync_timestamp": cur_time.isoformat(),
|
"sync_timestamp": cur_time.strftime(DT_FORMAT),
|
||||||
"prompts": None
|
"prompts": None
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -405,9 +411,10 @@ async def auth_v1_token(request: Request):
|
|||||||
auth_token = jwt.encode(new_payload, key=jwt_encode_key, headers={'kid': payload.get('kid')}, algorithm=ALGORITHMS.RS256)
|
auth_token = jwt.encode(new_payload, key=jwt_encode_key, headers={'kid': payload.get('kid')}, algorithm=ALGORITHMS.RS256)
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
"expires": access_expires_on.isoformat(),
|
"expires": access_expires_on.strftime(DT_FORMAT),
|
||||||
"auth_token": auth_token,
|
"auth_token": auth_token,
|
||||||
"sync_timestamp": cur_time.isoformat(),
|
"sync_timestamp": cur_time.strftime(DT_FORMAT),
|
||||||
|
"prompts": None
|
||||||
}
|
}
|
||||||
|
|
||||||
return JSONr(response)
|
return JSONr(response)
|
||||||
@ -661,6 +668,9 @@ async def leasing_v1_config_token(request: Request):
|
|||||||
async def leasing_v1_lessor(request: Request):
|
async def leasing_v1_lessor(request: Request):
|
||||||
j, token, cur_time = json_loads((await request.body()).decode('utf-8')), __get_token(request), datetime.now(UTC)
|
j, token, cur_time = json_loads((await request.body()).decode('utf-8')), __get_token(request), datetime.now(UTC)
|
||||||
|
|
||||||
|
logger.debug(j)
|
||||||
|
logger.debug(request.headers)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
token = __get_token(request)
|
token = __get_token(request)
|
||||||
except JWTError:
|
except JWTError:
|
||||||
@ -671,6 +681,7 @@ async def leasing_v1_lessor(request: Request):
|
|||||||
logger.info(f'> [ create ]: {origin_ref}: create leases for scope_ref_list {scope_ref_list}')
|
logger.info(f'> [ create ]: {origin_ref}: create leases for scope_ref_list {scope_ref_list}')
|
||||||
|
|
||||||
lease_result_list = []
|
lease_result_list = []
|
||||||
|
# todo: for lease_proposal in lease_proposal_list
|
||||||
for scope_ref in scope_ref_list:
|
for scope_ref in scope_ref_list:
|
||||||
# if scope_ref not in [ALLOTMENT_REF]:
|
# if scope_ref not in [ALLOTMENT_REF]:
|
||||||
# return JSONr(status_code=500, detail=f'no service instances found for scopes: ["{scope_ref}"]')
|
# return JSONr(status_code=500, detail=f'no service instances found for scopes: ["{scope_ref}"]')
|
||||||
@ -678,15 +689,20 @@ async def leasing_v1_lessor(request: Request):
|
|||||||
lease_ref = str(uuid4())
|
lease_ref = str(uuid4())
|
||||||
expires = cur_time + LEASE_EXPIRE_DELTA
|
expires = cur_time + LEASE_EXPIRE_DELTA
|
||||||
lease_result_list.append({
|
lease_result_list.append({
|
||||||
"ordinal": 0,
|
"ordinal": None,
|
||||||
|
"error": None,
|
||||||
# https://docs.nvidia.com/license-system/latest/nvidia-license-system-user-guide/index.html
|
# https://docs.nvidia.com/license-system/latest/nvidia-license-system-user-guide/index.html
|
||||||
"lease": {
|
"lease": {
|
||||||
"ref": lease_ref,
|
"ref": lease_ref,
|
||||||
"created": cur_time.isoformat(),
|
"created": cur_time.strftime(DT_FORMAT),
|
||||||
"expires": expires.isoformat(),
|
"expires": expires.strftime(DT_FORMAT),
|
||||||
"recommended_lease_renewal": LEASE_RENEWAL_PERIOD,
|
"recommended_lease_renewal": LEASE_RENEWAL_PERIOD,
|
||||||
"offline_lease": "true",
|
"offline_lease": "true",
|
||||||
"license_type": "CONCURRENT_COUNTED_SINGLE"
|
"license_type": "CONCURRENT_COUNTED_SINGLE",
|
||||||
|
"lease_intent_id": None,
|
||||||
|
"metadata": None,
|
||||||
|
"feature_name": "GRID-Virtual-WS", # todo
|
||||||
|
"product_name": "NVIDIA RTX Virtual Workstation", # todo
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -694,13 +710,16 @@ async def leasing_v1_lessor(request: Request):
|
|||||||
Lease.create_or_update(db, data)
|
Lease.create_or_update(db, data)
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
|
"client_challenge": None,
|
||||||
"lease_result_list": lease_result_list,
|
"lease_result_list": lease_result_list,
|
||||||
"result_code": "SUCCESS",
|
"result_code": None,
|
||||||
"sync_timestamp": cur_time.isoformat(),
|
"sync_timestamp": cur_time.strftime(DT_FORMAT),
|
||||||
"prompts": None
|
"prompts": None
|
||||||
}
|
}
|
||||||
|
|
||||||
return JSONr(response)
|
logger.debug(response)
|
||||||
|
|
||||||
|
return JSONr(response, headers={'X-NLS-Signature': '?'})
|
||||||
|
|
||||||
|
|
||||||
# venv/lib/python3.9/site-packages/nls_services_lease/test/test_lease_multi_controller.py
|
# venv/lib/python3.9/site-packages/nls_services_lease/test/test_lease_multi_controller.py
|
||||||
@ -716,7 +735,7 @@ async def leasing_v1_lessor_lease(request: Request):
|
|||||||
|
|
||||||
response = {
|
response = {
|
||||||
"active_lease_list": active_lease_list,
|
"active_lease_list": active_lease_list,
|
||||||
"sync_timestamp": cur_time.isoformat(),
|
"sync_timestamp": cur_time.strftime(DT_FORMAT),
|
||||||
"prompts": None
|
"prompts": None
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -739,11 +758,11 @@ async def leasing_v1_lease_renew(request: Request, lease_ref: str):
|
|||||||
expires = cur_time + LEASE_EXPIRE_DELTA
|
expires = cur_time + LEASE_EXPIRE_DELTA
|
||||||
response = {
|
response = {
|
||||||
"lease_ref": lease_ref,
|
"lease_ref": lease_ref,
|
||||||
"expires": expires.isoformat(),
|
"expires": expires.strftime(DT_FORMAT),
|
||||||
"recommended_lease_renewal": LEASE_RENEWAL_PERIOD,
|
"recommended_lease_renewal": LEASE_RENEWAL_PERIOD,
|
||||||
"offline_lease": True,
|
"offline_lease": True,
|
||||||
"prompts": None,
|
"prompts": None,
|
||||||
"sync_timestamp": cur_time.isoformat(),
|
"sync_timestamp": cur_time.strftime(DT_FORMAT),
|
||||||
}
|
}
|
||||||
|
|
||||||
Lease.renew(db, entity, expires, cur_time)
|
Lease.renew(db, entity, expires, cur_time)
|
||||||
@ -771,7 +790,7 @@ async def leasing_v1_lease_delete(request: Request, lease_ref: str):
|
|||||||
response = {
|
response = {
|
||||||
"lease_ref": lease_ref,
|
"lease_ref": lease_ref,
|
||||||
"prompts": None,
|
"prompts": None,
|
||||||
"sync_timestamp": cur_time.isoformat(),
|
"sync_timestamp": cur_time.strftime(DT_FORMAT),
|
||||||
}
|
}
|
||||||
|
|
||||||
return JSONr(response)
|
return JSONr(response)
|
||||||
@ -791,7 +810,7 @@ async def leasing_v1_lessor_lease_remove(request: Request):
|
|||||||
response = {
|
response = {
|
||||||
"released_lease_list": released_lease_list,
|
"released_lease_list": released_lease_list,
|
||||||
"release_failure_list": None,
|
"release_failure_list": None,
|
||||||
"sync_timestamp": cur_time.isoformat(),
|
"sync_timestamp": cur_time.strftime(DT_FORMAT),
|
||||||
"prompts": None
|
"prompts": None
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -813,7 +832,7 @@ async def leasing_v1_lessor_shutdown(request: Request):
|
|||||||
response = {
|
response = {
|
||||||
"released_lease_list": released_lease_list,
|
"released_lease_list": released_lease_list,
|
||||||
"release_failure_list": None,
|
"release_failure_list": None,
|
||||||
"sync_timestamp": cur_time.isoformat(),
|
"sync_timestamp": cur_time.strftime(DT_FORMAT),
|
||||||
"prompts": None
|
"prompts": None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user