Skip to content

Commit

Permalink
Merge pull request #44 from LulzLoL231/up-api-version
Browse files Browse the repository at this point in the history
Up library to latest API version
  • Loading branch information
LulzLoL231 authored Mar 6, 2023
2 parents fbb1269 + 795f6ab commit 5f36b40
Show file tree
Hide file tree
Showing 19 changed files with 450 additions and 83 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ print(account_status)
- [x] Kubernetes
- [x] S3-хранилище
- [x] SSH-ключи
- [ ] Почта

## Etag
Etag - это уникальный идентификатор, который используется для проверки изменений в API. Он будет использоваться чтобы определять текущею версию Swagger API, т.к. сейчас Swagger API Timeweb Cloud не имеет версионности и/или changelog'а. Получается он из запроса к спецификации OpenAPI по ссылке https://timeweb.cloud/api-docs-data/bundle.json. Сервер сам его возвращает и мы пока операемся на него. В будущем, когда/если Swagger API Timeweb Cloud будет иметь версионность и/или changelog, будем опираться на их версию Swagger API.
37 changes: 33 additions & 4 deletions src/timeweb/async_api/balancers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
Документация: https://timeweb.cloud/api-docs#tag/Balansirovshiki'''
import logging
import warnings
from datetime import timedelta
from ipaddress import IPv4Address, IPv6Address

from httpx import AsyncClient
Expand Down Expand Up @@ -176,19 +178,46 @@ async def update(
)
return schemas.BalancerResponse(**balancer.json())

async def delete(self, balancer_id: int) -> bool:
async def delete(self, balancer_id: int) -> bool | schemas.BalancerDelete:
'''Удалить балансировщик.
Args:
balancer_id (int): UID балансировщика.
Returns:
bool: Успешность удаления.
bool | schemas.BalancerDelete: Успешность удаления. Или хэш для подтверждения.
'''
await self._request(
status = await self._request(
'DELETE', f'/balancers/{balancer_id}'
)
return True
if status.status_code == 204:
return True
elif status.status_code == 200:
return schemas.BalancerDelete(**status.json())
else:
return False

async def confirm_delete(
self, balancer_id: int, hash: str, code: str
) -> bool:
params = {
'hash': hash,
'code': code
}
status = await self._request(
'DELETE', f'/balancers/{balancer_id}',
params=params
)
if status.status_code == 204 and status.elapsed > timedelta(seconds=2):
return True
else:
if status.status_code == 204:
warnings.warn(
'API слишком быстро подтвердил удаление. '
'Возможно он врёт. Проверьте хэш!'
)
return True
return False

async def get_balancer_ips(self, balancer_id: int) -> schemas.BalancerIPsResponse:
'''Получить IP балансировщика.
Expand Down
49 changes: 43 additions & 6 deletions src/timeweb/async_api/dbs.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
Документация: https://timeweb.cloud/api-docs#tag/Bazy-dannyh'''
import logging
import warnings
from datetime import timedelta

from httpx import AsyncClient

Expand Down Expand Up @@ -134,19 +136,54 @@ async def update(
)
return schemas.DatabaseResponse(**db.json())

async def delete(self, db_id: int) -> bool:
'''Удалить базу данных.
async def delete(self, db_id: int) -> bool | schemas.DatabaseDelete:
'''Удалить БД.
Args:
db_id (int): ID базы данных.
db_id (int): UID балансировщика.
Returns:
bool: True, если база данных успешно удалена.
bool | schemas.DatabaseDelete: Успешность удаления. Или хэш для подтверждения.
'''
await self._request(
status = await self._request(
'DELETE', f'/dbs/{db_id}'
)
return True
if status.status_code == 204:
return True
elif status.status_code == 200:
return schemas.DatabaseDelete(**status.json())
else:
return False

async def confirm_delete(self, db_id: int, hash: str, code: str) -> bool:
'''Подтвердить удаление БД.
Args:
db_id (int): UID базы данных.
hash (str): Хэш подтверждения удаление из `self.delete`.
code (str): Код подтверждения удаления.
Returns:
bool: БД удалена?
'''
params = {
'hash': hash,
'code': code
}
status = await self._request(
'DELETE', f'/dbs/{db_id}',
params=params
)
if status.status_code == 204 and status.elapsed > timedelta(seconds=2):
return True
else:
if status.status_code == 204:
warnings.warn(
'API слишком быстро подтвердил удаление. '
'Возможно он врёт. Проверьте хэш!'
)
return True
return False

async def get_backups(
self, db_id: int, limit: int = 100, offset: int = 0
Expand Down
27 changes: 21 additions & 6 deletions src/timeweb/async_api/images.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,35 +28,50 @@ def __init__(self, token: str, client: AsyncClient | None = None):
super().__init__(token, client)
self.log = logging.getLogger('timeweb')

async def get_images(self, limit: int = 100, offset: int = 0) -> schemas.ImagesArray:
async def get_images(
self, limit: int = 100, offset: int = 0, with_deleted: bool = False
) -> schemas.ImagesArray:
'''Получение списка образов.
Args:
limit (int, optional): Количество элементов на странице. Defaults to 100.
offset (int, optional): Смещение от начала списка. Defaults to 0.
with_deleted (bool, optional): Вернуть в том числе и удалённые? Default to False.
Returns:
ImagesArray: Список образов.
'''
images = await self._request(
'GET', 'images',
params={'limit': limit, 'offset': offset}
params={
'limit': limit, 'offset': offset, 'with_deleted': with_deleted
}
)
return schemas.ImagesArray(**images.json())

async def create(self, description: str, disk_id: int) -> schemas.ImageResponse:
async def create(
self, name: str = '', description: str = '', disk_id: int | None = None
) -> schemas.ImageResponse:
'''Создание образа.
Args:
description (str): Описание образа.
disk_id (int): Идентификатор диска, для которого создается образ
name (str, optional): Имя образа. Defaults to "".
description (str, optional): Описание образа. Defaults to "".
disk_id (int | None, optional): Идентификатор диска, для которого создается образ. Defaults to None.
Returns:
ImageResponse: Информация о созданном образе.
'''
data: dict[str, str | int] = {}
if name:
data['name'] = name
if description:
data['description'] = description
if disk_id:
data['disk_id'] = disk_id
image = await self._request(
'POST', 'images',
json={'description': description, 'disk_id': disk_id}
json=data
)
return schemas.ImageResponse(**image.json())

Expand Down
53 changes: 48 additions & 5 deletions src/timeweb/async_api/s3.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
Документация: https://timeweb.cloud/api-docs#tag/S3-hranilishe'''
import logging
import warnings
from datetime import timedelta

from httpx import AsyncClient

Expand Down Expand Up @@ -51,13 +53,54 @@ async def create(
)
return schemas.BucketResponse(**bucket.json())

async def delete(self, bucket_id: int) -> bool:
'''Удаление S3-хранилища
async def delete(self, bucket_id: int) -> bool | schemas.BucketDelete:
'''Удалить S3-хранилище.
Args:
bucket_id (int): ID хранилища.
bucket_id (int): UID хранилища.
Returns:
bool | schemas.BucketDelete: Успешность удаления. Или хэш для подтверждения.
'''
await self._request('DELETE', f'/storages/buckets/{bucket_id}')
return True
status = await self._request(
'DELETE', f'/storages/buckets/{bucket_id}'
)
if status.status_code == 204:
return True
elif status.status_code == 200:
return schemas.BucketDelete(**status.json())
else:
return False

async def confirm_delete(self, bucket_id: int, hash: str, code: str) -> bool:
'''Подтвердить удаление S3-хранилища.
Args:
bucket_id (int): UID хранилища.
hash (str): Хэш подтверждения удаление из `self.delete`.
code (str): Код подтверждения удаления.
Returns:
bool: Хранилище удалено?
'''
params = {
'hash': hash,
'code': code
}
status = await self._request(
'DELETE', f'/storages/buckets/{bucket_id}',
params=params
)
if status.status_code == 204 and status.elapsed > timedelta(seconds=2):
return True
else:
if status.status_code == 204:
warnings.warn(
'API слишком быстро подтвердил удаление. '
'Возможно он врёт. Проверьте хэш!'
)
return True
return False

async def update(
self, bucket_id: int, preset_id: int | None = None,
Expand Down
Loading

0 comments on commit 5f36b40

Please sign in to comment.