Skip to content

Commit 22146dd

Browse files
authored
Bug fix for status handler writes (#45)
* Bug fix for status handler writes * Removed stray debug statement
1 parent e983520 commit 22146dd

File tree

4 files changed

+28
-5
lines changed

4 files changed

+28
-5
lines changed

src/core/src/core_logic/PatchInstaller.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ def start_installation(self, simulate=False):
100100
#todo: temp fix to test auto patching, this will be reset to using the maintenanceRunId string as is, once the corresponding changes in RSM are made
101101
# patch_version = str(self.execution_config.maintenance_run_id)
102102
patch_version = datetime.datetime.strptime(self.execution_config.maintenance_run_id.split(" ")[0], "%m/%d/%Y").strftime('%Y.%m.%d')
103-
self.status_handler.set_patch_metadata_for_healthstore_substatus_json(patch_version=patch_version if patch_version is not None and patch_version is not "" else Constants.PATCH_VERSION_UNKNOWN,
103+
self.status_handler.set_patch_metadata_for_healthstore_substatus_json(patch_version=patch_version if patch_version is not None and patch_version != "" else Constants.PATCH_VERSION_UNKNOWN,
104104
report_to_healthstore=True,
105105
wait_after_update=False)
106106
except ValueError as e:
@@ -209,11 +209,11 @@ def install_updates(self, maintenance_window, package_manager, simulate=False):
209209
self.status_handler.set_reboot_pending(self.is_reboot_pending())
210210

211211
if install_result == Constants.FAILED:
212-
self.status_handler.set_package_install_status(package_manager.get_product_name(package_and_dependencies[0]), package_and_dependency_versions[0], Constants.FAILED)
212+
self.status_handler.set_package_install_status(package_manager.get_product_name(str(package_and_dependencies[0])), str(package_and_dependency_versions[0]), Constants.FAILED)
213213
failed_parent_update_count += 1
214214
patch_installation_successful = False
215215
elif install_result == Constants.INSTALLED:
216-
self.status_handler.set_package_install_status(package_manager.get_product_name(package_and_dependencies[0]), package_and_dependency_versions[0], Constants.INSTALLED)
216+
self.status_handler.set_package_install_status(package_manager.get_product_name(str(package_and_dependencies[0])), str(package_and_dependency_versions[0]), Constants.INSTALLED)
217217
successful_parent_update_count += 1
218218
if package in self.last_still_needed_packages:
219219
index = self.last_still_needed_packages.index(package)
@@ -229,7 +229,7 @@ def install_updates(self, maintenance_window, package_manager, simulate=False):
229229

230230
if package_manager.is_package_version_installed(dependency, dependency_version):
231231
self.composite_logger.log_debug(" - Marking dependency as succeeded: " + str(dependency) + "(" + str(dependency_version) + ")")
232-
self.status_handler.set_package_install_status(package_manager.get_product_name(str(dependency)), dependency_version, Constants.INSTALLED)
232+
self.status_handler.set_package_install_status(package_manager.get_product_name(str(dependency)), str(dependency_version), Constants.INSTALLED)
233233
index = self.last_still_needed_packages.index(dependency)
234234
self.last_still_needed_packages.pop(index)
235235
self.last_still_needed_package_versions.pop(index)

src/core/src/service_interfaces/StatusHandler.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,15 @@ def set_package_assessment_status(self, package_names, package_versions, classif
116116
def set_package_install_status(self, package_names, package_versions, status="Pending", classification=None):
117117
""" Externally available method to set installation status for one or more packages of the **SAME classification and status** """
118118
self.composite_logger.log_debug("Setting package installation status in bulk. [Count={0}]".format(str(len(package_names))))
119+
120+
# Data normalization and corruption guards - if these exceptions hit, a bug has been introduced elsewhere
121+
if isinstance(package_names, str) != isinstance(package_versions, str):
122+
raise Exception("Internal error: Package name and version data corruption detected.")
123+
if isinstance(package_names, str):
124+
package_names, package_versions = [package_names], [package_versions]
125+
if len(package_names) != len(package_versions):
126+
raise Exception("Internal error: Bad package name and version data received for status reporting. [Names={0}][Versions={1}]".format(str(len(package_names)), str(len(package_versions))))
127+
119128
for package_name, package_version in zip(package_names, package_versions):
120129
self.composite_logger.log_debug("Logging progress [Package: " + package_name + "; Status: " + status + "]")
121130
patch_already_saved = False

src/core/tests/TestStatusHandler.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,20 @@ def test_set_package_install_status(self):
5757
self.assertTrue("python-samba_2:4.4.5+dfsg-2ubuntu5.4" in str(json.loads(substatus_file_data["formattedMessage"]["message"])["patches"][0]["patchId"]))
5858
self.assertEqual(json.loads(substatus_file_data["formattedMessage"]["message"])["patches"][2]["patchInstallationState"], "Pending")
5959

60+
def test_set_package_install_status_extended(self):
61+
packages, package_versions = self.runtime.package_manager.get_all_updates()
62+
self.runtime.status_handler.set_package_install_status(packages, package_versions)
63+
with self.runtime.env_layer.file_system.open(self.runtime.execution_config.status_file_path, 'r') as file_handle:
64+
substatus_file_data = json.load(file_handle)[0]["status"]["substatus"][0]
65+
self.assertEqual(substatus_file_data["name"], Constants.PATCH_INSTALLATION_SUMMARY)
66+
self.assertEqual(json.loads(substatus_file_data["formattedMessage"]["message"])["patches"][1]["name"], "samba-common-bin")
67+
self.assertEqual(json.loads(substatus_file_data["formattedMessage"]["message"])["patches"][1]["patchInstallationState"], Constants.PENDING)
68+
self.runtime.status_handler.set_package_install_status("samba-common-bin", "2:4.4.5+dfsg-2ubuntu5.4", Constants.INSTALLED)
69+
with self.runtime.env_layer.file_system.open(self.runtime.execution_config.status_file_path, 'r') as file_handle:
70+
substatus_file_data = json.load(file_handle)[0]["status"]["substatus"][0]
71+
self.assertEqual(json.loads(substatus_file_data["formattedMessage"]["message"])["patches"][1]["name"], "samba-common-bin")
72+
self.assertEqual(json.loads(substatus_file_data["formattedMessage"]["message"])["patches"][1]["patchInstallationState"], Constants.INSTALLED)
73+
6074
def test_set_installation_reboot_status(self):
6175
self.assertRaises(Exception, self.runtime.status_handler.set_installation_reboot_status, "INVALID_STATUS")
6276

src/extension/src/manifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<ExtensionImage xmlns="http://schemas.microsoft.com/windowsazure">
33
<ProviderNameSpace>Microsoft.CPlat.Core</ProviderNameSpace>
44
<Type>LinuxPatchExtension</Type>
5-
<Version>1.6.10</Version>
5+
<Version>1.6.11</Version>
66
<Label>Microsoft Azure VM InGuest Patch Extension for Linux Virtual Machines</Label>
77
<HostingResources>VmRole</HostingResources>
88
<MediaLink></MediaLink>

0 commit comments

Comments
 (0)