Compare commits

..

23 Commits

Author SHA1 Message Date
Oscar Krause
59beebdeff fixed missing code 2025-04-14 10:20:22 +02:00
Oscar Krause
304ce0002c test with "X-NLS-Signature" 2025-04-14 10:09:27 +02:00
Oscar Krause
001d8a0ab1 implemented client_challenge on lease apis 2025-04-14 07:48:18 +02:00
Oscar Krause
a7553716de set "offline_lease" to false 2025-04-11 22:22:22 +02:00
Oscar Krause
f20232d425 added EMPTY (!!!) X-NLS-Signature response header 2025-04-11 21:23:15 +02:00
Oscar Krause
b6639f9bfb added debug headers 2025-04-11 21:22:56 +02:00
Oscar Krause
bd02e3d4b8 code styling 2025-04-11 21:22:44 +02:00
Oscar Krause
39bf74fba9 added new "protocol_version" to client-token 2025-04-11 21:01:36 +02:00
Oscar Krause
d46690fd0e fixes 2025-04-11 20:38:58 +02:00
Oscar Krause
7a3c8e2051 also debug response 2025-04-11 20:35:10 +02:00
Oscar Krause
3ed7ae8fdb fixed datetime format 2025-04-11 20:14:17 +02:00
Oscar Krause
3dcfa66d15 added missing lessor attributes 2025-04-11 19:36:25 +02:00
Oscar Krause
6a50bdfb89 fixes 2025-04-11 19:08:41 +02:00
Oscar Krause
d0e64c3e94 added debugging 2025-04-11 18:51:33 +02:00
Oscar Krause
ff4748fef9 updated new responses for 18.x drivers 2025-04-11 18:51:17 +02:00
Oscar Krause
7c6aea5da7 created "init_config_token_demo" 2025-04-10 21:38:25 +02:00
Oscar Krause
0c06397ad6 typos 2025-04-10 09:02:00 +02:00
Oscar Krause
603ef5135c added test and code for /leasing/v1/config-token
ref. https://git.collinwebdesigns.de/nvidia/nls/-/blob/main/src/test/test_config_token.py
2025-04-10 08:48:45 +02:00
Oscar Krause
f6c618a7ef added NixOS Pull-Request note 2025-04-10 07:54:39 +02:00
Oscar Krause
35df4e4d84 implemented initial endpoint for /leasing/v1/config-token 2025-04-08 10:13:14 +02:00
Oscar Krause
e927421fa6 added logging 2025-04-08 10:13:14 +02:00
Oscar Krause
025b718b72 added debugging 2025-04-08 10:13:14 +02:00
Oscar Krause
470084fe08 added endpoint '/leasing/v1/config-token' 2025-04-08 10:13:14 +02:00
3 changed files with 40 additions and 41 deletions

View File

@ -16,12 +16,12 @@ build:docker:
interruptible: true interruptible: true
stage: build stage: build
rules: rules:
# deployment is in "deploy:docker:" - if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
changes: changes:
- app/**/* - app/**/*
- Dockerfile - Dockerfile
- requirements.txt - requirements.txt
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
tags: [ docker ] tags: [ docker ]
before_script: before_script:
- docker buildx inspect - docker buildx inspect
@ -41,17 +41,19 @@ build:apt:
interruptible: true interruptible: true
stage: build stage: build
rules: rules:
- if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_TAG - if: $CI_COMMIT_TAG
variables: variables:
VERSION: $CI_COMMIT_REF_NAME VERSION: $CI_COMMIT_REF_NAME
- if: $CI_PIPELINE_SOURCE == 'merge_request_event' - if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
changes: changes:
- app/**/* - app/**/*
- .DEBIAN/**/* - .DEBIAN/**/*
- .gitlab-ci.yml - .gitlab-ci.yml
variables: variables:
VERSION: "0.0.1" VERSION: "0.0.1"
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
variables:
VERSION: "0.0.1"
before_script: before_script:
- echo -e "VERSION=$VERSION\nCOMMIT=$CI_COMMIT_SHA" > version.env - echo -e "VERSION=$VERSION\nCOMMIT=$CI_COMMIT_SHA" > version.env
# install build dependencies # install build dependencies
@ -92,13 +94,16 @@ build:pacman:
- if: $CI_COMMIT_TAG - if: $CI_COMMIT_TAG
variables: variables:
VERSION: $CI_COMMIT_REF_NAME VERSION: $CI_COMMIT_REF_NAME
- if: $CI_PIPELINE_SOURCE == 'merge_request_event' - if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
changes: changes:
- app/**/* - app/**/*
- .PKGBUILD/**/* - .PKGBUILD/**/*
- .gitlab-ci.yml - .gitlab-ci.yml
variables: variables:
VERSION: "0.0.1" VERSION: "0.0.1"
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
variables:
VERSION: "0.0.1"
before_script: before_script:
#- echo -e "VERSION=$VERSION\nCOMMIT=$CI_COMMIT_SHA" > version.env #- echo -e "VERSION=$VERSION\nCOMMIT=$CI_COMMIT_SHA" > version.env
# install build dependencies # install build dependencies
@ -163,12 +168,11 @@ test:
.test:apt: .test:apt:
stage: test stage: test
rules: rules:
- if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
changes: changes:
- app/**/* - app/**/*
- .DEBIAN/**/* - .DEBIAN/**/*
- .gitlab-ci.yml - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
needs: needs:
- job: build:apt - job: build:apt
artifacts: true artifacts: true
@ -213,12 +217,11 @@ test:apt:
test:pacman:archlinux: test:pacman:archlinux:
image: archlinux:base image: archlinux:base
rules: rules:
- if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - if: $CI_COMMIT_BRANCH && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
changes: changes:
- app/**/* - app/**/*
- .PKGBUILD/**/* - .PKGBUILD/**/*
- .gitlab-ci.yml - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
needs: needs:
- job: build:pacman - job: build:pacman
artifacts: true artifacts: true

View File

@ -7,7 +7,6 @@ from hashlib import sha256
from json import loads as json_loads from json import loads as json_loads
from os import getenv as env from os import getenv as env
from os.path import join, dirname, isfile from os.path import join, dirname, isfile
from random import randbytes
from uuid import uuid4 from uuid import uuid4
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
@ -370,8 +369,8 @@ async def auth_v1_code(request: Request):
response = { response = {
"auth_code": auth_code, "auth_code": auth_code,
"prompts": None,
"sync_timestamp": cur_time.strftime(DT_FORMAT), "sync_timestamp": cur_time.strftime(DT_FORMAT),
"prompts": None
} }
return JSONr(response) return JSONr(response)
@ -404,18 +403,18 @@ async def auth_v1_token(request: Request):
'iss': 'https://cls.nvidia.org', 'iss': 'https://cls.nvidia.org',
'aud': 'https://cls.nvidia.org', 'aud': 'https://cls.nvidia.org',
'exp': timegm(access_expires_on.timetuple()), 'exp': timegm(access_expires_on.timetuple()),
'origin_ref': origin_ref,
'key_ref': SITE_KEY_XID, 'key_ref': SITE_KEY_XID,
'kid': SITE_KEY_XID, 'kid': SITE_KEY_XID,
'origin_ref': origin_ref,
} }
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 = {
"auth_token": auth_token,
"expires": access_expires_on.strftime(DT_FORMAT), "expires": access_expires_on.strftime(DT_FORMAT),
"prompts": None, "auth_token": auth_token,
"sync_timestamp": cur_time.strftime(DT_FORMAT), "sync_timestamp": cur_time.strftime(DT_FORMAT),
"prompts": None
} }
return JSONr(response) return JSONr(response)
@ -690,21 +689,21 @@ 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": None,
"error": 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,
"created": cur_time.strftime(DT_FORMAT), "created": cur_time.strftime(DT_FORMAT),
"expires": expires.strftime(DT_FORMAT), "expires": expires.strftime(DT_FORMAT),
"feature_name": "GRID-Virtual-WS", # todo
"lease_intent_id": None,
"license_type": "CONCURRENT_COUNTED_SINGLE",
"metadata": None,
"offline_lease": False, # todo
"product_name": "NVIDIA RTX Virtual Workstation", # todo
"recommended_lease_renewal": LEASE_RENEWAL_PERIOD, "recommended_lease_renewal": LEASE_RENEWAL_PERIOD,
"ref": lease_ref, "offline_lease": "false", # todo
}, "license_type": "CONCURRENT_COUNTED_SINGLE",
"ordinal": None, "lease_intent_id": None,
"metadata": None,
"feature_name": "GRID-Virtual-WS", # todo
"product_name": "NVIDIA RTX Virtual Workstation", # todo
}
}) })
data = Lease(origin_ref=origin_ref, lease_ref=lease_ref, lease_created=cur_time, lease_expires=expires) data = Lease(origin_ref=origin_ref, lease_ref=lease_ref, lease_created=cur_time, lease_expires=expires)
@ -713,15 +712,19 @@ async def leasing_v1_lessor(request: Request):
response = { response = {
"client_challenge": j.get('client_challenge'), "client_challenge": j.get('client_challenge'),
"lease_result_list": lease_result_list, "lease_result_list": lease_result_list,
"prompts": None,
"result_code": None, "result_code": None,
"sync_timestamp": cur_time.strftime(DT_FORMAT), "sync_timestamp": cur_time.strftime(DT_FORMAT),
"prompts": None
} }
logger.debug(response) logger.debug(response)
signature = f'b\'{randbytes(256).hex()}\'' si_certificate_filename = join(dirname(__file__), 'cert/my_demo_si_certificate.pem')
return JSONr(response, headers={'access-control-expose-headers': 'X-NLS-Signature', 'X-NLS-Signature': signature}) my_si_certificate = Cert.from_file(si_certificate_filename)
signature = my_si_certificate.signature().hex()
signature = f'b\'{signature}\''
return JSONr(response, headers={'X-NLS-Signature': 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
@ -737,8 +740,8 @@ async def leasing_v1_lessor_lease(request: Request):
response = { response = {
"active_lease_list": active_lease_list, "active_lease_list": active_lease_list,
"prompts": None,
"sync_timestamp": cur_time.strftime(DT_FORMAT), "sync_timestamp": cur_time.strftime(DT_FORMAT),
"prompts": None
} }
return JSONr(response) return JSONr(response)
@ -760,20 +763,17 @@ 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 = {
"client_challenge": j.get('client_challenge'), "client_challenge": j.get('client_challenge'),
"expires": expires.strftime(DT_FORMAT),
"feature_expired": False,
"lease_ref": lease_ref, "lease_ref": lease_ref,
"metadata": None, "expires": expires.strftime(DT_FORMAT),
"recommended_lease_renewal": LEASE_RENEWAL_PERIOD,
"offline_lease": True, "offline_lease": True,
"prompts": None, "prompts": None,
"recommended_lease_renewal": LEASE_RENEWAL_PERIOD,
"sync_timestamp": cur_time.strftime(DT_FORMAT), "sync_timestamp": cur_time.strftime(DT_FORMAT),
} }
Lease.renew(db, entity, expires, cur_time) Lease.renew(db, entity, expires, cur_time)
signature = f'b\'{randbytes(256).hex()}\'' return JSONr(response)
return JSONr(response, headers={'access-control-expose-headers': 'X-NLS-Signature', 'X-NLS-Signature': signature})
# venv/lib/python3.9/site-packages/nls_services_lease/test/test_lease_single_controller.py # venv/lib/python3.9/site-packages/nls_services_lease/test/test_lease_single_controller.py
@ -817,8 +817,8 @@ 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,
"prompts": None,
"sync_timestamp": cur_time.strftime(DT_FORMAT), "sync_timestamp": cur_time.strftime(DT_FORMAT),
"prompts": None
} }
return JSONr(response) return JSONr(response)
@ -839,8 +839,8 @@ 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,
"prompts": None,
"sync_timestamp": cur_time.strftime(DT_FORMAT), "sync_timestamp": cur_time.strftime(DT_FORMAT),
"prompts": None
} }
return JSONr(response) return JSONr(response)

View File

@ -212,8 +212,6 @@ def test_leasing_v1_lessor():
client_challenge = response.json().get('client_challenge') client_challenge = response.json().get('client_challenge')
assert client_challenge == payload.get('client_challenge') assert client_challenge == payload.get('client_challenge')
signature = eval(response.headers.get('X-NLS-Signature'))
assert len(signature) == 512
lease_result_list = response.json().get('lease_result_list') lease_result_list = response.json().get('lease_result_list')
assert len(lease_result_list) == 1 assert len(lease_result_list) == 1
@ -244,8 +242,6 @@ def test_leasing_v1_lease_renew():
client_challenge = response.json().get('client_challenge') client_challenge = response.json().get('client_challenge')
assert client_challenge == payload.get('client_challenge') assert client_challenge == payload.get('client_challenge')
signature = eval(response.headers.get('X-NLS-Signature'))
assert len(signature) == 512
lease_ref = response.json().get('lease_ref') lease_ref = response.json().get('lease_ref')
assert len(lease_ref) == 36 assert len(lease_ref) == 36