def test_create_telemetry_note_file_from_scratch(self): with TelemetryNote(self.workDir) as note: self.assert_modify_time(note.path, datetime.timedelta(seconds=1)) self.assertTrue(os.path.exists(note.path)) self.assertEqual(datetime.datetime.min, note.get_last_sent()) with self.assertRaises(portalocker.AlreadyLocked): with TelemetryNote(self.workDir): self.assertFalse(True) self.set_modify_time(note.path) note.touch() self.assert_modify_time(note.path, datetime.timedelta(seconds=1)) note.update_telemetry_note(self.SAMPLE_TIME_1) # newly create file is not readable self.assertEqual(datetime.datetime.min, note.get_last_sent()) with TelemetryNote(self.workDir) as note: self.assertEqual(self.SAMPLE_TIME_1, note.get_last_sent()) with self.assertRaises(portalocker.AlreadyLocked): with TelemetryNote(self.workDir): self.assertFalse(True)
def test_open_telemetry_note_file(self): with open(TelemetryNote.get_file_path(self.workDir), mode='w') as fq: fq.write(self.SAMPLE_TIME_1.strftime('%Y-%m-%dT%H:%M:%S')) with TelemetryNote(self.workDir) as note: self.assertEqual(self.SAMPLE_TIME_1, note.get_last_sent()) with self.assertRaises(portalocker.AlreadyLocked): with TelemetryNote(self.workDir): self.assertFalse(True) note.update_telemetry_note(self.SAMPLE_TIME_2) with TelemetryNote(self.workDir) as note: self.assertEqual(self.SAMPLE_TIME_2, note.get_last_sent())
def main(): from azure.cli.telemetry.util import should_upload from azure.cli.telemetry.components.telemetry_note import TelemetryNote from azure.cli.telemetry.components.records_collection import RecordsCollection from azure.cli.telemetry.components.telemetry_client import CliTelemetryClient from azure.cli.telemetry.components.telemetry_logging import config_logging_for_upload, get_logger try: config_dir = sys.argv[1] config_logging_for_upload(config_dir) logger = get_logger('main') logger.info('Attempt start. Configuration directory [%s].', sys.argv[1]) if not should_upload(config_dir): logger.info( 'Exit early. The note file indicates it is not a suitable time to upload telemetry.' ) sys.exit(0) try: with TelemetryNote(config_dir) as telemetry_note: telemetry_note.touch() collection = RecordsCollection(telemetry_note.get_last_sent(), config_dir) collection.snapshot_and_read() client = CliTelemetryClient() for each in collection: client.add(each, flush=True) client.flush(force=True) telemetry_note.update_telemetry_note(collection.next_send) except portalocker.AlreadyLocked: # another upload process is running. logger.info( 'Lock out from note file under %s which means another process is running. Exit 0.', config_dir) sys.exit(0) except IOError as err: logger.warning('Unexpected IO Error %s. Exit 1.', err) sys.exit(1) except Exception as err: # pylint: disable=broad-except logger.error('Unexpected Error %s. Exit 2.', err) logger.exception(err) sys.exit(2) except IndexError: sys.exit(1)