diff --git a/cmd/package b/cmd/package index cb81c1592..988d4092e 100755 --- a/cmd/package +++ b/cmd/package @@ -53,4 +53,4 @@ cp -r {framework,modules} $MAKE_SRC_DIR/usr/local/testrun dpkg-deb --build --root-owner-group make # Rename the .deb file -mv make.deb testrun_1-1-1-alpha_amd64.deb +mv make.deb testrun_1-1-1-beta_amd64.deb diff --git a/framework/python/src/api/api.py b/framework/python/src/api/api.py index 8bfa9171c..80730f4d6 100644 --- a/framework/python/src/api/api.py +++ b/framework/python/src/api/api.py @@ -77,6 +77,9 @@ def __init__(self, test_run): self.delete_device, methods=["DELETE"]) self._router.add_api_route("/device", self.save_device, methods=["POST"]) + self._router.add_api_route("/device/edit", + self.edit_device, + methods=["POST"]) # Allow all origins to access the API origins = ["*"] @@ -365,6 +368,7 @@ async def delete_device(self, request: Request, response: Response): "the device") async def save_device(self, request: Request, response: Response): + LOGGER.debug("Received device post request") try: @@ -392,8 +396,9 @@ async def save_device(self, request: Request, response: Response): else: - self._test_run.save_device(device, device_json) - response.status_code = status.HTTP_200_OK + response.status_code = status.HTTP_409_CONFLICT + return self._generate_msg(False, "A device with that " + + "MAC address already exists") return device.to_config_json() @@ -402,6 +407,74 @@ async def save_device(self, request: Request, response: Response): response.status_code = status.HTTP_400_BAD_REQUEST return self._generate_msg(False, "Invalid JSON received") + async def edit_device(self, request: Request, response: Response): + + LOGGER.debug("Received device edit request") + + try: + req_raw = (await request.body()).decode("UTF-8") + req_json = json.loads(req_raw) + + # Validate top level fields + if not (DEVICE_MAC_ADDR_KEY in req_json and + "device" in req_json): + response.status_code = status.HTTP_400_BAD_REQUEST + return self._generate_msg(False, "Invalid request received") + + # Extract device information from request + device_json = req_json.get("device") + + if not self._validate_device_json(device_json): + response.status_code = status.HTTP_400_BAD_REQUEST + return self._generate_msg(False, "Invalid request received") + + # Get device from old MAC address + device = self._session.get_device(req_json.get(DEVICE_MAC_ADDR_KEY)) + + # Check if device exists + if device is None: + response.status_code = status.HTTP_404_NOT_FOUND + return self._generate_msg(False, + "A device with that MAC " + + "address could not be found") + + if (self._session.get_target_device() == device and + self._session.get_status() not in [ + "Cancelled", + "Compliant", + "Non-Compliant"]): + response.status_code = 403 + return self._generate_msg(False, "Cannot edit this device whilst " + + "it is being tested") + + # Check if a device exists with the new MAC address + check_new_device = self._session.get_device( + device_json.get(DEVICE_MAC_ADDR_KEY)) + + if not check_new_device is None and (device.mac_addr + != check_new_device.mac_addr): + response.status_code = status.HTTP_409_CONFLICT + return self._generate_msg(False, + "A device with that MAC address " + + "already exists") + + # Update the device + device.mac_addr = device_json.get(DEVICE_MAC_ADDR_KEY).lower() + device.manufacturer = device_json.get(DEVICE_MANUFACTURER_KEY) + device.model = device_json.get(DEVICE_MODEL_KEY) + device.test_modules = device_json.get(DEVICE_TEST_MODULES_KEY) + + self._test_run.save_device(device, device_json) + response.status_code = status.HTTP_200_OK + + return device.to_config_json() + + # Catch JSON Decode error etc + except JSONDecodeError: + response.status_code = status.HTTP_400_BAD_REQUEST + return self._generate_msg(False, "Invalid JSON received") + + async def get_report(self, response: Response, device_name, timestamp): diff --git a/framework/python/src/common/testreport.py b/framework/python/src/common/testreport.py index ae9f61526..f522c7b25 100644 --- a/framework/python/src/common/testreport.py +++ b/framework/python/src/common/testreport.py @@ -182,7 +182,7 @@ def generate_pages(self, json_data): def generate_page(self, json_data, page_num, max_page): # Placeholder until available in json report - version = 'v1.1.1-alpha (2024-01-16)' + version = 'v1.1.1-beta (2024-01-17)' page = '
' page += self.generate_header(json_data) if page_num == 1: diff --git a/make/DEBIAN/control b/make/DEBIAN/control index 53e2dba2b..071073aa9 100644 --- a/make/DEBIAN/control +++ b/make/DEBIAN/control @@ -1,5 +1,5 @@ Package: Testrun -Version: 1.1.1-alpha +Version: 1.1.1-beta Architecture: amd64 Maintainer: Google Homepage: https://github.com/google/testrun