twc-cli 2.12.0__py3-none-any.whl → 2.13.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of twc-cli might be problematic. Click here for more details.

twc/__main__.py CHANGED
@@ -22,6 +22,7 @@ from .commands import (
22
22
  firewall,
23
23
  floating_ip,
24
24
  whoami,
25
+ apps,
25
26
  )
26
27
  from .commands.common import version_callback, version_option, verbose_option
27
28
 
@@ -33,6 +34,7 @@ cli = TyperAlias(
33
34
  )
34
35
  cli.add_typer(config, name="config")
35
36
  cli.add_typer(account, name="account")
37
+ cli.add_typer(apps, name="apps")
36
38
  cli.add_typer(server, name="server", aliases=["servers", "s"])
37
39
  cli.add_typer(ssh_key, name="ssh-key", aliases=["ssh-keys", "k"])
38
40
  cli.add_typer(image, name="image", aliases=["images", "i"])
twc/__version__.py CHANGED
@@ -12,5 +12,5 @@
12
12
  import sys
13
13
 
14
14
 
15
- __version__ = "2.12.0"
15
+ __version__ = "2.13.0"
16
16
  __pyversion__ = sys.version.replace("\n", "")
twc/api/client.py CHANGED
@@ -2,10 +2,12 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from ipaddress import IPv4Address, IPv6Address, IPv4Network, IPv6Network
5
6
  from typing import Optional, Union, List
6
- from uuid import UUID
7
7
  from pathlib import Path
8
- from ipaddress import IPv4Address, IPv6Address, IPv4Network, IPv6Network
8
+ from uuid import UUID
9
+
10
+ import yaml
9
11
 
10
12
  from .base import TimewebCloudBase
11
13
  from .types import (
@@ -34,6 +36,43 @@ from .types import (
34
36
  class TimewebCloud(TimewebCloudBase):
35
37
  """Timeweb Cloud API client class."""
36
38
 
39
+ # -----------------------------------------------------------------------
40
+ # Apps
41
+
42
+ def get_apps(self):
43
+ """Return Timeweb Cloud apps list."""
44
+ return self._request("GET", f"{self.api_url}/apps")
45
+
46
+ def create_app(self, yaml_config_path: str):
47
+ """Create Timeweb Cloud app."""
48
+
49
+ with open(yaml_config_path, "r", encoding="utf-8") as f:
50
+ payload = yaml.safe_load(f)
51
+ payload = payload["app"]
52
+ return self._request("POST", f"{self.api_url}/apps", json=payload)
53
+
54
+ def get_app(self, app_id: int):
55
+ """Return Timeweb Cloud app."""
56
+ return self._request("GET", f"{self.api_url}/apps/{app_id}")
57
+
58
+ def get_vcs_providers(self):
59
+ """Return Timeweb Cloud vcs providers."""
60
+ return self._request("GET", f"{self.api_url}/vcs-provider")
61
+
62
+ def get_repositories(self, vcs_provider_id: str):
63
+ """Return Timeweb Cloud user vcs repositories."""
64
+ return self._request(
65
+ "GET", f"{self.api_url}/vcs-provider/{vcs_provider_id}"
66
+ )
67
+
68
+ def get_apps_tarifs(self):
69
+ """Return Timeweb Cloud Apps tarifs"""
70
+ return self._request("GET", f"{self.api_url}/presets/apps")
71
+
72
+ def delete_app(self, app_id: int):
73
+ """Delete Timeweb Cloud app."""
74
+ return self._request("DELETE", f"{self.api_url}/apps/{app_id}")
75
+
37
76
  # -----------------------------------------------------------------------
38
77
  # Account
39
78
 
twc/commands/__init__.py CHANGED
@@ -1,6 +1,7 @@
1
1
  """Commands."""
2
2
 
3
3
  from .account import account, whoami
4
+ from .apps import apps
4
5
  from .config import config
5
6
  from .server import server
6
7
  from .ssh_key import ssh_key
twc/commands/apps.py ADDED
@@ -0,0 +1,337 @@
1
+ """Manage apps."""
2
+
3
+ from typing import Optional
4
+ from pathlib import Path
5
+
6
+ import typer
7
+ from requests import Response
8
+
9
+ from twc import fmt
10
+ from twc.typerx import TyperAlias
11
+ from twc.apiwrap import create_client
12
+ from .common import (
13
+ verbose_option,
14
+ config_option,
15
+ profile_option,
16
+ filter_option,
17
+ output_format_option,
18
+ )
19
+
20
+
21
+ apps = TyperAlias(help=__doc__)
22
+
23
+
24
+ # ------------------------------------------------------------- #
25
+ # $ twc apps list #
26
+ # ------------------------------------------------------------- #
27
+
28
+
29
+ def print_apps(response: Response, filters: Optional[str]):
30
+ """Print table with apps list."""
31
+ # pylint: disable=invalid-name
32
+ _apps = response.json()["apps"]
33
+ if filters:
34
+ _apps = fmt.filter_list(_apps, filters)
35
+ table = fmt.Table()
36
+ table.header(
37
+ [
38
+ "ID",
39
+ "NAME",
40
+ "STATUS",
41
+ "TYPE",
42
+ "IPV4",
43
+ ]
44
+ )
45
+ for app in _apps:
46
+ table.row(
47
+ [
48
+ app["id"],
49
+ app["name"],
50
+ app["status"],
51
+ app["type"],
52
+ app["ip"],
53
+ ]
54
+ )
55
+ table.print()
56
+
57
+
58
+ @apps.command("list", "ls")
59
+ def apps_list(
60
+ verbose: Optional[bool] = verbose_option,
61
+ config: Optional[Path] = config_option,
62
+ profile: Optional[str] = profile_option,
63
+ output_format: Optional[str] = output_format_option,
64
+ filters: Optional[str] = filter_option,
65
+ ):
66
+ """List apps."""
67
+ client = create_client(config, profile)
68
+ response = client.get_apps()
69
+ fmt.printer(
70
+ response,
71
+ output_format=output_format,
72
+ filters=filters,
73
+ func=print_apps,
74
+ )
75
+
76
+
77
+ @apps.command("create")
78
+ def app_create(
79
+ yml_config_path: str,
80
+ verbose: Optional[bool] = verbose_option,
81
+ config: Optional[Path] = config_option,
82
+ profile: Optional[str] = profile_option,
83
+ output_format: Optional[str] = output_format_option,
84
+ status: Optional[bool] = typer.Option(
85
+ False,
86
+ "--status",
87
+ help="Display status and exit with 0 if status is 'started'.",
88
+ ),
89
+ ):
90
+ """Create app"""
91
+ client = create_client(config, profile)
92
+ response = client.create_app(yml_config_path)
93
+ fmt.printer(
94
+ response,
95
+ output_format=output_format,
96
+ func=lambda response: print(response.json()["app"]["id"]),
97
+ )
98
+
99
+
100
+ def print_vcs_providers(response: Response):
101
+ """Print table with vcs list."""
102
+ # pylint: disable=invalid-name
103
+ providers = response.json()["providers"]
104
+ table = fmt.Table()
105
+ table.header(
106
+ [
107
+ "LOGIN",
108
+ "PROVIDER",
109
+ "PROVIDER_ID",
110
+ ]
111
+ )
112
+ for provider in providers:
113
+ table.row(
114
+ [
115
+ provider["login"],
116
+ provider["provider"],
117
+ provider["provider_id"],
118
+ ]
119
+ )
120
+ table.print()
121
+
122
+
123
+ @apps.command("get-vcs-providers")
124
+ def app_get_vcs_providers(
125
+ verbose: Optional[bool] = verbose_option,
126
+ config: Optional[Path] = config_option,
127
+ profile: Optional[str] = profile_option,
128
+ output_format: Optional[str] = output_format_option,
129
+ ):
130
+ """Get VCS providers."""
131
+ client = create_client(config, profile)
132
+ response = client.get_vcs_providers()
133
+ fmt.printer(
134
+ response, output_format=output_format, func=print_vcs_providers
135
+ )
136
+
137
+
138
+ def print_vcs_repositories(response: Response):
139
+ """Print table with vcs list."""
140
+ # pylint: disable=invalid-name
141
+ providers = response.json()["repositories"]
142
+ table = fmt.Table()
143
+ table.header(["FULL NAME", "ID", "NAME", "URL", "IS PRIVATE"])
144
+ for provider in providers:
145
+ table.row(
146
+ [
147
+ provider["full_name"],
148
+ provider["id"],
149
+ provider["name"],
150
+ provider["url"],
151
+ provider["is_private"],
152
+ ]
153
+ )
154
+ table.print()
155
+
156
+
157
+ @apps.command("get-repositories")
158
+ def app_get_repositories(
159
+ vcs_provider_id: str,
160
+ verbose: Optional[bool] = verbose_option,
161
+ config: Optional[Path] = config_option,
162
+ profile: Optional[str] = profile_option,
163
+ output_format: Optional[str] = output_format_option,
164
+ ):
165
+ """Get repositories."""
166
+ client = create_client(config, profile)
167
+ response = client.get_repositories(vcs_provider_id)
168
+ fmt.printer(
169
+ response, output_format=output_format, func=print_vcs_repositories
170
+ )
171
+
172
+
173
+ def print_apps_tarifs(response: Response, typ: str):
174
+ """Print Timeweb Cloud Apps tarifs."""
175
+ # pylint: disable=invalid-name
176
+ if typ == "backend":
177
+ key = "backend_presets"
178
+ elif typ == "frontend":
179
+ key = "frontend_presets"
180
+ else:
181
+ raise KeyError("Tarifs can be only backend or frontend")
182
+
183
+ providers = response.json()[key]
184
+ table = fmt.Table()
185
+ if key == "backend_presets":
186
+ table.header(
187
+ [
188
+ "CPU",
189
+ "CPU FREQUENCY",
190
+ "DESCRIPTION",
191
+ "DESCRIPTION SHORT",
192
+ "DISK",
193
+ "ID",
194
+ "LOCATION",
195
+ "PRICE",
196
+ "RAM",
197
+ ]
198
+ )
199
+ for provider in providers:
200
+ table.row(
201
+ [
202
+ provider["cpu"],
203
+ provider["cpu_frequency"],
204
+ provider["description"],
205
+ provider["description_short"],
206
+ provider["disk"],
207
+ provider["id"],
208
+ provider["location"],
209
+ provider["price"],
210
+ provider["ram"],
211
+ ]
212
+ )
213
+ elif key == "frontend_presets":
214
+ table.header(
215
+ [
216
+ "DESCRIPTION",
217
+ "DESCRIPTION_SHORT",
218
+ "DISK",
219
+ "ID",
220
+ "LOCATION",
221
+ "PRICE",
222
+ "REQUESTS",
223
+ ]
224
+ )
225
+ for provider in providers:
226
+ table.row(
227
+ [
228
+ provider["description"],
229
+ provider["description_short"],
230
+ provider["disk"],
231
+ provider["id"],
232
+ provider["location"],
233
+ provider["price"],
234
+ provider["requests"],
235
+ ]
236
+ )
237
+ table.print()
238
+
239
+
240
+ @apps.command("list-presets")
241
+ def get_apps_tarifs(
242
+ _type: str = typer.Argument(..., metavar="TYPE"),
243
+ verbose: Optional[bool] = verbose_option,
244
+ config: Optional[Path] = config_option,
245
+ profile: Optional[str] = profile_option,
246
+ output_format: Optional[str] = output_format_option,
247
+ ):
248
+ """Get tarifs; backend or frontend"""
249
+ client = create_client(config, profile)
250
+ response = client.get_apps_tarifs()
251
+ fmt.printer(
252
+ response,
253
+ output_format=output_format,
254
+ typ=_type,
255
+ func=print_apps_tarifs,
256
+ )
257
+
258
+
259
+ def print_app_delete_response(response: Response, app_id: int):
260
+ """Print table with apps list."""
261
+ # pylint: disable=invalid-name
262
+ table = fmt.Table()
263
+ table.header(
264
+ [
265
+ "ID",
266
+ ]
267
+ )
268
+ table.row(
269
+ [
270
+ app_id,
271
+ ]
272
+ )
273
+ table.print()
274
+
275
+
276
+ @apps.command("delete")
277
+ def delete_app(
278
+ app_id: int,
279
+ verbose: Optional[bool] = verbose_option,
280
+ config: Optional[Path] = config_option,
281
+ profile: Optional[str] = profile_option,
282
+ output_format: Optional[str] = output_format_option,
283
+ ):
284
+ """Delete apps."""
285
+ client = create_client(config, profile)
286
+ response = client.delete_app(app_id)
287
+ fmt.printer(
288
+ response,
289
+ output_format=output_format,
290
+ app_id=app_id,
291
+ func=print_app_delete_response,
292
+ )
293
+
294
+
295
+ def get_app(response: Response):
296
+ """Print table with apps list."""
297
+ # pylint: disable=invalid-name
298
+ app = response.json()["app"]
299
+ table = fmt.Table()
300
+ table.header(
301
+ [
302
+ "ID",
303
+ "LOCATION",
304
+ "STATUS",
305
+ "TYPE",
306
+ "IPV4",
307
+ ]
308
+ )
309
+ table.row(
310
+ [
311
+ app["id"],
312
+ app["location"],
313
+ app["status"],
314
+ app["type"],
315
+ app["ip"],
316
+ ]
317
+ )
318
+ table.print()
319
+
320
+
321
+ @apps.command("get")
322
+ def app_get(
323
+ app_id: int,
324
+ verbose: Optional[bool] = verbose_option,
325
+ config: Optional[Path] = config_option,
326
+ profile: Optional[str] = profile_option,
327
+ output_format: Optional[str] = output_format_option,
328
+ status: Optional[bool] = typer.Option(
329
+ False,
330
+ "--status",
331
+ help="Display status and exit with 0 if status is 'started'.",
332
+ ),
333
+ ):
334
+ """Get database info."""
335
+ client = create_client(config, profile)
336
+ response = client.get_app(app_id)
337
+ fmt.printer(response, output_format=output_format, func=get_app)
@@ -1,8 +1,7 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: twc-cli
3
- Version: 2.12.0
3
+ Version: 2.13.0
4
4
  Summary: Timeweb Cloud Command Line Interface.
5
- Home-page: https://github.com/timeweb-cloud/twc
6
5
  License: MIT
7
6
  Author: ge
8
7
  Author-email: dev@timeweb.cloud
@@ -17,10 +16,11 @@ Classifier: Programming Language :: Python :: 3.13
17
16
  Requires-Dist: colorama (>=0.4.6,<0.5.0)
18
17
  Requires-Dist: pygments (>=2.18.0,<3.0.0)
19
18
  Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
20
- Requires-Dist: requests (>=2.32.3,<3.0.0)
19
+ Requires-Dist: requests (>=2.32.4,<3.0.0)
21
20
  Requires-Dist: shellingham (>=1.5.4,<2.0.0)
22
21
  Requires-Dist: toml (>=0.10.2,<0.11.0)
23
22
  Requires-Dist: typer-slim (>=0.12.3,<0.13.0)
23
+ Project-URL: Homepage, https://github.com/timeweb-cloud/twc
24
24
  Project-URL: Repository, https://github.com/timeweb-cloud/twc
25
25
  Description-Content-Type: text/markdown
26
26
 
@@ -1,16 +1,15 @@
1
- CHANGELOG.md,sha256=L4iyG04B4hlQYlj6OXJQWvOIS0f-pmCZVbvV7xlsap8,31472
2
- COPYING,sha256=fpJLxZS_kHr_659xkpmqEtqHeZp6lQR9CmKCwnYbsmE,1089
3
1
  twc/__init__.py,sha256=NwPAMNw3NuHdWGQvWS9_lromVF6VM194oVOipojfJns,113
4
- twc/__main__.py,sha256=ADHceaQUzgLmvhYHvb5O8urdJWj5IcEHLpTQkSExiD8,2468
5
- twc/__version__.py,sha256=vyBciXWNGbjPeCy9tHWEKQFwm1VPc6m1_8-OvqI6EeA,443
2
+ twc/__main__.py,sha256=lgyLdXuTDWQXmXkpGCxStOUBqYGQZEUdlj7IrhJeTdQ,2511
3
+ twc/__version__.py,sha256=zXE2R-8ZZjvgaJ71H8sKvAs85Vp-dItdaQ725W2AJJw,443
6
4
  twc/api/__init__.py,sha256=SXew0Fe51M7nRBNQaaLRH4NjnRHkQUn7J26OCkQsftA,128
7
5
  twc/api/base.py,sha256=QRefnIgmlbz8n37GLBKeAK1AtzkcNo1IFjZgHDDECJ4,7912
8
- twc/api/client.py,sha256=ovP8Dz1A8SjTisIL0Vr2scCRYN_SJg9fayA1f6SQix8,66773
6
+ twc/api/client.py,sha256=AwnbD78CWv1gSVs4lYBDJ8s0-RRPV2SYOjaAaZlNREg,68129
9
7
  twc/api/exceptions.py,sha256=6nMU20f-Xe7EbH2jpfmSGMW69Rwfhh_ph9ygz37G0XY,2416
10
8
  twc/api/types.py,sha256=uagnD3TPpoJFYUFK6HfHQPlEXs2GLxuJdjhNIbraXwM,5374
11
9
  twc/apiwrap.py,sha256=hKrg_o6rLfY32SEnWMc1BSXHnSAh7TGar1JQ90YnG5M,2970
12
- twc/commands/__init__.py,sha256=a-6fHQQwOj--Z7uBZGZL3z1rvJiOGUMQMRET1UknIYo,430
10
+ twc/commands/__init__.py,sha256=8yVSysjYuacDTyrXmkDGICktCF1m1o33BNI5Rtszw5M,453
13
11
  twc/commands/account.py,sha256=6q9ri02oFbUUZuqNVXO-uHOX45B4ELJlPjyfVaEL5Qw,5960
12
+ twc/commands/apps.py,sha256=qThOfuITdb787-NgrW-aS8sgrkHiKVo7ywe0SprcQA8,8811
14
13
  twc/commands/balancer.py,sha256=SygXDpJpjybsfxfCN02-WsWyjLS-77qEGuYZoxsfmA4,28382
15
14
  twc/commands/common.py,sha256=Wph8cVogUNNvc456SQrASb7mv7G88I8ETwHgISVjLQQ,8282
16
15
  twc/commands/config.py,sha256=xHNEZVmM60c9dApLfNsj78sXZk6VsFwPdVIHO9r8xks,8802
@@ -29,8 +28,8 @@ twc/fmt.py,sha256=nbuYZ8nVabYDwCmZqnL3-c6Tmri4B-R_sTCkG6sdfeI,7171
29
28
  twc/typerx.py,sha256=AZ6BgTQvlrZYfKVYd9YqRNQnAR2XuyqImz4rf6di6f4,6737
30
29
  twc/utils.py,sha256=uWizyUC4dHLwtk50q4Sub3zOvnVESfHKBbXYwk5t71w,651
31
30
  twc/vars.py,sha256=ljW52q6XwsbQqOBPGhs5rbZ5ZqVvQXdKqUt8mLhXRts,830
32
- twc_cli-2.12.0.dist-info/COPYING,sha256=fpJLxZS_kHr_659xkpmqEtqHeZp6lQR9CmKCwnYbsmE,1089
33
- twc_cli-2.12.0.dist-info/METADATA,sha256=q-YUNB0fPiGn1yZi7SzoKdMeuIp2lr2yQR0r4WBd2Io,2653
34
- twc_cli-2.12.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
35
- twc_cli-2.12.0.dist-info/entry_points.txt,sha256=tmTaVRhm8BkNrXC_9XJMum7O9wFVOvkXcBetxmahWvE,40
36
- twc_cli-2.12.0.dist-info/RECORD,,
31
+ twc_cli-2.13.0.dist-info/COPYING,sha256=fpJLxZS_kHr_659xkpmqEtqHeZp6lQR9CmKCwnYbsmE,1089
32
+ twc_cli-2.13.0.dist-info/METADATA,sha256=xzLTYexS4xyG2WCRVCrVW_iKzWYO8cIyWm8nUYRL0Lo,2665
33
+ twc_cli-2.13.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
34
+ twc_cli-2.13.0.dist-info/entry_points.txt,sha256=tmTaVRhm8BkNrXC_9XJMum7O9wFVOvkXcBetxmahWvE,40
35
+ twc_cli-2.13.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.1
2
+ Generator: poetry-core 2.1.3
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
CHANGELOG.md DELETED
@@ -1,369 +0,0 @@
1
- # Релизы Timeweb Cloud CLI
2
-
3
- В этом файле описаны все значимые изменения в Timeweb Cloud CLI. В выпусках мы придерживается правил [семантического версионирования](https://semver.org/lang/ru/).
4
-
5
- # Версия 2.12.0 (2025.xx.xx)
6
-
7
- ## Добавлено
8
-
9
- - Добавлены опции `--max-connections`, `--connect-timeout`, `--client-timeout`, `--server-timeout` в команды `twc balancer create`, `twc balancer set`.
10
- - В регионе `kz-1` для облачных серверов теперь доступен IPv6.
11
-
12
- ## Изменено
13
-
14
- - Стандартный ендпоинт объектного хранилища изменён с `s3.timeweb.cloud` на `s3.twcstorage.ru`.
15
-
16
- # Версия 2.11.0 (2025.04.01)
17
-
18
- ## Добавлено
19
-
20
- - Добавлены новые опции к команде `twc balancer create`:
21
- - для настройки сети: `--network-id`, `--public-ip`, `--no-public-ip`, `--private-ip`;
22
- - для установки TLS: `--cert-type`, `--cert-domain`, `--cert-data`, `--cert-key`;
23
- - выбор локации и пресета: `--region`, `--availability-zone`, `--preset-id`;
24
- - дополнительные: `--desc` (описание балансировщика нагрузки).
25
- - Добавлена новая команда для просмотра списка доступных пресетов балансировщиков нагрузки — `twc balancer list-presets`.
26
-
27
- ## Изменено
28
-
29
- - Опция `--network` команды `twc balancer create` объявлена устаревшей и скрыта. Вместо неё используйте `--network-id`.
30
-
31
- ## Исправлено
32
-
33
- - Исправлена ошибка в команде `twc server create` возникавшая при передаче парамера `--project-id`.
34
-
35
- # Версия 2.10.1 (2025.03.25)
36
-
37
- ## Исправлено
38
-
39
- - Исправлена ошибка получения публичного IP при создании кластера СУБД.
40
-
41
- # Версия 2.10.0 (2025.03.24)
42
-
43
- ## Добавлено
44
-
45
- - Добавлена поддержка региона `de-1` (зона `fra-1`) для облачных серверов.
46
- - Добавлены новые опции к команде `twc database create`:
47
- - для создания пользователя СУБД: `--user-login`, `--user-password`, `--user-host`, `--user-privileges`, `--user-desc`;
48
- - для создания первой базы данных: `--db-name`, `--db-desc`;
49
- - для настроек сети в класетере СУБД: `--network-id`, `--private-ip`, `--public-ip`, `--no-public-ip`;
50
- - для настройки автоматических бэкапов кластера: `--enable-backups`, `--backup-keep`, `--backup-start-date`, `--backup-interval`, `--backup-day-of-week`.
51
- - Добавлена новая команда `twc database list-types` для вывода доступных к созданию управляемых баз данных.
52
- - Добавлена новая команда `twc database backup schedule` позволяющая настроить параметры автоматического резервного копирования кластера.
53
- - Добавлены новые команды для управления пользователями в кластерах СУБД: `twc database user list`, `twc database user get`, `twc database user create`, `twc database user remove`.
54
- - Добавлены новые команды для управления базами данных в кластерах СУБД: `twc database instance list`, `twc database instance create`, `twc database instance remove`.
55
-
56
- ## Изменено
57
-
58
- - Опция `--network` команды `twc server create` объявлена устаревшей и скрыта, добавлена эквивалентная опция `--network-id`.
59
- - Опции `--login` и `--password` команды `twc database create` объявлены устаревшими и скрыты, вместо них теперь нужно использовать `--user-login` и `--user-password`.
60
-
61
- # Версия 2.9.2 (2025.03.10)
62
-
63
- ## Исправлено
64
-
65
- - Исправлена ошибка из-за которой на Windows не устанавливались аттрибуты накнфигурационный файл.
66
-
67
- # Версия 2.9.1 (2025.03.07)
68
-
69
- ## Исправлено
70
-
71
- - Исправлена ошибка в реализации опции `--gpu` в `twc server create`.
72
-
73
- # Версия 2.9.0 (2025.03.06)
74
-
75
- ## Добавлено
76
-
77
- - Поддержка заказа серверов с GPU
78
- - Поддержка заказа серверов линейки Dedicated CPU
79
- - Добавлены новые опции для команды `twc server create`: `--disable-ssh-password-auth`, `--gpus`, `--type`, `--configurator-id`.
80
-
81
- ## Изменено
82
-
83
- - Мелкие улучшения в коде.
84
-
85
- # Версия 2.8.0 (2025.02.13)
86
-
87
- ## Добавлено
88
-
89
- - Поддержка SRV-записей для доменов.
90
- - Теперь можно задавать TTL для DNS-записей.
91
-
92
- # Версия 2.7.0 (2024.11.02)
93
-
94
- ## Добавлено
95
-
96
- - Добавлена новая команда `twc whoami`, которая показывает логин аккаунта, в котором в текущий момент авторизован CLI.
97
-
98
- ## Изменено
99
-
100
- - Команда `twc account status` теперь также отображает логин аккаунта.
101
-
102
- ## Исправлено
103
-
104
- - Устранено падение программы при листинге образов (`twc image list`) и при создании сервера из образа.
105
- - Исправлена ошибка при создании сервера с приватной сетью в зоне доступности SPB-3.
106
- - Исправлены ошибки в командах `twc storage subdomain gencert` и `twc storage subdomain remove`, возникшие из-за нарушения обратной совместимости эндпоинтов API.
107
- - Исправлена ошибка валидации приватного адреса при созаднии сервера — ошибочно запрещалось использовать 4-й по порядку адрес в подсети.
108
- - Исправлена ошибка разбора JSON при выводе списка ресурсов в проекте.
109
- - Исправлены ошибки добавления TXT записи для домена в команде `twc domain record add`.
110
- - Исправлена ошибка парсинка субдомена в команде `twc domain record add`.
111
- - Исправлены ошибки обновления DNS-записей на поддоменах.
112
-
113
- # Версия 2.6.0 (2024.08.14)
114
-
115
- ## Добавлено
116
-
117
- - В команды и API-клиент для управления облачным файрволом добавлена поддержка протоколов TCP6, UDP6, ICMP6 и настройка стандартной политики (DROP или ACCEPT).
118
- - Добавлены новые команды: `twc firewall group get`, `twc firewall group dump` и `twc firewall group restore`.
119
-
120
- ## Изменено
121
-
122
- - Улучшена валидация параметров и подстановка значений по умолчанию в командах `twc firewall`.
123
- - Команда `twc firewall rule remove` теперь может принимать список UUID правил через пробел.
124
- - В команде `twc firewall show` аргумент `all` стал необязательным.
125
- - Зависимость `typer` заменена на `typer-slim`.
126
-
127
- ## Исправлено
128
-
129
- - Исправлено определение ендпоинта объектного хранилища при вызове команды `twc storage genconfig`.
130
-
131
- # Версия 2.5.0 (2024.07.24)
132
-
133
- ## Добавлено
134
-
135
- - Добавлена поддержка зон доступности. Добавлен параметр конифгурации `availability_zone` (`TWC_AVAILABILITY_ZONE`).
136
- - Добавлены новые опции для команды `twc server create`: `--availability-zone`, `--user-data`, `--public-ip`, `--no-public-ip`, `--private-ip`.
137
- - Добавлена новая команда `twc ip` вместо устаревшей `twc server ip`. Поскольку IP-адреса сейчас являются отдельными ресурсами, управление ими вынесено из `twc server`.
138
-
139
- ## Изменено
140
-
141
- - Минимальная поддерживаемая версия интерпретатора Python повышена до 3.8.
142
- - Обновлены версии зависимостей.
143
- - Обновлены команды и методы API-клиента для работы VPC.
144
- - Удалён параметр `log_response` принимаемый как значение переменной окружения `TWC_LOG`, теперь тело ответа API логируется всегда.
145
- - Команда `twc server ip` объявлена устаревшей (deprecated) и будет уделена в следующем мажорном релизе. Вместо неё используйте команду `twc ip`.
146
- - Другие мелкие обновления CLI без нарушения обратной совместимости.
147
-
148
- ## Исправлено
149
-
150
- - Исправлен метод удаления кластеров Kubernetes во встроенном API-клиенте.
151
- - Исправлена ошибка разбора JSON при получении объекта сервера без IP.
152
-
153
- # Версия 2.4.1 (2023.08.30)
154
-
155
- ## Исправлено
156
-
157
- - Исправлена ошибка парсинга доменного имени в команде `twc domain record add`.
158
-
159
- # Версия 2.4.0 (2023.08.21)
160
-
161
- ## Добавлено
162
-
163
- - Добавлена команда `twc vpc` (`twc network`) для работы с сервисом VPC. Доступны все предоставляемые API операции с приватными сетями.
164
- - В команды для создания облачных серверов и балансировщиков нагрузки добавлена опция `--network`, с помощью которой можно задать ID приватной сети.
165
- - Добавлена команда `twc domain` для управления доменными именами (добавление, удаление) и DNS-записями. Спасибо @ranmasootome за вклад!
166
- - Добавлена команда `twc firewall` для управления облачным файрволом.
167
- - Добавлена команда `twc config profiles` для вывода списка профилей из конфигурационного файла.
168
-
169
- ## Изменено
170
-
171
- - Удалена опция `--with-deleted` у команды `twc image list`.
172
- - Изменён вывод команд `twc image list` и `twc image get`.
173
- - Опция `--local-network` (`twc server create`) объявлена устаревшей и скрыта. Используйте `--network` вместо неё.
174
- - Вызов команды без аргументов приведёт к показу текста справки вместо ошибки.
175
- - В дополнение к `--help` добавлена опция `-h` для вызова справки.
176
- - Мелкие улучшения кода.
177
-
178
- ## Исправлено
179
-
180
- - Исправлена ошибка в API-клиенте в методе удаления балансировщиков нагрузки.
181
- - Другие мелкие исправления.
182
-
183
- # Версия 2.3.0 (2023.06.28)
184
-
185
- ## Добавлено
186
-
187
- - Добавлено управление кластерами Kubernetes — команда `twc cluster`, алиасы: `clusters`, `kubernetes`, `k8s`.
188
-
189
- ## Изменено
190
-
191
- - Улучшена обработка ошибок HTTP.
192
- - Улучшена валидания пользозвательского ввода.
193
-
194
- ## Исправлено
195
-
196
- - Изменён порядок аргументов у команды `twc ssh-key add`.
197
- - Исправления мелких ошибок.
198
-
199
- # Версия 2.2.0 (2023.06.07)
200
-
201
- ## Добавлено
202
-
203
- - Добавлена команда `balancer` для управления балансировщиками нагрузки.
204
-
205
- # Версия 2.1.1 (2023.06.07)
206
-
207
- ## Исправлено
208
-
209
- - Исправлена ошибка приводившая к падению программы на Python 3.7 и 3.8.
210
-
211
- # Версия 2.1.0 (2023.06.06)
212
-
213
- ## Добавлено
214
-
215
- - Добавлена поддержка создания облачных серверов с произвольной конфигурацией во всех доступных локациях. Локацию можно указать через опцию `--region` команды `twc server create`. Для выбора региона по умолчанию для всех новых серверов можно задать переменную окружения `TWC_REGION` или параметр конфигурации `region`.
216
- - В команду `twc server create` добавлена опция `--nat-mode`. Теперь можно определить режим работы NAT при создании сервера. При этом автоматически применяется флаг `--local-network`.
217
-
218
- ## Исправлено
219
-
220
- - Команда `twc server list` не принимала значение `--limit` и показывала не более 100 серверов.
221
- - Исправлена ошибка при создании сервера с произвольной конфигурацией.
222
- - Исправлена ошибка в API-клиенте в методе получения списка инстансов DBaaS.
223
-
224
- # Версия 2.0.2 (2023.05.24)
225
-
226
- ## Изменено
227
-
228
- - Обновлена зависимость `requests` для закрытия уязвимости CVE-2023-32681.
229
-
230
- # Версия 2.0.1 (2023.05.19)
231
-
232
- ## Добавлено
233
-
234
- - Теперь собираем программу также в формате zipapp (`.pyz`). Пакет zipapp это исполняемый ZIP-архив с приложением внутри. Он не требует установки, всё что нужно для запуска это интерпретатор Python 3.7 или выше, все зависимости уже добавлены в пакет.
235
-
236
- ## Исправлено
237
-
238
- - Исправлена ошибка типов в модуле `twc.api.exceptions`, которая приводила к краху на Python ниже версии 3.10.
239
-
240
- # Версия 2.0.0 (2023.05.03)
241
-
242
- Это обновление значительно повышает качество кода, унифицирует интерфейсы и упрощает дальнейшую разработку. Проведён масштабный рефакторинг всей кодовой базы (~5,5 тыс строк кода на момент начала работы).
243
-
244
- Основные изменения в этом выпуске касаются парсера аргументов и API-клиента.
245
-
246
- > ❗**ВАЖНО**
247
- > Версия 2.0.0 содержит обратно несовместимые изменения. Обязательно прочтите их список прежде чем обновляться.
248
-
249
- ## Добавлено
250
-
251
- - Добавлена команда `twc config unset` обратная по смыслу команде `twc config set`, она позволяет удалить из конфигурации ранее заданный параметр.
252
- - Для команды `twc config file` добавлен флаг `--locate`. Если он передан, то в файловом менеджере откроется директория с конфигом.
253
- - Теперь приложение найдёт конфигурационный файл, если он называется `.twcrc.toml`, а не только `.twcrc`.
254
- - Добавлена команда `twc server backup schedule` для управления расписанием и настройками автоматических бэкапов дисков. Это клон удалённой команды `twc server disk auto-backup`.
255
- - В API-клиент добавлены методы Проектов для добавления ресурсов каждого типа. Ранее был реализован только универсальный метод `move_resource_to_project()`.
256
- - Добавлен алиас `lsw` для субкоманды `twc server list-software`.
257
- - В команды `twc server dash` и `twc server vnc` добавлена опция `--print` для печати ссылки вместо перехода по ней в веб-браузере.
258
- - Улучшено логирование. HTTP-запросы и ответы теперь более удобочитаемы. Добавлена переменная окружения `TWC_LOG` для настройки параметров логгера. Сейчас доступен только один параметр — `log_response`. По умолчанию тело ответа не логируется чтобы не захламлять лог, но этой опцией логирование можно включить.
259
-
260
- ## Обратно совместимые изменения
261
-
262
- - Библиотека [Click](https://click.palletsprojects.com/) заменена на библиотеку [Typer](https://typer.tiangolo.com/). Благодаря этому переходу:
263
- - Заработал вызов команды через интерпретатор. То есть теперь можно вызывать програму так: `python -m twc version`. С Click это не работало, хоть и ожидалось.
264
- - Теперь глобальные опции `--verbose`, `--config`, `--profile` можно писать как в начале команд, так и в конце. Ранее были проблемы с передачей контекста субкомандам, теперь они решены.
265
- - Появилась поддержка автодополнения команд для оболочки PowerShell.
266
- - В Click пришлось писать сразу два разных костыля для поддержки алиасов команд. Сейчас есть элегантное решение под Typer :).
267
- - Удалён костыль для вызова группы команд (без него нельзя было вызвать `twc config`). Эта задача решается Typer нативно.
268
- - Удалён костыль для создания взаимоисключающих опций Click, вместо этого теперь используется обычный оператор if.
269
- - Изменены описания некоторых параметров CLI.
270
- - Улучшены все тексты ошибок, теперь они более подробные и более явно указывают на проблему.
271
- - Глобально задействован модуль typing. Изменены аннотации типов (type-hints) для всех функций, классов и их методов. Теперь они соответствуют документации API и точнее отражают суть.
272
-
273
- ## ❗Обратно несовместимые изменения в CLI
274
-
275
- - Изменён ситаксис команды `twc server set-boot-mode`, новый синтаксис: `set-boot-mode SERVER_ID... MODE`.
276
- - Изменён ситаксис команды `twc server set-nat-mode`, новый синтаксис: `set-nat-mode SERVER_ID... MODE`.
277
- - Команда `twc server set-property` переименована в `twc server set`.
278
- - Команда `twc server logs` переименована в `twc server history`.
279
- - Изменён синтаксис команды `twc server ip add`. Новый синтаксис: `add [OPTIONS] SERVER_ID`.
280
- - Команда `twc server ip set-ptr` заменена на `twc server ip set`, новый синтаксис: `set --ptr POINTER IP_ADDRESS`.
281
- - Изменён синтаксис команды `twc server disk add`. Новый синтаксис: `add --size SIZE SERVER_ID`.
282
- - Удалена команда `twc server disk auto-backup`. Вместо неё используйте `twc server backup schedule`, синтаксис и опции команды никак не отличаются от старых.
283
- - Команда `twc server backup set-property` переименована в `twc server backup set`.
284
- - Изменён синтаксис команды `twc ssh-key add`, новый синтаксис: `add SSH_KEY_ID... SERVER_ID`.
285
- - Команда `twc image set-property` переименована в `twc image set`.
286
- - Команда `twc project set-property` переименована в `twc project set`.
287
- - Изменём синтаксис команды `twc project resource move`, новый синтаксис: `move --[resource-type] [resource_id] PROJECT_ID`. Для каждого типа ресурса добавлена своя опция, например `--bucket`, `--server` и т.д.
288
-
289
- ## ❗Обратно несовместимые изменения в API-клиенте
290
-
291
- - Переименованы методы для работы с публичными IP-адресами серверов: `get_ips_by_server_id()` -> `get_ips()`, `add_ip_addr()` -> `add_ip()`, `delete_ip_addr()` -> `delete_ip()`, `update_ip_addr()` -> `update_ip()`. Также в этих функциях изменено имя аргумента `ip_addr` на `ip`.
292
- - Удалены все старые исключения, полный список и код новых исключений в файле [exceptions.py](../../twc/api/exceptions.py).
293
- - Теперь в случае ошибки API генерируется исключение класса `TimewebCloudException` в котором содержатся данные запроса и ответа, а также отдельно ключи из JSON, отправляемые API в случае ошибок. Итого получается такой набор: `request (<PreparedRequest>)`, `response (<Response>)`, `status_code`, `error_code`, `message`, `response_id`.
294
- - HTTP-запросы теперь отправляются через специальную обёртку — `TimewebCloud._request()`. Это позволило сделать универсальный обработчик исключений и упростить работу с запросами и логирование.
295
-
296
- ## Исправлено
297
-
298
- - Программа больше не падает, если у облачного сервера нет публичных IP-адресов.
299
- - В API-клиенте не было обработки кода подтверждения при удалении облачного сервера.
300
- - При вызове метода для получения списка выделенных серверов аккаунта выводился список баз данных.
301
- - Исправлены ошибки валидации данных при создании сервера, которые проявлялись в редких сценариях.
302
-
303
- # Версия 1.3.1 (2023.04.13)
304
-
305
- ## Изменено
306
-
307
- - В команде `twc s3 mb` опция `--preset-id` теперь необязательная. Будет выбран минимальный пресет.
308
-
309
- ## Исправлено
310
-
311
- - Исправлена ошибка при попытке создать дополнительный профиль через `twc config`.
312
-
313
- # Версия 1.3.0 (2023.04.13)
314
-
315
- ## Добавлено
316
-
317
- - Добавлена команда `twc storage` (алиас `twc s3`) для управления бакетами в объектном хранилище Timeweb Cloud. Доступны базовые операции с бакетами. Также реализованы субкоманды для работы с доменами и пользователями хранилища. Обратите внимание, что в twc не планируется добавлять реализацию S3-клиента, пользуйтесь любым совместимым клиентом, например, [s3cmd](https://s3tools.org/s3cmd) или [rclone](https://rclone.org/), команда `twc s3 genconfig` позволит сгенерировать конфигурационный файл для этих утилит (см. [документацию](docs/ru/README.md#получение-конфигурации-для-s3-клиентов)).
318
- - Добавлены субкоманды для `twc config`. Теперь можно: сделать дамп настроек CLI (`twc config dump`), изменять настройки без ручного редактирования файла (`twc config set`), получить путь до файла (`twc config file`), открыть файл в редакторе по умолчанию (`twc config edit`).
319
-
320
- ## Изменено
321
-
322
- - Изменены тексты ошибок при работе с конфигурационным файлом, теперь они более наглядные и явно указывают на проблему.
323
- - Изменено поведение команды `twc config`. Теперь если уже иммется конфигурационный файл команда предложит добавить новый профиль или отредактировать существующий.
324
-
325
- # Версия 1.2.0 (2023.04.03)
326
-
327
- ## Добавлено
328
-
329
- - Добавлена команда `twc database` (алиас `twc db`). Теперь можно:
330
- - создавать и удалять управляемые базы данных;
331
- - изменять параметры базы данных;
332
- - работать с бэкапами баз данных.
333
- - Реализована возможность работы с токенами, которые требуют подтверждения удаления сервисов через проверочные коды.
334
- - Добавлены алиасы для основных команд, набирать команды стало ещё быстрее. Например, `twc server list` можно сократить до `twc s ls`. Смотрите список алиасов во встроенной справке `--help`.
335
- - Добавлены команды `twc server dash` и `twc server vnc`. С их помощью можно быстро перейти в дашборд и веб-консоль сервера соответсвенно. Ссылки откроются в браузере по умолчанию.
336
-
337
- ## Изменено
338
-
339
- - Поменялся вывод команд `twc server list-presets` и `twc server backup list`, скрыты малоинформативные колонки.
340
- - Мелкие улучшения в коде.
341
-
342
- # Версия 1.1.0 (2023.03.24)
343
-
344
- ## Добавлено
345
-
346
- - Добавлена команда `twc image` для управления образами дисков. Можно создавать образы из существующих дисков, загрузить свой образ по ссылке, удалять образы и выполнять другие базовые операции.
347
- - Добавлена возможность использовать UUID пользовательского образа при создании нового сервера (`twc server create`) и при переустановке сервера (`twc server reinstall`).
348
- - Добавлена команда `twc project` для управления проектами и ресурсами в них: создание, удаление, редактирование проектов, перемещение ресурсов между проектами.
349
- - В команду `twc server create` добавлена опция `--project-id`, которая позволяет переместить только что созданный сервер в указанный проект. Задать проект можно также через переменную окружения `TWC_PROJECT` и конфигурационный файл.
350
- - В команду `twc server reinstall` добавлена опция `--add-ssh-key`. Теперь опционально после переустановки на сервер будут добавлены SSH-ключи, которые были на нём ранее.
351
- - Добавлена команда `twc server disk list-all`. Она покажет список всех дисков со всех серверов.
352
- - Опция `--filter` в командах где она есть теперь поддерживает поиск по полям, содержащим значения в мегабайтах и гагибайтах.
353
-
354
- ## Изменено
355
-
356
- - Команда `twc server reinstall` теперь не требует `--image` как обязательный аргумент. Если опция не задана будет выбрана ОС, которая уже установлена на сервере.
357
- - В команде `twc server clone` теперь используется новый метод клонирования сервера. В ответ команда вернёт информацию о клоне сервера.
358
- - В командах `twc server list` и `twc server logs` увеличен стандартный `--limit` до 500.
359
- - В локации `pl-1` (Польша, Гданьск) теперь разрешено добавлять IPv6-адреса.
360
- - В выводе `twc server list-presets` RAM и объём системного диска в табличном виде теперь отображаются в гигабайтах.
361
-
362
- ## Исправлено
363
-
364
- - В выводе команды `twc server list-os-images` теперь правильно отображаем поле `REQUIREMENTS`.
365
- - Исправлена ошибка из-за которой опция `--filter` не фильтровала по ключам, содержащим знак подчёркивания.
366
-
367
- # Версия 1.0.0 (2023.02.27)
368
-
369
- Первый релиз.
@@ -1,22 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright © 2023 TWC Developers
4
-
5
-
6
- Permission is hereby granted, free of charge, to any person obtaining a copy
7
- of this software and associated documentation files (the “Software”), to deal
8
- in the Software without restriction, including without limitation the rights
9
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- copies of the Software, and to permit persons to whom the Software is
11
- furnished to do so, subject to the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be included in
14
- all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- THE SOFTWARE.
File without changes