Skip to content

Commit 54c4130

Browse files
committed
Refactor eol impl and sort based on runtime eol date
1 parent 5103af8 commit 54c4130

File tree

56 files changed

+51823
-28900
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+51823
-28900
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def __init__(self):
5959
self.USE_32_BIT_WORKER_PROC = 'use32BitWorkerProcess'
6060
self.FUNCTIONS_WORKER_RUNTIME = 'FUNCTIONS_WORKER_RUNTIME'
6161
self.GIT_HUB_ACTION_SETTINGS = 'git_hub_action_settings'
62+
self.END_OF_LIFE_DATE = 'endOfLifeDate'
6263

6364

6465
GENERATE_RANDOM_APP_NAMES = os.path.abspath(os.path.join(os.path.abspath(__file__),

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

Lines changed: 24 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4331,7 +4331,7 @@ class _FunctionAppStackRuntimeHelper(_AbstractStackRuntimeHelper):
43314331
class Runtime:
43324332
def __init__(self, name=None, version=None, is_preview=False, supported_func_versions=None, linux=False,
43334333
app_settings_dict=None, site_config_dict=None, app_insights=False, default=False,
4334-
github_actions_properties=None):
4334+
github_actions_properties=None, end_of_life_date=None):
43354335
self.name = name
43364336
self.version = version
43374337
self.is_preview = is_preview
@@ -4342,8 +4342,10 @@ def __init__(self, name=None, version=None, is_preview=False, supported_func_ver
43424342
self.app_insights = app_insights
43434343
self.default = default
43444344
self.github_actions_properties = github_actions_properties
4345+
self.end_of_life_date = end_of_life_date
43454346

43464347
self.display_name = "{}|{}".format(name, version) if version else name
4348+
self.deprecation_link = LANGUAGE_EOL_DEPRECATION_NOTICES.get(self.display_name, '')
43474349

43484350
# used for displaying stacks
43494351
def to_dict(self):
@@ -4354,29 +4356,27 @@ def to_dict(self):
43544356
d["linux_fx_version"] = self.site_config_dict.linux_fx_version
43554357
return d
43564358

4357-
class RuntimeEOL:
4358-
def __init__(self, name=None, version=None, eol=None):
4359-
self.name = name
4360-
self.version = version
4361-
self.eol = eol
4362-
self.display_name = "{}|{}".format(name, version)
4363-
self.deprecation_link = LANGUAGE_EOL_DEPRECATION_NOTICES.get(self.display_name)
4364-
43654359
def __init__(self, cmd, linux=False, windows=False):
43664360
self.disallowed_functions_versions = {"~1", "~2", "~3"}
43674361
self.KEYS = FUNCTIONS_STACKS_API_KEYS()
4368-
self.end_of_life_dates = []
43694362
super().__init__(cmd, linux=linux, windows=windows)
43704363

43714364
def validate_end_of_life_date(self, runtime, version):
43724365
from dateutil.relativedelta import relativedelta
4366+
# we would not be able to validate for a custom runtime
4367+
if runtime == 'custom':
4368+
return
4369+
43734370
today = datetime.datetime.now(datetime.timezone.utc)
43744371
six_months = today + relativedelta(months=+6)
4375-
runtimes_eol = [r for r in self.end_of_life_dates if runtime == r.name]
4376-
matched_runtime_eol = next((r for r in runtimes_eol if r.version == version), None)
4377-
if matched_runtime_eol:
4378-
eol = matched_runtime_eol.eol
4379-
runtime_deprecation_link = matched_runtime_eol.deprecation_link or ''
4372+
runtimes = [r for r in self.stacks if runtime == r.name]
4373+
matched_runtime = next((r for r in runtimes if r.version == version), None)
4374+
if matched_runtime:
4375+
eol = matched_runtime.end_of_life_date
4376+
runtime_deprecation_link = matched_runtime.deprecation_link
4377+
4378+
if eol is None:
4379+
return
43804380

43814381
if eol < today:
43824382
raise ValidationError('{} has reached EOL on {} and is no longer supported. {}'
@@ -4441,7 +4441,8 @@ def resolve(self, runtime, version=None, functions_version=None, linux=False, di
44414441

44424442
def get_default_version(self, runtime, functions_version, linux=False):
44434443
runtimes = [r for r in self.stacks if r.linux == linux and r.name == runtime]
4444-
runtimes.sort(key=lambda r: r.default, reverse=True) # make runtimes with default=True appear first
4444+
# sort runtimes by end of life date
4445+
runtimes.sort(key=lambda r: r.end_of_life_date or datetime.datetime.min, reverse=True)
44454446
for r in runtimes:
44464447
if functions_version in r.supported_func_versions:
44474448
return r
@@ -4480,8 +4481,7 @@ def _get_valid_function_versions(self, runtime_settings):
44804481
valid_versions.append(self._format_version_name(v))
44814482
return valid_versions
44824483

4483-
def _parse_minor_version(self, runtime_settings, major_version_name, minor_version_name, runtime_to_version,
4484-
runtime_to_version_eol):
4484+
def _parse_minor_version(self, runtime_settings, major_version_name, minor_version_name, runtime_to_version):
44854485
runtime_name = (runtime_settings.app_settings_dictionary.get(self.KEYS.FUNCTIONS_WORKER_RUNTIME) or
44864486
major_version_name)
44874487
if not runtime_settings.is_deprecated:
@@ -4494,17 +4494,13 @@ def _parse_minor_version(self, runtime_settings, major_version_name, minor_versi
44944494
self.KEYS.APPLICATION_INSIGHTS: runtime_settings.app_insights_settings.is_supported,
44954495
self.KEYS.SITE_CONFIG_DICT: runtime_settings.site_config_properties_dictionary,
44964496
self.KEYS.IS_DEFAULT: bool(runtime_settings.is_default),
4497-
self.KEYS.GIT_HUB_ACTION_SETTINGS: runtime_settings.git_hub_action_settings
4497+
self.KEYS.GIT_HUB_ACTION_SETTINGS: runtime_settings.git_hub_action_settings,
4498+
self.KEYS.END_OF_LIFE_DATE: runtime_settings.end_of_life_date,
44984499
}
44994500

45004501
runtime_to_version[runtime_name] = runtime_to_version.get(runtime_name, {})
45014502
runtime_to_version[runtime_name][minor_version_name] = runtime_version_properties
45024503

4503-
# obtain end of life date for all runtime versions
4504-
if runtime_settings.end_of_life_date is not None:
4505-
runtime_to_version_eol[runtime_name] = runtime_to_version_eol.get(runtime_name, {})
4506-
runtime_to_version_eol[runtime_name][minor_version_name] = runtime_settings.end_of_life_date
4507-
45084504
def _create_runtime_from_properties(self, runtime_name, version_name, version_properties, linux):
45094505
supported_func_versions = version_properties[self.KEYS.SUPPORTED_EXTENSION_VERSIONS]
45104506
return self.Runtime(name=runtime_name,
@@ -4516,14 +4512,13 @@ def _create_runtime_from_properties(self, runtime_name, version_name, version_pr
45164512
app_settings_dict=version_properties[self.KEYS.APP_SETTINGS_DICT],
45174513
app_insights=version_properties[self.KEYS.APPLICATION_INSIGHTS],
45184514
default=version_properties[self.KEYS.IS_DEFAULT],
4519-
github_actions_properties=version_properties[self.KEYS.GIT_HUB_ACTION_SETTINGS]
4520-
)
4515+
github_actions_properties=version_properties[self.KEYS.GIT_HUB_ACTION_SETTINGS],
4516+
end_of_life_date=version_properties[self.KEYS.END_OF_LIFE_DATE])
45214517

45224518
def _parse_raw_stacks(self, stacks):
45234519
# build a map of runtime -> runtime version -> runtime version properties
45244520
runtime_to_version_linux = {}
45254521
runtime_to_version_windows = {}
4526-
runtime_to_version_end_of_life = {}
45274522
for runtime in stacks:
45284523
for major_version in runtime.major_versions:
45294524
for minor_version in major_version.minor_versions:
@@ -4535,19 +4530,16 @@ def _parse_raw_stacks(self, stacks):
45354530
self._parse_minor_version(runtime_settings=linux_settings,
45364531
major_version_name=runtime.name,
45374532
minor_version_name=runtime_version,
4538-
runtime_to_version=runtime_to_version_linux,
4539-
runtime_to_version_eol=runtime_to_version_end_of_life)
4533+
runtime_to_version=runtime_to_version_linux)
45404534

45414535
if windows_settings is not None and not windows_settings.is_hidden:
45424536
self._parse_minor_version(runtime_settings=windows_settings,
45434537
major_version_name=runtime.name,
45444538
minor_version_name=runtime_version,
4545-
runtime_to_version=runtime_to_version_windows,
4546-
runtime_to_version_eol=runtime_to_version_end_of_life)
4539+
runtime_to_version=runtime_to_version_windows)
45474540

45484541
runtime_to_version_linux = self._format_version_names(runtime_to_version_linux)
45494542
runtime_to_version_windows = self._format_version_names(runtime_to_version_windows)
4550-
runtime_to_version_end_of_life = self._format_version_names(runtime_to_version_end_of_life)
45514543

45524544
for runtime_name, versions in runtime_to_version_windows.items():
45534545
for version_name, version_properties in versions.items():
@@ -4559,11 +4551,6 @@ def _parse_raw_stacks(self, stacks):
45594551
r = self._create_runtime_from_properties(runtime_name, version_name, version_properties, linux=True)
45604552
self._stacks.append(r)
45614553

4562-
for runtime_name, versions in runtime_to_version_end_of_life.items():
4563-
for version_name, version_eol in versions.items():
4564-
r = self.RuntimeEOL(name=runtime_name, version=version_name, eol=version_eol)
4565-
self.end_of_life_dates.append(r)
4566-
45674554

45684555
def get_app_insights_key(cli_ctx, resource_group, name):
45694556
appinsights_client = get_mgmt_service_client(cli_ctx, ApplicationInsightsManagementClient)

0 commit comments

Comments
 (0)