@@ -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
45684555def get_app_insights_key (cli_ctx , resource_group , name ):
45694556 appinsights_client = get_mgmt_service_client (cli_ctx , ApplicationInsightsManagementClient )
0 commit comments