Coverage for src/fastapi_cloud_cli/commands/deploy/command.py: 100%
174 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-11-09 00:25 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-11-09 00:25 +0000
1import logging 2udvdwdxdydzdAd
2import tempfile 2udvdwdxdydzdAd
3from pathlib import Path 2udvdwdxdydzdAd
4from typing import Annotated, Any, cast 2udvdwdxdydzdAd
6import typer 2udvdwdxdydzdAd
7from pydantic import BaseModel 2udvdwdxdydzdAd
9from fastapi_cloud_cli._app import app, cloud_app 2udvdwdxdydzdAd
10from fastapi_cloud_cli.api import APIClient, DeploymentStatus 2udvdwdxdydzdAd
11from fastapi_cloud_cli.commands.deploy.archive import _get_large_files, archive 2udvdwdxdydzdAd
12from fastapi_cloud_cli.commands.deploy.cloud import ( 2udvdwdxdydzdAd
13 AppResponse,
14 ArchiveTooLargeError,
15 CreateDeploymentResponse,
16 _create_deployment,
17 _get_app,
18)
19from fastapi_cloud_cli.commands.deploy.configure import _configure_app 2udvdwdxdydzdAd
20from fastapi_cloud_cli.commands.deploy.upload import _cancel_upload, _upload_deployment 2udvdwdxdydzdAd
21from fastapi_cloud_cli.commands.deploy.wait import _wait_for_deployment 2udvdwdxdydzdAd
22from fastapi_cloud_cli.commands.login import _interactive_login 2udvdwdxdydzdAd
23from fastapi_cloud_cli.utils.apps import get_app_config 2udvdwdxdydzdAd
24from fastapi_cloud_cli.utils.auth import Identity 2udvdwdxdydzdAd
25from fastapi_cloud_cli.utils.cli import FastAPIRichToolkit, get_rich_toolkit 2udvdwdxdydzdAd
26from fastapi_cloud_cli.utils.errors import ErrorCode 2udvdwdxdydzdAd
27from fastapi_cloud_cli.utils.execution import JsonOutputOption, is_ci_enabled 2udvdwdxdydzdAd
29logger = logging.getLogger(__name__) 2udvdwdxdydzdAd
32class DeployOutput(BaseModel): 2udvdwdxdydzdAd
33 deployment_id: str 2udvdwdxdydzdAd
34 app_id: str 2udvdwdxdydzdAd
35 slug: str 2udvdwdxdydzdAd
36 status: DeploymentStatus 2udvdwdxdydzdAd
37 dashboard_url: str 2udvdwdxdydzdAd
38 url: str 2udvdwdxdydzdAd
41def _get_deploy_output(deployment: CreateDeploymentResponse) -> DeployOutput: 2udvdwdxdydzdAd
42 return DeployOutput( 2a 4 ebc ' lbd ( mbe ) nbb 5 fbf * obg + pb
43 deployment_id=deployment.id,
44 app_id=deployment.app_id,
45 slug=deployment.slug,
46 status=deployment.status,
47 dashboard_url=deployment.dashboard_url,
48 url=deployment.url,
49 )
52def _get_large_file_warnings( 2udvdwdxdydzdAd
53 large_files: list[tuple[Path, int]],
54 *,
55 threshold_mb: int,
56) -> list[dict[str, Any]]:
57 if not large_files: 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
58 return [] 2YbJ ZbK qbrbsb6 nd~c4 tbad]ccb0b1b2bebL 7 8 ubvbwbxbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, oddd' 6bed_cgb6c7c8clbR - . 7b8b9b!b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdfd( :bgd`chb#c$c%cmbU ; = ;b=b?b@b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qdhd) dcid{cib)c*c+cnbX [ ] ecfcgchcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdbd5 Kbcd^cdbtcucvcfbO # $ LbMbNbObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdjd* zckd|cjb.c/c:cob0 ` { AcBcCcDcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdld+ Qcmd}ckb?c@c[cpb3 ~ abRcScTcUcVcWcXcYcZc0cbb1c2c3c
60 count = len(large_files) 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
61 message = ( 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
62 f"1 uploaded file is larger than {threshold_mb} MB."
63 if count == 1
64 else f"{count} uploaded files are larger than {threshold_mb} MB."
65 )
67 return [ 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
68 {
69 "code": "large_files",
70 "message": message,
71 "files": [
72 {"path": path.as_posix(), "size_bytes": size}
73 for path, size in large_files
74 ],
75 }
76 ]
79def _render_app_id_mismatch( 2udvdwdxdydzdAd
80 toolkit: FastAPIRichToolkit, *, code: ErrorCode, message: str, hint: str
81) -> None:
82 toolkit.print_error(message) 2dfefffgfhfifjf
83 toolkit.print_line() 2dfefffgfhfifjf
84 toolkit.print_hint(hint) 2dfefffgfhfifjf
87def _render_app_not_found( 2udvdwdxdydzdAd
88 toolkit: FastAPIRichToolkit, *, code: ErrorCode, message: str, hint: str
89) -> None:
90 toolkit.print_line() 23dPd4dQd5dRd6dSd7dTd8dUd9dVd
93def _render_linked_app_not_found( 2udvdwdxdydzdAd
94 toolkit: FastAPIRichToolkit, *, code: ErrorCode, message: str, hint: str
95) -> None:
96 _render_app_not_found(toolkit, code=code, message=message, hint=hint) 2PdQdRdSdTdUdVd
97 toolkit.print_hint( 2PdQdRdSdTdUdVd
98 "If you deleted this app, you can run [bold]fastapi cloud unlink[/] to unlink the local configuration."
99 )
102def _confirm_home_directory_deploy( 2udvdwdxdydzdAd
103 toolkit: FastAPIRichToolkit, *, json_output: bool
104) -> None:
105 if json_output or is_ci_enabled(): 2kf6 Tflf, Ufmf: Vfnf@ Wfof! Xfpf_ Yfqf} Zf
106 toolkit.fail( 2TfUfVfWfXfYfZf
107 "invalid_input",
108 "Refusing to deploy your home directory.",
109 hint="Pass the directory of your app, or use --force.",
110 )
112 if not toolkit.confirm( 2kf6 lf, mf: nf@ of! pf_ qf}
113 "You are deploying your home directory. Do you want to continue?",
114 default=False,
115 emoji="🚨",
116 ):
117 toolkit.print_line() 2kflfmfnfofpfqf
118 toolkit.print("Deployment cancelled.") 2kflfmfnfofpfqf
119 raise typer.Exit(0) 2kflfmfnfofpfqf
121 toolkit.print_line() 16,:@!_}
124def _check_app_directory( 2udvdwdxdydzdAd
125 toolkit: FastAPIRichToolkit, *, app: AppResponse, path_to_deploy: Path
126) -> None:
127 """Stop before uploading when the app's directory isn't in the upload."""
128 if app.directory is None or (path_to_deploy / app.directory).is_dir(): 2YbJ ZbK qbrbsb6 Bdnda ~c4 Cdtbad]ccb0b1b2bL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, Ddodc dd' Ed6bed_cgb6c7c8cR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: Fdpdd fd( Gd:bgd`chb#c$c%cU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ Hdqde hd) Iddcid{cib)c*c+cX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! Jdrdb bd5 KdKbcd^cdbtcucvcO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ Ldsdf jd* Mdzckd|cjb.c/c:c0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} Ndtdg ld+ OdQcmd}ckb?c@c[c3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
129 return 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8cR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:c0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[c3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
131 if app.github_repository: 2BdCdDdEdFdGdHdIdJdKdLdMdNdOd
132 hint = ( 2CdEdGdIdKdMdOd
133 f"This app is connected to {app.github_repository} and builds from "
134 f"`{app.directory}` in that repository. Run "
135 f"`fastapi deploy --app-id {app.id}` from the repository root, or use --force."
136 )
137 else:
138 hint = ( 2BdDdFdHdJdLdNd
139 "Deploy from the folder that contains it, update the app directory "
140 "with `fastapi cloud apps update --directory`, or use --force."
141 )
143 toolkit.fail( 2BdCdDdEdFdGdHdIdJdKdLdMdNdOd
144 "invalid_input",
145 f"The app directory `{app.directory}` doesn't exist in {path_to_deploy}.",
146 hint=hint,
147 )
150@app.command() 2udvdwdxdydzdAd
151@cloud_app.command() 2udvdwdxdydzdAd
152def deploy( 2udvd.fwdxd/fydzdAd:f
153 path: Annotated[
154 Path | None,
155 typer.Argument(
156 help="Path to the directory to deploy (defaults to current directory)"
157 ),
158 ] = None,
159 skip_wait: Annotated[
160 bool, typer.Option("--no-wait", help="Skip waiting for deployment status")
161 ] = False,
162 provided_app_id: Annotated[
163 str | None,
164 typer.Option(
165 "--app-id",
166 help="Application ID to deploy to",
167 envvar="FASTAPI_CLOUD_APP_ID",
168 ),
169 ] = None,
170 large_file_threshold: Annotated[
171 int,
172 typer.Option(
173 help="File size threshold in MB for warning about large files",
174 min=1,
175 envvar="FASTAPI_CLOUD_LARGE_FILE_THRESHOLD",
176 ),
177 ] = 10,
178 json_output: JsonOutputOption = False,
179 force: Annotated[
180 bool,
181 typer.Option(
182 "--force",
183 help="Deploy even if the app directory is missing or the path is your home directory",
184 ),
185 ] = False,
186) -> Any:
187 """
188 Deploy a [bold]FastAPI[/bold] app to FastAPI Cloud.
189 """
190 logger.debug("Deploy command started") 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c
191 logger.debug( 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c
192 "Deploy path: %s, skip_wait: %s, app_id: %s", path, skip_wait, provided_app_id
193 )
195 identity = Identity() 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c
196 use_deploy_token = identity.has_deploy_token() 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c
197 has_auth = use_deploy_token or identity.is_logged_in() 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c
199 logger.debug( 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c
200 "Authentication mode: %s", "deploy token" if use_deploy_token else "user token"
201 )
203 with get_rich_toolkit(json_output=json_output) as toolkit: 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c
204 if not has_auth: 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c
205 logger.debug("User not logged in, starting login") 2Ff7f'fMfWdGf8f(fNfXdHf9f)fOfYdIf!f*fPfZdJf#f+fQf0dKf$f,fRf1dLf%f-fSf2d
207 if is_ci_enabled(): 2Ff7f'fMfWdGf8f(fNfXdHf9f)fOfYdIf!f*fPfZdJf#f+fQf0dKf$f,fRf1dLf%f-fSf2d
208 toolkit.fail( 2'f(f)f*f+f,f-f
209 "not_logged_in",
210 "FASTAPI_CLOUD_TOKEN is required to deploy from CI.",
211 hint=(
212 "Run `fastapi cloud setup-ci` to configure a deploy token, "
213 "or set FASTAPI_CLOUD_TOKEN in your CI secrets."
214 ),
215 )
217 if json_output: 2Ff7fMfWdGf8fNfXdHf9fOfYdIf!fPfZdJf#fQf0dKf$fRf1dLf%fSf2d
218 toolkit.fail( 27f8f9f!f#f$f%f
219 "not_logged_in",
220 "No credentials found.",
221 hint="Run `fastapi cloud login` or set FASTAPI_CLOUD_TOKEN.",
222 )
224 toolkit.print_title( 2FfMfWdGfNfXdHfOfYdIfPfZdJfQf0dKfRf1dLfSf2d
225 "Welcome to FastAPI Cloud!",
226 tag="FastAPI Cloud",
227 emoji="👋",
228 animate=True,
229 )
230 toolkit.print_line() 2FfMfWdGfNfXdHfOfYdIfPfZdJfQf0dKfRf1dLfSf2d
232 if identity.user_token and identity.is_user_token_expired(): 2FfMfWdGfNfXdHfOfYdIfPfZdJfQf0dKfRf1dLfSf2d
233 toolkit.print("Your session has expired. Please log in again.") 2MfNfOfPfQfRfSf
234 else:
235 toolkit.print("You need to be logged in to deploy to FastAPI Cloud.") 2FfWdGfXdHfYdIfZdJf0dKf1dLf2d
237 toolkit.print_line() 2FfMfWdGfNfXdHfOfYdIfPfZdJfQf0dKfRf1dLfSf2d
238 should_login = toolkit.confirm( 2FfMfWdGfNfXdHfOfYdIfPfZdJfQf0dKfRf1dLfSf2d
239 "Do you want to log in now?",
240 default=True,
241 )
243 if not should_login: 2FfMfWdGfNfXdHfOfYdIfPfZdJfQf0dKfRf1dLfSf2d
244 toolkit.print_line() 2FfGfHfIfJfKfLf
245 toolkit.print("Deployment cancelled.") 2FfGfHfIfJfKfLf
246 raise typer.Exit(0) 2FfGfHfIfJfKfLf
248 toolkit.print_line() 2MfWdNfXdOfYdPfZdQf0dRf1dSf2d
249 _interactive_login(toolkit) 2MfWdNfXdOfYdPfZdQf0dRf1dSf2d
250 toolkit.print_line() 2WdXdYdZd0d1d2d
252 with APIClient(use_deploy_token=use_deploy_token) as client: 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c
253 # the welcome title already shows the header when logging in
254 if has_auth: 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c
255 toolkit.print_title("FastAPI Cloud", animate=True) 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejeke9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexe/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKe? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXe^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~ebb1cafbfcf2c3c
256 toolkit.print_line() 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejeke9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexe/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKe? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXe^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~ebb1cafbfcf2c3c
258 if use_deploy_token: 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c
259 toolkit.print( 2cb_dgb`dhb{dib|ddb}djb~dkbae
260 "Using token from [bold blue]FASTAPI_CLOUD_TOKEN[/] environment variable",
261 )
262 toolkit.print_line() 2cb_dgb`dhb{dib|ddb}djb~dkbae
264 path_to_deploy = path or Path.cwd() 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c
265 logger.debug("Deploying from path: %s", path_to_deploy) 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c
267 if not force and path_to_deploy.resolve() == Path.home().resolve(): 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c
268 _confirm_home_directory_deploy(toolkit, json_output=json_output) 2kf6 Tflf, Ufmf: Vfnf@ Wfof! Xfpf_ Yfqf} Zf
270 app_config = get_app_config(path_to_deploy) 2beYbJ Zbce!d#dK qbrbsb6 Bdnda rf~c4 $d0fsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5b, Ddodc tfdd' (d1fufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/b: Fdpdd vffd( +d2fwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbccc@ Hdqde xfhd) .d3fyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJb! Jdrdb zfbd5 ;d4fAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcyc_ Ldsdf Bfjd* @d5fCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPc} Ndtdg Dfld+ ^d6fEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c
272 if app_config and provided_app_id and app_config.app_id != provided_app_id: 2beYbJ Zbce!d#dK qbrbsb6 Bdnda rf~c4 $d0fsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5b, Ddodc tfdd' (d1fufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/b: Fdpdd vffd( +d2fwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbccc@ Hdqde xfhd) .d3fyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJb! Jdrdb zfbd5 ;d4fAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcyc_ Ldsdf Bfjd* @d5fCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPc} Ndtdg Dfld+ ^d6fEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c
273 toolkit.fail( 20fdf1fef2fff3fgf4fhf5fif6fjf
274 "invalid_input",
275 f"Provided app ID ({provided_app_id}) does not match the local config ({app_config.app_id}).",
276 hint=(
277 "Run `fastapi cloud unlink` to remove the local config, "
278 "or remove --app-id / unset FASTAPI_CLOUD_APP_ID to use the configured app."
279 ),
280 render_output=_render_app_id_mismatch,
281 )
283 if provided_app_id: 2beYbJ Zbce!d#dK qbrbsb6 Bdnda rf~c4 $dsfCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5b, Ddodc tfdd' (dufEd6bed_cgb6c4d7c8clb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/b: Fdpdd vffd( +dwfGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbccc@ Hdqde xfhd) .dyfIddcid{cib)c6d*c+cnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJb! Jdrdb zfbd5 ;dAfKdKbcd^cdbtc7ducvcfb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcyc_ Ldsdf Bfjd* @dCfMdzckd|cjb.c8d/c:cob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPc} Ndtdg Dfld+ ^dEfOdQcmd}ckb?c9d@c[cpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c
284 target_app_id = provided_app_id 2$d0b3d1b2b(d6c4d7c8c+d#c5d$c%c.d)c6d*c+c;dtc7ducvc@d.c8d/c:c^d?c9d@c[c
285 elif app_config: 2beYbJ Zbce!d#dK qbrbsb6 Bdnda rf~c4 sfCdtbad]ccbeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5b, Ddodc tfdd' ufEd6bed_cgblb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/b: Fdpdd vffd( wfGd:bgd`chbmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbccc@ Hdqde xfhd) yfIddcid{cibnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJb! Jdrdb zfbd5 AfKdKbcd^cdbfb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcyc_ Ldsdf Bfjd* CfMdzckd|cjbob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPc} Ndtdg Dfld+ EfOdQcmd}ckbpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c
286 target_app_id = app_config.app_id 2YbZbqbrbsb6 Bdnda ~c4 Cdtbad]ccbeb_dubvbj k wbh l xbybzbAbBbCbPdDbEbFbGb4c5c3b4b5b, Ddodc dd' Ed6bed_cgblb`d7b8bu v 9bm w !b#b$b%b'b(bQd)b*b+b,b9c!c-b.b/b: Fdpdd fd( Gd:bgd`chbmb{d;b=bx y ?bn z @b[b]b^b_b`bRd{b|b}b~b'c(cacbccc@ Hdqde hd) Iddcid{cibnb|decfcA B gco C hcicjckclcmcSdncocpcqcrcscHbIbJb! Jdrdb bd5 KdKbcd^cdbfb}dLbMbp q Nbi r ObPbQbRbSbTbTdUbVbWbXb,c-cwcxcyc_ Ldsdf jd* Mdzckd|cjbob~dAcBcD E Ccs F DcEcFcGcHcIcUdJcKcLcMc;c=cNcOcPc} Ndtdg ld+ OdQcmd}ckbpbaeRcScG H Tct I UcVcWcXcYcZcVd0c1c2c3c
287 else:
288 if json_output or is_ci_enabled(): 2beJ ce!d#dK rfsfL 7 8 deeefegeheiejekeWd9 lemeneoeP pe%d'dQ tfufR - . qereseteuevewexeXd/ yezeAeBeS Ce)d*dT vfwfU ; = DeEeFeGeHeIeJeKeYd? LeMeNeOeV Pe,d-dW xfyfX [ ] QeReSeTeUeVeWeXeZd^ YeZe0e1eM 2e/d:dN zfAfO # $ 3e4e5e6e7e8e9e!e0d% #e$e%e'eY (e=d?dZ BfCf0 ` { )e*e+e,e-e.e/e:e1d| ;e=e?e@e1 [e[d]d2 DfEf3 ~ ab]e^e_e`e{e|e}e~e2dbbafbfcf
289 toolkit.fail( 2rfsftfufvfwfxfyfzfAfBfCfDfEf
290 "missing_required_input",
291 "App ID is required.",
292 hint="Pass --app-id or run `fastapi cloud apps create --link` first.",
293 )
295 logger.debug("No app config found, configuring new app") 2beJ ce!d#dK L 7 8 deeefegeheiejekeWd9 lemeneoeP pe%d'dQ R - . qereseteuevewexeXd/ yezeAeBeS Ce)d*dT U ; = DeEeFeGeHeIeJeKeYd? LeMeNeOeV Pe,d-dW X [ ] QeReSeTeUeVeWeXeZd^ YeZe0e1eM 2e/d:dN O # $ 3e4e5e6e7e8e9e!e0d% #e$e%e'eY (e=d?dZ 0 ` { )e*e+e,e-e.e/e:e1d| ;e=e?e@e1 [e[d]d2 3 ~ ab]e^e_e`e{e|e}e~e2dbbafbfcf
297 app_config = _configure_app( 2beJ ce!d#dK L 7 8 deeefegeheiejekeWd9 lemeneoeP pe%d'dQ R - . qereseteuevewexeXd/ yezeAeBeS Ce)d*dT U ; = DeEeFeGeHeIeJeKeYd? LeMeNeOeV Pe,d-dW X [ ] QeReSeTeUeVeWeXeZd^ YeZe0e1eM 2e/d:dN O # $ 3e4e5e6e7e8e9e!e0d% #e$e%e'eY (e=d?dZ 0 ` { )e*e+e,e-e.e/e:e1d| ;e=e?e@e1 [e[d]d2 3 ~ ab]e^e_e`e{e|e}e~e2dbbafbfcf
298 toolkit=toolkit,
299 client=client,
300 path_to_deploy=path_to_deploy,
301 )
302 toolkit.print_line() 2J !d#dK L 7 8 9 P %d'dQ R - . / S )d*dT U ; = ? V ,d-dW X [ ] ^ M /d:dN O # $ % Y =d?dZ 0 ` { | 1 [d]d2 3 ~ abbb
304 target_app_id = app_config.app_id 2J !d#dK L 7 8 9 P %d'dQ R - . / S )d*dT U ; = ? V ,d-dW X [ ] ^ M /d:dN O # $ % Y =d?dZ 0 ` { | 1 [d]d2 3 ~ abbb
306 if provided_app_id: 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c
307 toolkit.print( 2$d0b3d1b2b(d6c4d7c8c+d#c5d$c%c.d)c6d*c+c;dtc7ducvc@d.c8d/c:c^d?c9d@c[c
308 f"Deploying to app [blue]{target_app_id}[/blue]...", emoji="🚀"
309 )
310 else:
311 toolkit.print("Deploying app...", emoji="🚀") 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 Cdtbad]ccbeb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' Ed6bed_cgblb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( Gd:bgd`chbmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) Iddcid{cibnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 KdKbcd^cdbfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* Mdzckd|cjbob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ OdQcmd}ckbpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c
313 toolkit.print_line() 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c
315 with toolkit.progress("Checking app...", transient=True) as progress: 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c
316 with client.handle_http_errors(progress, toolkit=toolkit): 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c
317 logger.debug("Checking app with ID: %s", target_app_id) 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c
318 app = _get_app(client=client, app_id=target_app_id) 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c
320 if app is None: 2YbJ ZbK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5cQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !cT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (cW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnbX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM scN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -cZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c
321 logger.debug("App not found in API") 2$d3dPd(d4dQd+d5dRd.d6dSd;d7dTd@d8dUd^d9dVd
322 progress.set_error( 2$d3dPd(d4dQd+d5dRd.d6dSd;d7dTd@d8dUd^d9dVd
323 "App not found. Make sure you're logged in the correct account."
324 )
326 if app is None: 2YbJ ZbK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5cQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !cT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (cW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnbX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM scN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -cZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c
327 toolkit.fail( 2$d3dPd(d4dQd+d5dRd.d6dSd;d7dTd@d8dUd^d9dVd
328 "not_found",
329 "App not found. Make sure you're logged in the correct account.",
330 render_output=(
331 _render_app_not_found
332 if provided_app_id
333 else _render_linked_app_not_found
334 ),
335 )
337 app = cast(AppResponse, app) 2YbJ ZbK qbrbsb6 Bdnda ~c4 Cdtbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, Ddodc dd' Ed6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: Fdpdd fd( Gd:bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ Hdqde hd) Iddcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! Jdrdb bd5 KdKbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ Ldsdf jd* Mdzckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} Ndtdg ld+ OdQcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
339 if not force: 2YbJ ZbK qbrbsb6 Bdnda ~c4 Cdtbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, Ddodc dd' Ed6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: Fdpdd fd( Gd:bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ Hdqde hd) Iddcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! Jdrdb bd5 KdKbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ Ldsdf jd* Mdzckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} Ndtdg ld+ OdQcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
340 _check_app_directory(toolkit, app=app, path_to_deploy=path_to_deploy) 2YbJ ZbK qbrbsb6 Bdnda ~c4 Cdtbad]ccb0b1b2bL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, Ddodc dd' Ed6bed_cgb6c7c8cR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: Fdpdd fd( Gd:bgd`chb#c$c%cU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ Hdqde hd) Iddcid{cib)c*c+cX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! Jdrdb bd5 KdKbcd^cdbtcucvcO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ Ldsdf jd* Mdzckd|cjb.c/c:c0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} Ndtdg ld+ OdQcmd}ckb?c@c[c3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
342 large_files = _get_large_files( 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
343 path_to_deploy, threshold_mb=large_file_threshold
344 )
345 warnings = _get_large_file_warnings( 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
346 large_files,
347 threshold_mb=large_file_threshold,
348 )
349 if large_files: 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
350 toolkit.print( 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
351 f"Some uploaded files are larger than {large_file_threshold} MB:",
352 emoji="⚠️",
353 )
354 toolkit.print_line() 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
355 for fname, fsize in large_files[:3]: 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
356 fsize_mb = fsize // (1024 * 1024) 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
357 toolkit.print( 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
358 f"• [bold]{fname}[/bold] [yellow]({fsize_mb} MB)[/yellow]"
359 )
360 is_more = len(large_files) > 3 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
361 if is_more: 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
362 toolkit.print(f"[dim]...and {len(large_files) - 3} more[/dim]") 1hmnoist
364 large_files_docs_url = "https://fastapicloud.com/docs/fastapi-cloud-cli/deploy/#large-files-warning" 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
365 toolkit.print_line() 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
366 toolkit.print( 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
367 f"Read more: [link={large_files_docs_url}]{large_files_docs_url}[/link]",
368 emoji="💡",
369 )
370 toolkit.print_line() 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI
372 will_wait = not skip_wait and not json_output 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
374 with tempfile.TemporaryDirectory() as temp_dir: 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
375 logger.debug("Creating archive for deployment") 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
376 archive_path = Path(temp_dir) / "archive.tar" 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
377 file_count = archive(path_to_deploy, archive_path) 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
378 archive_size = archive_path.stat().st_size 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
380 if file_count == 0: 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
381 toolkit.fail( 2ndodpdqdrdsdtd
382 "invalid_input",
383 f"Nothing to deploy: no files to upload in {path_to_deploy}.",
384 hint=(
385 "Check the path, and that .gitignore or "
386 ".fastapicloudignore don't exclude your app's files."
387 ),
388 )
390 with ( 2YbJ ZbK qbrbsb6 a ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGbrcM scN HbIbJb! b bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb
391 toolkit.progress(
392 title="Creating deployment",
393 # the build status replaces this when waiting
394 transient=will_wait,
395 done_emoji="📦",
396 ) as progress,
397 client.handle_http_errors(progress, toolkit=toolkit),
398 ):
399 logger.debug("Creating deployment for app: %s", app.id) 2YbJ ZbK qbrbsb6 a ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, c dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: d fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ e hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! b bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ f jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} g ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
401 try: 2YbJ ZbK qbrbsb6 a ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, c dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: d fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ e hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! b bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ f jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} g ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
402 deployment = _create_deployment( 2YbJ ZbK qbrbsb6 a ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, c dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: d fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ e hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! b bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ f jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} g ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
403 client=client,
404 app_id=app.id,
405 archive_size_bytes=archive_size,
406 )
407 except ArchiveTooLargeError as e: 2~cadddedfdgdhdidbdcdjdkdldmd
408 toolkit.fail( 2~cadddedfdgdhdidbdcdjdkdldmd
409 "invalid_input",
410 str(e),
411 hint=(
412 "You can exclude files from the deployment "
413 "with a .fastapicloudignore file."
414 ),
415 )
417 try: 2YbJ ZbK qbrbsb6 a 4 tb]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, c ' 6b_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: d ( :b`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ e ) dc{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! b 5 Kb^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ f * zc|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} g + Qc}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
418 progress.log( 2YbJ ZbK qbrbsb6 a 4 tb]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, c ' 6b_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: d ( :b`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ e ) dc{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! b 5 Kb^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ f * zc|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} g + Qc}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
419 f"Deployment created successfully! Deployment slug: {deployment.slug}"
420 )
422 deployment = _upload_deployment( 2YbJ ZbK qbrbsb6 a 4 tb]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, c ' 6b_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: d ( :b`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ e ) dc{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! b 5 Kb^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ f * zc|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} g + Qc}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
423 fastapi_client=client,
424 deployment_id=deployment.id,
425 archive_path=archive_path,
426 archive_size=archive_size,
427 progress=progress,
428 )
430 progress.log("Deployment uploaded successfully!") 2J K qbrbsb6 a 4 tbcb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGbP Q 3b4b5b, c ' 6bgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,bS T -b.b/b: d ( :bhb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~bV W acbccc@ e ) dcib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcM N HbIbJb! b 5 KbdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXbY Z wcxcyc_ f * zcjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc1 2 NcOcPc} g + Qckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
431 except KeyboardInterrupt: 2YbZb]c4c5c_c9c!c`c'c(c{crcsc^c,c-c|c;c=c}c
432 _cancel_upload(client=client, deployment_id=deployment.id) 2YbZb4c5c9c!c'c(crcsc,c-c;c=c
433 raise 2YbZb4c5c9c!c'c(crcsc,c-c;c=c
435 if will_wait: 2J K qbrbsb6 a 4 tbcb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGbP Q 3b4b5b, c ' 6bgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,bS T -b.b/b: d ( :bhb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~bV W acbccc@ e ) dcib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcM N HbIbJb! b 5 KbdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXbY Z wcxcyc_ f * zcjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc1 2 NcOcPc} g + Qckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
436 logger.debug("Waiting for deployment to complete") 2qbrbsb6 tbcb0b1b2b7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb3b4b5b, 6bgb6c7c8c- . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b-b.b/b: :bhb#c$c%c; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~bacbccc@ dcib)c*c+c[ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcHbIbJb! Kbdbtcucvc# $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXbwcxcyc_ zcjb.c/c:c` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMcNcOcPc} Qckb?c@c[c~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
437 _wait_for_deployment( 2qbrbsb6 tbcb0b1b2b7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb3b4b5b, 6bgb6c7c8c- . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b-b.b/b: :bhb#c$c%c; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~bacbccc@ dcib)c*c+c[ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcHbIbJb! Kbdbtcucvc# $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXbwcxcyc_ zcjb.c/c:c` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMcNcOcPc} Qckb?c@c[c~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c
438 toolkit=toolkit,
439 client=client,
440 app_id=app.id,
441 deployment=deployment,
442 )
443 else:
444 toolkit.print_line() 2J K a 4 ebL P Q c ' lbR S T d ( mbU V W e ) nbX M N b 5 fbO Y Z f * ob0 1 2 g + pb3
445 logger.debug("Skipping deployment wait as requested") 2J K a 4 ebL P Q c ' lbR S T d ( mbU V W e ) nbX M N b 5 fbO Y Z f * ob0 1 2 g + pb3
446 if json_output: 2J K a 4 ebL P Q c ' lbR S T d ( mbU V W e ) nbX M N b 5 fbO Y Z f * ob0 1 2 g + pb3
447 toolkit.success( 2a 4 ebc ' lbd ( mbe ) nbb 5 fbf * obg + pb
448 _get_deploy_output(deployment),
449 warnings=warnings,
450 hint=(
451 "Check deployment status in the FastAPI Cloud dashboard: "
452 f"{deployment.dashboard_url}"
453 ),
454 )
455 return 2a 4 ebc ' lbd ( mbe ) nbb 5 fbf * obg + pb
457 toolkit.print( 1JKLPQRSTUVWXMNOYZ0123
458 f"Check the status of your deployment at [link={deployment.dashboard_url}]{deployment.dashboard_url}[/link]"
459 )