Skip to content

Commit 4d9eb14

Browse files
authored
[App Service] az webapp deploy: Warm-up kudu using ARM warm-up API before making ARM deployment (#31880)
1 parent 4f8ec32 commit 4d9eb14

File tree

5 files changed

+2591
-1215
lines changed

5 files changed

+2591
-1215
lines changed

src/azure-cli/azure/cli/command_modules/appservice/custom.py

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7691,6 +7691,31 @@ def _build_onedeploy_url(params, instance_id=None):
76917691
return _build_onedeploy_scm_url(params)
76927692

76937693

7694+
def _build_kudu_warmup_scm_url(params):
7695+
scm_url = _get_scm_url(params.cmd, params.resource_group_name, params.webapp_name, params.slot)
7696+
return scm_url + '/api/deployments?warmup=true'
7697+
7698+
7699+
def _build_kudu_warmup_arm_url(params, instance_id=None):
7700+
from azure.cli.core.commands.client_factory import get_subscription_id
7701+
client = web_client_factory(params.cmd.cli_ctx)
7702+
sub_id = get_subscription_id(params.cmd.cli_ctx)
7703+
instances_segment = f"/instances/{instance_id}" if instance_id is not None else ""
7704+
if not params.slot:
7705+
base_url = (
7706+
f"subscriptions/{sub_id}/resourceGroups/{params.resource_group_name}/providers/Microsoft.Web/sites/"
7707+
f"{params.webapp_name}{instances_segment}/deployments?api-version={client.DEFAULT_API_VERSION}"
7708+
f"&warmup=true"
7709+
)
7710+
else:
7711+
base_url = (
7712+
f"subscriptions/{sub_id}/resourceGroups/{params.resource_group_name}/providers/Microsoft.Web/sites/"
7713+
f"{params.webapp_name}/slots/{params.slot}{instances_segment}/deployments"
7714+
f"?api-version={client.DEFAULT_API_VERSION}&warmup=true"
7715+
)
7716+
return params.cmd.cli_ctx.cloud.endpoints.resource_manager + base_url
7717+
7718+
76947719
def _build_onedeploy_scm_url(params):
76957720
scm_url = _get_scm_url(params.cmd, params.resource_group_name, params.webapp_name, params.slot)
76967721
deploy_url = scm_url + '/api/publish?type=' + params.artifact_type
@@ -7856,10 +7881,10 @@ def _get_instance_id_internal(cmd, resource_group_name, webapp_name, slot):
78567881
return None
78577882

78587883

7859-
def _warmup_kudu_and_get_cookie_internal(cmd, resource_group_name, webapp_name, slot):
7884+
def _warmup_kudu_and_get_cookie_internal(params):
78607885
import requests
7861-
scm_url = _get_scm_url(cmd, resource_group_name, webapp_name, slot)
7862-
instance_id = _get_instance_id_internal(cmd, resource_group_name, webapp_name, slot)
7886+
instance_id = _get_instance_id_internal(params.cmd, params.resource_group_name, params.webapp_name, params.slot)
7887+
78637888
if instance_id is None:
78647889
logger.info("Failed to get a Kudu instance id...")
78657890
return None
@@ -7869,16 +7894,21 @@ def _warmup_kudu_and_get_cookie_internal(cmd, resource_group_name, webapp_name,
78697894

78707895
for _ in range(max_retries):
78717896
try:
7872-
headers = get_scm_site_headers(cmd.cli_ctx, webapp_name, resource_group_name)
7873-
response = requests.get(scm_url + '/api/deployments?warmup=true',
7874-
headers=headers, cookies=cookies, timeout=time_out)
7897+
if not params.src_url: # use SCM endpoint for Kudu warmup
7898+
kudu_warmup_url = _build_kudu_warmup_scm_url(params)
7899+
headers = get_scm_site_headers(params.cmd.cli_ctx, params.webapp_name, params.resource_group_name)
7900+
response = requests.get(kudu_warmup_url, headers=headers, cookies=cookies, timeout=time_out)
7901+
else: # use ARM endpoint for Kudu warmup
7902+
kudu_warmup_url = _build_kudu_warmup_arm_url(params, instance_id)
7903+
response = send_raw_request(params.cmd.cli_ctx, "GET", kudu_warmup_url)
7904+
78757905
if response.status_code in (200, 201, 202):
78767906
logger.warning("Warmed up Kudu instance successfully.")
78777907
return cookies
78787908
time_out = 300
78797909
except Exception as ex: # pylint: disable=broad-except
78807910
logger.info("Error while warming-up Kudu with instanceid: %s, ex: %s", instance_id, ex)
7881-
return False
7911+
time_out = 300
78827912
logger.warning("Failed to warm-up Kudu with instanceid: %s, "
78837913
"the deployment will proceed without pre-warmup.", instance_id)
78847914
return None
@@ -7905,8 +7935,7 @@ def _make_onedeploy_request(params):
79057935
if params.is_linux_webapp and not params.is_functionapp and params.enable_kudu_warmup:
79067936
try:
79077937
logger.warning("Warming up Kudu before deployment.")
7908-
cookies = _warmup_kudu_and_get_cookie_internal(params.cmd, params.resource_group_name,
7909-
params.webapp_name, params.slot)
7938+
cookies = _warmup_kudu_and_get_cookie_internal(params)
79107939
if cookies is None:
79117940
logger.info("Failed to fetch affinity cookie for Kudu. "
79127941
"Deployment will proceed without pre-warming a Kudu instance.")
@@ -7928,8 +7957,7 @@ def _make_onedeploy_request(params):
79287957
if params.is_linux_webapp and not params.is_functionapp and params.enable_kudu_warmup:
79297958
try:
79307959
logger.warning("Warming up Kudu before deployment.")
7931-
cookies = _warmup_kudu_and_get_cookie_internal(params.cmd, params.resource_group_name,
7932-
params.webapp_name, params.slot)
7960+
cookies = _warmup_kudu_and_get_cookie_internal(params)
79337961
if cookies is None:
79347962
logger.info("Failed to fetch affinity cookie for Kudu. "
79357963
"Deployment will proceed without pre-warming a Kudu instance.")

0 commit comments

Comments
 (0)