Skip to content

Commit 68d328f

Browse files
authored
Core fails if telemetery is missing at agent (#54)
1 parent 39950a9 commit 68d328f

File tree

7 files changed

+60
-4
lines changed

7 files changed

+60
-4
lines changed

src/core/src/CoreMain.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ def __init__(self, argv):
6565
status_handler.set_current_operation(Constants.INSTALLATION)
6666
patch_installer = container.get('patch_installer')
6767
patch_installation_successful = patch_installer.start_installation()
68+
patch_assessment_successful = False
6869
patch_assessment_successful = patch_assessor.start_assessment()
6970

7071
except Exception as error:

src/core/src/bootstrap/Constants.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class EnvSettings(EnumBackport):
4747
LOG_FOLDER = "logFolder"
4848
CONFIG_FOLDER = "configFolder"
4949
STATUS_FOLDER = "statusFolder"
50+
EVENTS_FOLDER = "eventsFolder"
5051

5152
class ConfigSettings(EnumBackport):
5253
OPERATION = 'operation'
@@ -171,6 +172,8 @@ class PatchOperationErrorCodes(EnumBackport):
171172
TELEMETRY_INFO = "Info"
172173
TELEMETRY_DEBUG = "Debug"
173174

175+
UTC_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
176+
174177
# EnvLayer Constants
175178
class EnvLayer(EnumBackport):
176179
PRIVILEGED_OP_MARKER = "Privileged_Op_e6df678d-d09b-436a-a08a-65f2f70a6798"

src/core/src/bootstrap/EnvLayer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ def __write_record(self, operation, code, output, delay, timestamp=None):
419419

420420
try:
421421
record = {
422-
"timestamp": str(timestamp) if timestamp is not None else datetime.datetime.strptime(str(datetime.datetime.utcnow()).split(".")[0], "%Y-%m-%dT%H:%M:%SZ"), #WRONG
422+
"timestamp": str(timestamp) if timestamp is not None else datetime.datetime.strptime(str(datetime.datetime.utcnow()).split(".")[0], Constants.UTC_DATETIME_FORMAT), #WRONG
423423
"operation": str(operation),
424424
"code": int(code),
425425
"output": base64.b64encode(str(output)),

src/core/src/core_logic/ExecutionConfig.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def __init__(self, env_layer, composite_logger, execution_parameters):
4141
self.log_folder = self.environment_settings[Constants.EnvSettings.LOG_FOLDER]
4242
self.config_folder = self.environment_settings[Constants.EnvSettings.CONFIG_FOLDER]
4343
self.status_folder = self.environment_settings[Constants.EnvSettings.STATUS_FOLDER]
44+
self.events_folder = self.environment_settings[Constants.EnvSettings.EVENTS_FOLDER]
4445

4546
# Config Settings
4647
self.composite_logger.log_debug(" - Parsing configuration settings... [ConfigSettings={0}]".format(str(self.config_settings)))

src/core/src/core_logic/PatchAssessor.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ def __init__(self, env_layer, execution_config, composite_logger, telemetry_writ
3333

3434
def start_assessment(self):
3535
""" Start an update assessment """
36-
self.composite_logger.log('\nStarting patch assessment...')
3736
self.status_handler.set_current_operation(Constants.ASSESSMENT)
37+
self.telemetry_setup()
38+
39+
self.composite_logger.log('\nStarting patch assessment...')
3840

3941
self.status_handler.set_assessment_substatus_json(status=Constants.STATUS_TRANSITIONING)
4042
self.composite_logger.log("\nMachine Id: " + self.env_layer.platform.node())
@@ -72,3 +74,14 @@ def start_assessment(self):
7274

7375
self.composite_logger.log("\nPatch assessment completed.\n")
7476
return True
77+
78+
def telemetry_setup(self):
79+
""" Verifies if telemetry is available. Stops execution is not available """
80+
if self.execution_config.events_folder is None:
81+
error_msg = "The minimum Azure Linux Agent version prerequisite for Linux patching was not met. Please update the Azure Linux Agent on this machine."
82+
self.composite_logger.log_error(error_msg)
83+
raise Exception(error_msg)
84+
85+
#ToDo: Ensure telemetry is setup correctly at this point
86+
self.composite_logger.log("The minimum Azure Linux Agent version prerequisite for Linux patching was met.")
87+

src/core/tests/TestCoreMain.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,43 @@ def test_assessment_operation_fail(self):
209209
self.assertEqual(len(json.loads(substatus_file_data[0]["formattedMessage"]["message"])["errors"]["details"]), 2)
210210
runtime.stop()
211211

212+
def test_assessment_operation_fail_due_to_no_telemetry(self):
213+
argument_composer = ArgumentComposer()
214+
argument_composer.operation = Constants.ASSESSMENT
215+
runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True, Constants.ZYPPER)
216+
runtime.set_legacy_test_type('HappyPath')
217+
runtime.execution_config.events_folder = None
218+
CoreMain(argument_composer.get_composed_arguments())
219+
220+
with runtime.env_layer.file_system.open(runtime.execution_config.status_file_path, 'r') as file_handle:
221+
substatus_file_data = json.load(file_handle)[0]["status"]["substatus"]
222+
self.assertEquals(len(substatus_file_data), 1)
223+
self.assertTrue(substatus_file_data[0]["name"] == Constants.PATCH_ASSESSMENT_SUMMARY)
224+
self.assertTrue(substatus_file_data[0]["status"] == Constants.STATUS_ERROR.lower())
225+
self.assertEqual(len(json.loads(substatus_file_data[0]["formattedMessage"]["message"])["errors"]["details"]), 1)
226+
self.assertTrue("The minimum Azure Linux Agent version prerequisite for Linux patching was not met" in json.loads(substatus_file_data[0]["formattedMessage"]["message"])["errors"]["details"][0]["message"])
227+
runtime.stop()
228+
229+
def test_installation_operation_fail_due_to_no_telemetry(self):
230+
# testing on auto patching request
231+
argument_composer = ArgumentComposer()
232+
argument_composer.maintenance_run_id = str(datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"))
233+
runtime = RuntimeCompositor(argument_composer.get_composed_arguments(), True, Constants.ZYPPER)
234+
runtime.set_legacy_test_type('SuccessInstallPath')
235+
runtime.execution_config.events_folder = None
236+
CoreMain(argument_composer.get_composed_arguments())
237+
238+
with runtime.env_layer.file_system.open(runtime.execution_config.status_file_path, 'r') as file_handle:
239+
substatus_file_data = json.load(file_handle)[0]["status"]["substatus"]
240+
self.assertEquals(len(substatus_file_data), 3)
241+
self.assertTrue(substatus_file_data[0]["name"] == Constants.PATCH_ASSESSMENT_SUMMARY)
242+
self.assertTrue(substatus_file_data[0]["status"] == Constants.STATUS_ERROR.lower())
243+
self.assertEqual(len(json.loads(substatus_file_data[0]["formattedMessage"]["message"])["errors"]["details"]), 1)
244+
self.assertTrue("The minimum Azure Linux Agent version prerequisite for Linux patching was not met" in json.loads(substatus_file_data[0]["formattedMessage"]["message"])["errors"]["details"][0]["message"])
245+
self.assertTrue(substatus_file_data[1]["name"] == Constants.PATCH_INSTALLATION_SUMMARY)
246+
self.assertTrue(substatus_file_data[1]["status"] == Constants.STATUS_ERROR.lower())
247+
runtime.stop()
248+
212249

213250
if __name__ == '__main__':
214251
unittest.main()

src/core/tests/library/ArgumentComposer.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def __init__(self):
3636
self.sequence_number = 1
3737

3838
# environment settings
39-
self.__log_folder = self.__config_folder = self.__status_folder = self.__get_scratch_folder()
39+
self.__log_folder = self.__config_folder = self.__status_folder = self.__events_folder = self.__get_scratch_folder()
4040

4141
# config settings
4242
self.operation = Constants.INSTALLATION
@@ -57,7 +57,8 @@ def get_composed_arguments(self):
5757
environment_settings = {
5858
"logFolder": self.__log_folder,
5959
"configFolder": self.__config_folder,
60-
"statusFolder": self.__status_folder
60+
"statusFolder": self.__status_folder,
61+
"eventsFolder": self.__events_folder
6162
}
6263

6364
config_settings = {

0 commit comments

Comments
 (0)