in azurelinuxagent/ga/exthandlers.py [0:0]
def decide_version(self, target_state, extension, gs_activity_id):
self.logger.verbose("Decide which version to use")
try:
manifest = self.protocol.get_goal_state().fetch_extension_manifest(self.ext_handler.name, self.ext_handler.manifest_uris)
pkg_list = manifest.pkg_list
except ProtocolError as e:
raise ExtensionError("Failed to get ext handler pkgs", e)
except ExtensionDownloadError:
self.set_operation(WALAEventOperation.Download)
raise
# Determine the desired and installed versions
requested_version = FlexibleVersion(str(self.ext_handler.version))
installed_version_string = self.get_installed_version()
installed_version = requested_version if installed_version_string is None else FlexibleVersion(installed_version_string)
# Divide packages
# - Find the installed package (its version must exactly match)
# - Find the internal candidate (its version must exactly match)
# - Separate the public packages
selected_pkg = None
installed_pkg = None
pkg_list.versions.sort(key=lambda p: FlexibleVersion(p.version))
for pkg in pkg_list.versions:
pkg_version = FlexibleVersion(pkg.version)
if pkg_version == installed_version:
installed_pkg = pkg
if requested_version.matches(pkg_version):
selected_pkg = pkg
# Finally, update the version only if not downgrading
# Note:
# - A downgrade, which will be bound to the same major version,
# is allowed if the installed version is no longer available
if target_state in (ExtensionRequestedState.Uninstall, ExtensionRequestedState.Disabled):
if installed_pkg is None:
msg = "Failed to find installed version: {0} of Handler: {1} in handler manifest to uninstall.".format(
installed_version, self.ext_handler.name)
self.logger.warn(msg)
self.pkg = installed_pkg
self.ext_handler.version = str(installed_version) \
if installed_version is not None else None
else:
self.pkg = selected_pkg
if self.pkg is not None:
if self.ext_handler.version != str(selected_pkg.version):
# The Agent should not change the version requested by the Goal State. Send telemetry if this happens.
event.info(
WALAEventOperation.RequestedVersionMismatch,
'Goal State requesting {0} version {1}, but Agent overriding with version {2} [Activity ID: {3}]', self.ext_handler.name, self.ext_handler.version, selected_pkg.version, gs_activity_id)
self.ext_handler.version = str(selected_pkg.version)
if self.pkg is not None:
self.logger.verbose("Use version: {0}", self.pkg.version)
# We reset the logger here incase the handler version changes
if not requested_version.matches(FlexibleVersion(self.ext_handler.version)):
self.set_logger(extension=extension)
return self.pkg