From ee72165e3229e74c0cbc9a0a9372ee987e48b179 Mon Sep 17 00:00:00 2001 From: Maxim Mosin Date: Mon, 13 Mar 2023 02:08:09 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[TESTS]:=20SSH-=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B8=20`tw.ssh=5Fkeys`=20Fixes=20#63?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/conftest.py | 6 +++++ tests/test_sshkeys.py | 53 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 tests/test_sshkeys.py diff --git a/tests/conftest.py b/tests/conftest.py index 2aceac0..d461a04 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -14,6 +14,7 @@ class Config(BaseSettings): token: str = Field(..., env='TIMEWEB_TOKEN') + ssh_key: str = Field(..., env='TEST_SSH_KEY') class Config: env_file = 'tests/.env' @@ -36,3 +37,8 @@ def my_ip() -> str: if resp.is_success: return resp.text.strip() raise RuntimeError('Can\'t fetch IP address!') + + +@pytest.fixture() +def test_ssh_key() -> str: + return Config().ssh_key diff --git a/tests/test_sshkeys.py b/tests/test_sshkeys.py new file mode 100644 index 0000000..881a0e8 --- /dev/null +++ b/tests/test_sshkeys.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +from timeweb import Timeweb +from timeweb.schemas import ssh_keys as schemas +from timeweb.schemas.ssh_keys.ssh_keys import SSHKey + + +KEY_NAME = 'TESTKEY_PYTEST' +KEY_NEWNAME = 'TESTKEY_PYTEST_NEW' + + +def search_key(name: str, ssh_keys: list[SSHKey]) -> SSHKey: + array = list( + filter(lambda t: t.name == name, ssh_keys) + ) + return array.pop(0) + + +def test_get_keys(tw: Timeweb): + keys = tw.ssh_keys.get_keys() + assert isinstance(keys, schemas.SSHKeysArray) + + +def test_create_key(tw: Timeweb, test_ssh_key: str): + key = tw.ssh_keys.create(KEY_NAME, test_ssh_key, False) + assert isinstance(key, schemas.CreateSSHKeyResponse) + assert key.ssh_key.name == KEY_NAME + assert key.ssh_key.body == test_ssh_key + + +def test_get_key(tw: Timeweb, test_ssh_key: str): + keys = tw.ssh_keys.get_keys() + found_key = search_key(KEY_NAME, keys.ssh_keys) + key = tw.ssh_keys.get(found_key.id) + assert isinstance(key, schemas.SSHKeyResponse) + assert key.ssh_key.id == found_key.id + assert key.ssh_key.name == KEY_NAME + assert key.ssh_key.body == test_ssh_key + + +def test_update_key(tw: Timeweb): + keys = tw.ssh_keys.get_keys() + found_key = search_key(KEY_NAME, keys.ssh_keys) + updated = tw.ssh_keys.update(found_key.id, KEY_NEWNAME) + assert found_key.id == updated.ssh_key.id + assert found_key.name != updated.ssh_key.name + assert updated.ssh_key.name == KEY_NEWNAME + + +def test_delete_key(tw: Timeweb): + keys = tw.ssh_keys.get_keys() + found_key = search_key(KEY_NEWNAME, keys.ssh_keys) + status = tw.ssh_keys.delete(found_key.id) + assert status is True From 202bdcd706bd3b61921efb817b6c35af05d4769d Mon Sep 17 00:00:00 2001 From: Maxim Mosin Date: Mon, 13 Mar 2023 02:10:20 +0900 Subject: [PATCH 2/2] Fix model mistype. schemas.ssh_keys --- pyproject.toml | 4 ++-- src/timeweb/__meta.py | 2 +- src/timeweb/async_api/ssh_keys.py | 13 ++++++++----- src/timeweb/schemas/ssh_keys/ssh_keys.py | 9 ++++----- src/timeweb/sync_api/ssh_keys.py | 13 ++++++++----- 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9964f68..812f317 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "timeweb-cloud" -version = "0.12.1" +version = "0.12.2" description = "Timeweb Cloud API wrapper" authors = ["Maxim Mosin "] license = "MIT" @@ -42,7 +42,7 @@ requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.bumpver] -current_version = "0.12.1" +current_version = "0.12.2" version_pattern = "MAJOR.MINOR.PATCH" commit_message = "Bump version {old_version} -> {new_version}" commit = false diff --git a/src/timeweb/__meta.py b/src/timeweb/__meta.py index 48d26fe..b9d6349 100644 --- a/src/timeweb/__meta.py +++ b/src/timeweb/__meta.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- '''Timeweb Cloud package metadata''' -__version__ = '0.12.1' +__version__ = '0.12.2' __author__ = 'Maxim Mosin ' diff --git a/src/timeweb/async_api/ssh_keys.py b/src/timeweb/async_api/ssh_keys.py index b77a284..0d1d7c8 100644 --- a/src/timeweb/async_api/ssh_keys.py +++ b/src/timeweb/async_api/ssh_keys.py @@ -88,14 +88,17 @@ async def update( Returns: schemas.SSHKeyResponse: Обновленный SSH-ключ. ''' + data: dict[str, str] = {} + if name: + data['name'] = name + if body: + data['body'] = body + if is_default: + data['is_default'] = is_default key = await self._request( 'PATCH', f'/ssh-keys/{ssh_key_id}', - json={ - 'name': name, - 'body': body, - 'is_default': is_default, - }, + json=data ) return schemas.SSHKeyResponse(**key.json()) diff --git a/src/timeweb/schemas/ssh_keys/ssh_keys.py b/src/timeweb/schemas/ssh_keys/ssh_keys.py index 9961c4b..e4a32f6 100644 --- a/src/timeweb/schemas/ssh_keys/ssh_keys.py +++ b/src/timeweb/schemas/ssh_keys/ssh_keys.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- '''Модели для работы с SSH ключами''' -from uuid import UUID from datetime import datetime from pydantic import Field @@ -12,10 +11,10 @@ class Server(BaseData): '''Модель сервера. Attributes: - id (UUID): Уникальный идентификатор сервера. + id (int): Уникальный идентификатор сервера. name (str): Название сервера. ''' - id: UUID = Field(..., description='Уникальный идентификатор сервера.') + id: int = Field(..., description='Уникальный идентификатор сервера.') name: str = Field(..., description='Название сервера.') @@ -23,14 +22,14 @@ class SSHKey(BaseData): '''Модель SSH ключа. Attributes: - id (UUID): Уникальный идентификатор SSH ключа. + id (int): Уникальный идентификатор SSH ключа. name (str): Название SSH ключа. body (str): Тело SSH-ключа. created_at (datetime): Дата и время создания SSH ключа. used_by (list[Server]): Массив серверов, на которых используется SSH ключ. is_default (bool): Будет ли выбираться SSH-ключ по умолчанию при создании сервера ''' - id: UUID = Field(..., description='Уникальный идентификатор SSH ключа.') + id: int = Field(..., description='Уникальный идентификатор SSH ключа.') name: str = Field(..., description='Название SSH ключа.') body: str = Field(..., description='Тело SSH-ключа.') created_at: datetime = Field( diff --git a/src/timeweb/sync_api/ssh_keys.py b/src/timeweb/sync_api/ssh_keys.py index 50a8f43..fe12d10 100644 --- a/src/timeweb/sync_api/ssh_keys.py +++ b/src/timeweb/sync_api/ssh_keys.py @@ -88,14 +88,17 @@ def update( Returns: schemas.SSHKeyResponse: Обновленный SSH-ключ. ''' + data: dict[str, str] = {} + if name: + data['name'] = name + if body: + data['body'] = body + if is_default: + data['is_default'] = is_default key = self._request( 'PATCH', f'/ssh-keys/{ssh_key_id}', - json={ - 'name': name, - 'body': body, - 'is_default': is_default, - }, + json=data ) return schemas.SSHKeyResponse(**key.json())