diff --git a/bitelab/__init__.py b/bitelab/__init__.py index 4ebd1d1..a4453b8 100644 --- a/bitelab/__init__.py +++ b/bitelab/__init__.py @@ -31,7 +31,7 @@ from dataclasses import dataclass from functools import lru_cache, wraps from io import StringIO -from fastapi import APIRouter, Depends, FastAPI, HTTPException, Request +from fastapi import APIRouter, Body, Depends, FastAPI, HTTPException, Request from fastapi.security import OAuth2PasswordBearer from httpx import AsyncClient, Auth from starlette.responses import JSONResponse @@ -309,10 +309,16 @@ async def get_board_info(board_id, user: str = Depends(lookup_user), return brd @router.post('/board/{board_id_or_class}/reserve', response_model=Union[Board, Error]) -async def reserve_board(board_id_or_class, user: str = Depends(lookup_user), +async def reserve_board(board_id_or_class, + req: Request, + user: str = Depends(lookup_user), brdmgr: BoardManager = Depends(get_boardmanager), settings: config.Settings = Depends(get_settings), + sshpubkey: str = Body(embed=True, default=None, + title='Default public ssh key to install.'), data: data.DataWrapper = Depends(get_data)): + + #print('reserve:', repr(sshpubkey), repr(await req.body())) board_id = board_id_or_class brd = brdmgr.boards[board_id] @@ -338,8 +344,11 @@ async def reserve_board(board_id_or_class, user: str = Depends(lookup_user), # Initialize board try: - sub = await asyncio.create_subprocess_exec( - settings.setup_script, 'reserve', brd.name, user, + args = ( settings.setup_script, 'reserve', + brd.name, user, ) + if sshpubkey is not None: + args += (sshpubkey, ) + sub = await asyncio.create_subprocess_exec(*args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = await sub.communicate() if sub.returncode: @@ -650,8 +659,11 @@ class TestBiteLab(unittest.IsolatedAsyncioTestCase): devfsrule='14', )).encode('utf-8')) + keydata = 'pubsshkey' + # that reserving the board res = await self.client.post('/board/cora-1/reserve', + json=dict(sshpubkey=keydata), auth=BiteAuth('thisisanapikey')) # that it is successful @@ -671,7 +683,7 @@ class TestBiteLab(unittest.IsolatedAsyncioTestCase): # and that it called the start script cse.assert_called_with(self.settings.setup_script, 'reserve', - 'cora-1', 'foo', stdout=subprocess.PIPE, stderr=subprocess.PIPE) + 'cora-1', 'foo', 'pubsshkey', stdout=subprocess.PIPE, stderr=subprocess.PIPE) # that another user reserving the board res = await self.client.post('/board/cora-1/reserve',