From f004cf4d03358c2c5b47416c2d4e0b440a2f739f Mon Sep 17 00:00:00 2001 From: Yury Dzerin Date: Tue, 1 Feb 2022 11:43:47 +0100 Subject: [PATCH 1/2] Implement database update method --- src/firebolt/model/database.py | 43 ++++++++++++++++++++++++++++- tests/unit/service/conftest.py | 17 ++++++++++++ tests/unit/service/test_database.py | 28 +++++++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/src/firebolt/model/database.py b/src/firebolt/model/database.py index 2f397ef65c5..98c9c562784 100644 --- a/src/firebolt/model/database.py +++ b/src/firebolt/model/database.py @@ -2,7 +2,7 @@ import logging from datetime import datetime -from typing import TYPE_CHECKING, Any, List, Optional +from typing import TYPE_CHECKING, Any, List, Optional, Sequence from pydantic import Field, PrivateAttr @@ -25,6 +25,10 @@ class DatabaseKey(FireboltBaseModel): database_id: str +class FieldMask(FireboltBaseModel): + paths: Sequence[str] = Field(alias="paths") + + class Database(FireboltBaseModel): """ A Firebolt database. @@ -121,3 +125,40 @@ def delete(self) -> Database: return Database.parse_obj_with_service( response.json()["database"], self._service ) + + def update(self) -> Database: + """ + Updates a database from Firebolt. Parameters, that will be updated: description + """ + + class _DatabaseUpdateRequest(FireboltBaseModel): + """Helper model for sending Database creation requests.""" + + account_id: str + database: Database + database_id: str + update_mask: FieldMask + + logger.info( + f"Updating Database (database_id={self.database_id}, " + f"name={self.name}, description={self.description})" + ) + + payload = _DatabaseUpdateRequest( + account_id=self._service.account_id, + database=self, + database_id=self.database_id, + update_mask=FieldMask(paths=["description"]), + ).jsonable_dict(by_alias=True) + + response = self._service.client.patch( + url=ACCOUNT_DATABASE_URL.format( + account_id=self._service.account_id, database_id=self.database_id + ), + headers={"Content-type": "application/json"}, + json=payload, + ) + + return Database.parse_obj_with_service( + response.json()["database"], self._service + ) diff --git a/tests/unit/service/conftest.py b/tests/unit/service/conftest.py index 48622fc80eb..842333a436e 100644 --- a/tests/unit/service/conftest.py +++ b/tests/unit/service/conftest.py @@ -365,6 +365,23 @@ def database_get_by_name_url(settings: Settings, account_id: str, mock_database) ) +@pytest.fixture +def database_update_callback(database_get_url, mock_database) -> Callable: + def do_mock( + request: httpx.Request = None, + **kwargs, + ) -> Response: + database_properties = json.loads(request.read().decode("utf-8"))["database"] + + assert request.url == database_get_url + return Response( + status_code=httpx.codes.OK, + json={"database": database_properties}, + ) + + return do_mock + + @pytest.fixture def database_get_callback(database_get_url, mock_database) -> Callable: def do_mock( diff --git a/tests/unit/service/test_database.py b/tests/unit/service/test_database.py index 3c8805ce611..eda7b008271 100644 --- a/tests/unit/service/test_database.py +++ b/tests/unit/service/test_database.py @@ -102,3 +102,31 @@ def test_database_get_many( assert len(databases) == 1 assert databases[0].name == mock_database.name + + +def test_database_update( + httpx_mock: HTTPXMock, + auth_callback: Callable, + auth_url: str, + provider_callback: Callable, + provider_url: str, + settings: Settings, + account_id_callback: Callable, + account_id_url: str, + database_update_callback: Callable, + database_url: str, + mock_database: Database, +): + httpx_mock.add_callback(auth_callback, url=auth_url) + httpx_mock.add_callback(provider_callback, url=provider_url) + httpx_mock.add_callback(account_id_callback, url=account_id_url) + + httpx_mock.add_callback(database_update_callback, url=database_url, method="PATCH") + + manager = ResourceManager(settings=settings) + + mock_database.description = "new description" + mock_database._service = manager + database = mock_database.update() + + assert database.description == "new description" From c3d2b9329ec8c1e9517468a68ed860905b1a881c Mon Sep 17 00:00:00 2001 From: Yury Dzerin Date: Mon, 7 Feb 2022 13:49:12 +0100 Subject: [PATCH 2/2] Change update function definition to make it same as engine update --- src/firebolt/model/database.py | 6 ++++-- tests/unit/service/test_database.py | 3 +-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/firebolt/model/database.py b/src/firebolt/model/database.py index 98c9c562784..cc281691b04 100644 --- a/src/firebolt/model/database.py +++ b/src/firebolt/model/database.py @@ -126,9 +126,9 @@ def delete(self) -> Database: response.json()["database"], self._service ) - def update(self) -> Database: + def update(self, description: str) -> Database: """ - Updates a database from Firebolt. Parameters, that will be updated: description + Updates a database description. """ class _DatabaseUpdateRequest(FireboltBaseModel): @@ -139,6 +139,8 @@ class _DatabaseUpdateRequest(FireboltBaseModel): database_id: str update_mask: FieldMask + self.description = description + logger.info( f"Updating Database (database_id={self.database_id}, " f"name={self.name}, description={self.description})" diff --git a/tests/unit/service/test_database.py b/tests/unit/service/test_database.py index eda7b008271..1b5bb1ea726 100644 --- a/tests/unit/service/test_database.py +++ b/tests/unit/service/test_database.py @@ -125,8 +125,7 @@ def test_database_update( manager = ResourceManager(settings=settings) - mock_database.description = "new description" mock_database._service = manager - database = mock_database.update() + database = mock_database.update(description="new description") assert database.description == "new description"