Skip to content

Commit eb5cd0d

Browse files
Merge pull request openmsa#13 from openmsa/2.5/MSA-10045/prasadh
[Workflow] API to get Process log
2 parents d39c442 + bcae9a0 commit eb5cd0d

4 files changed

Lines changed: 111 additions & 53 deletions

File tree

msa_sdk/msa_api.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def process_content(cls, status, comment, new_params, log_response=False):
7979
Response content formated
8080
8181
"""
82-
def log_to_file(log_id, log_msg):
82+
def log_to_file(log_id, log_msg, process_id):
8383
"""
8484
8585
Log a message to a log file with corresponding to a process id.
@@ -92,6 +92,9 @@ def log_to_file(log_id, log_msg):
9292
log_msg: String
9393
Message to be logged
9494
95+
process_id: String
96+
Process Id
97+
9598
Returns
9699
------
97100
Json
@@ -103,7 +106,7 @@ def log_to_file(log_id, log_msg):
103106
constants.PROCESS_LOGS_DIRECTORY,
104107
log_id)
105108
with open(log_file, 'a+') as f_log:
106-
f_log.write('\n=== {} ===\n{}'.format(log_time, log_msg))
109+
f_log.write('\n=== {} ===|{}|\n{}\n=== {} ===|{}|'.format(log_time, process_id, log_msg, log_time, process_id))
107110

108111
response = {
109112
"wo_status": status,
@@ -115,7 +118,7 @@ def log_to_file(log_id, log_msg):
115118

116119
if log_response:
117120
pretty_json = json.dumps(new_params, indent=4)
118-
log_to_file(new_params['SERVICEINSTANCEID'], pretty_json)
121+
log_to_file(new_params['SERVICEINSTANCEID'], pretty_json, new_params['PROCESSINSTANCEID'])
119122

120123
return json_response
121124

msa_sdk/util.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -385,17 +385,19 @@ def cidr_to_subnet_and_subnetmask_address(cidr):
385385
'subnet_mask': str(network.netmask)}
386386

387387

388-
def log_to_process_file(process_id: str, log_message: str) -> bool:
388+
def log_to_process_file(service_id: str, log_message: str, process_id: str=None) -> bool:
389389
"""
390390
391391
Write log string with ISO timestamp to process log file.
392392
393393
Parameters
394394
----------
395-
process_id: String
396-
Process ID of current process
395+
service_id: String
396+
Service ID of current process
397397
log_message: String
398398
Log text
399+
process_id: String
400+
Process ID of current process
399401
400402
Returns
401403
-------
@@ -407,10 +409,17 @@ def log_to_process_file(process_id: str, log_message: str) -> bool:
407409
408410
"""
409411
process_log_path = '{}/process-{}.log'.format(
410-
constants.PROCESS_LOGS_DIRECTORY, process_id)
412+
constants.PROCESS_LOGS_DIRECTORY, service_id)
411413
current_time = datetime.now().isoformat()
412-
log_string = '{date}:{file}:DEBUG:{msg}\n'.format(
413-
date=current_time, file=sys.argv[0].split('/')[-1], msg=log_message)
414+
if not process_id:
415+
log_string = '{date}:{file}:DEBUG:{msg}\n'.format(
416+
date=current_time, file=sys.argv[0].split('/')[-1], msg=log_message)
417+
else:
418+
log_string = '{date}:{file}:|{process_id}|:DEBUG:{msg}\n'.format(
419+
date=current_time, file=sys.argv[0].split('/')[-1], process_id=process_id, msg=log_message)
420+
if "\n" in log_message:
421+
log_string += '{date}:{file}:|{process_id}|\n'.format(
422+
date=current_time, file=sys.argv[0].split('/')[-1], process_id=process_id)
414423
try:
415424
with open(process_log_path, 'a') as log_file:
416425
log_file.write(log_string)

tests/test_msa_api.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ def test_content_with_log(api_fixture, tmpdir):
137137
with patch('msa_sdk.constants.PROCESS_LOGS_DIRECTORY', temp_dir):
138138
api = api_fixture
139139

140-
params = {"SERVICEINSTANCEID": 1234, "Other": "Value"}
140+
params = {"SERVICEINSTANCEID": 1234, "Other": "Value", "PROCESSINSTANCEID": 2345}
141141

142142
response = {
143143
"wo_status": 'ENDED',
@@ -150,8 +150,8 @@ def test_content_with_log(api_fixture, tmpdir):
150150

151151
log_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
152152

153-
log_msg = '\n=== {} ===\n{}'.format(log_time, json.dumps(params,
154-
indent=4))
153+
log_msg = '\n=== {} ===|{}|\n{}\n=== {} ===|{}|'.format(log_time, params['PROCESSINSTANCEID'], json.dumps(params,
154+
indent=4), log_time, params['PROCESSINSTANCEID'])
155155

156156
assert log_msg == open(
157157
'{}/{}'.format(temp_dir, 'process-1234.log'), 'r').read()
@@ -168,8 +168,8 @@ def test_content_with_log_more_lines(api_fixture, tmpdir):
168168
with patch('msa_sdk.constants.PROCESS_LOGS_DIRECTORY', temp_dir):
169169
api = api_fixture
170170

171-
params1 = {"SERVICEINSTANCEID": 1234, "Other": "Value1"}
172-
params2 = {"SERVICEINSTANCEID": 1234, "Other": "Value2"}
171+
params1 = {"SERVICEINSTANCEID": 1234, "Other": "Value1", "PROCESSINSTANCEID": 2345}
172+
params2 = {"SERVICEINSTANCEID": 1234, "Other": "Value2", "PROCESSINSTANCEID": 3456}
173173

174174
response = {
175175
"wo_status": 'ENDED',
@@ -182,16 +182,16 @@ def test_content_with_log_more_lines(api_fixture, tmpdir):
182182

183183
log_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
184184

185-
log_msg_1 = '\n=== {} ===\n{}'.format(log_time, json.dumps(params1,
186-
indent=4))
185+
log_msg_1 = '\n=== {} ===|{}|\n{}\n=== {} ===|{}|'.format(log_time, params1['PROCESSINSTANCEID'], json.dumps(params1,
186+
indent=4), log_time, params1['PROCESSINSTANCEID'] )
187187

188188
assert log_msg_1 == open(
189189
'{}/{}'.format(temp_dir, 'process-1234.log'), 'r').read()
190190

191191
api.process_content('ENDED', 'Task OK', params2, True)
192192

193-
log_msg_2 = '{}\n=== {} ===\n{}'.format(
194-
log_msg_1, log_time, json.dumps(params2, indent=4))
193+
log_msg_2 = '{}\n=== {} ===|{}|\n{}\n=== {} ===|{}|'.format(
194+
log_msg_1, log_time, params2['PROCESSINSTANCEID'], json.dumps(params2, indent=4), log_time, params2['PROCESSINSTANCEID'])
195195

196196
assert log_msg_2 == open(
197197
'{}/{}'.format(temp_dir, 'process-1234.log'), 'r').read()

tests/test_util.py

Lines changed: 81 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -146,24 +146,25 @@ def test_obtain_file_lock_no_previous_file(tmpdir):
146146
result = '{"wo_status": "ENDED", '
147147
result += '"wo_comment": "Lock obtained on the file {}",'.format(f_name)
148148
result += ' "wo_newparams": '
149-
result += '{"SERVICEINSTANCEID": "12345", "process": "abc"}'
149+
result += '{"SERVICEINSTANCEID": "12345", "process": "abc", "PROCESSINSTANCEID": "2345"}'
150150
result += '}'
151151

152152
with patch('msa_sdk.util.constants.UBI_JENTREPRISE_DIRECTORY', f_dir):
153153
with patch('msa_sdk.util.constants.PROCESS_LOGS_DIRECTORY', f_dir_log):
154154
assert obtain_file_lock(
155155
f_name, 'w+',
156-
{"SERVICEINSTANCEID": "12345", "process": "abc"},
156+
{"SERVICEINSTANCEID": "12345", "process": "abc", "PROCESSINSTANCEID": "2345"},
157157
0.5, 2) == result
158158

159159
log_file = '{}/process-12345.log'.format(f_dir_log)
160160

161161
log_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
162162

163-
log_msg = '\n=== {} ===\n{}'.format(
164-
log_time,
163+
log_msg = '\n=== {} ===|{}|\n{}\n=== {} ===|{}|'.format(
164+
log_time, 2345,
165165
('{\n "SERVICEINSTANCEID": "12345",'
166-
'\n "process": "abc"\n}')
166+
'\n "process": "abc",'
167+
'\n "PROCESSINSTANCEID": "2345"\n}'), log_time, 2345
167168
)
168169

169170
assert open(log_file).read() == log_msg
@@ -187,24 +188,25 @@ def test_obtain_file_lock_when_unlocked(tmpdir):
187188
result = '{"wo_status": "ENDED", '
188189
result += '"wo_comment": "Lock obtained on the file {}",'.format(f_name)
189190
result += ' "wo_newparams": '
190-
result += '{"SERVICEINSTANCEID": "12345", "process": "abc"}'
191+
result += '{"SERVICEINSTANCEID": "12345", "process": "abc", "PROCESSINSTANCEID": "2345"}'
191192
result += '}'
192193

193194
with patch('msa_sdk.util.constants.UBI_JENTREPRISE_DIRECTORY', f_dir):
194195
with patch('msa_sdk.util.constants.PROCESS_LOGS_DIRECTORY', f_dir_log):
195196
assert obtain_file_lock(
196197
f_name, 'w+',
197-
{"SERVICEINSTANCEID": "12345", "process": "abc"},
198+
{"SERVICEINSTANCEID": "12345", "process": "abc", "PROCESSINSTANCEID": "2345"},
198199
1, 2) == result
199200

200201
log_file = '{}/process-12345.log'.format(f_dir_log)
201202

202203
log_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
203204

204-
log_msg = '\n=== {} ===\n{}'.format(
205-
log_time,
205+
log_msg = '\n=== {} ===|{}|\n{}\n=== {} ===|{}|'.format(
206+
log_time, 2345,
206207
('{\n "SERVICEINSTANCEID": "12345",'
207-
'\n "process": "abc"\n}')
208+
'\n "process": "abc",'
209+
'\n "PROCESSINSTANCEID": "2345"\n}'), log_time, 2345
208210
)
209211

210212
assert open(log_file).read() == log_msg
@@ -229,7 +231,7 @@ def test_obtain_file_lock_when_locked(tmpdir):
229231
result += '"wo_comment": '
230232
result += '"Lock could not be obtained on the file {}",'.format(f_name)
231233
result += ' "wo_newparams": '
232-
result += '{"SERVICEINSTANCEID": "12346", "process": "abc"}'
234+
result += '{"SERVICEINSTANCEID": "12346", "process": "abc", "PROCESSINSTANCEID": "2345"}'
233235
result += '}'
234236

235237
with patch('msa_sdk.util.constants.UBI_JENTREPRISE_DIRECTORY', f_dir):
@@ -239,16 +241,17 @@ def test_obtain_file_lock_when_locked(tmpdir):
239241
f_dir_log):
240242
assert obtain_file_lock(
241243
f_name, 'w+', {"SERVICEINSTANCEID": "12346",
242-
"process": "abc"}, 0.5, 2) == result
244+
"process": "abc", "PROCESSINSTANCEID": "2345"}, 0.5, 2) == result
243245

244246
log_file = '{}/process-12346.log'.format(f_dir_log)
245247

246248
log_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
247249

248-
log_msg = '\n=== {} ===\n{}'.format(
249-
log_time,
250+
log_msg = '\n=== {} ===|{}|\n{}\n=== {} ===|{}|'.format(
251+
log_time, 2345,
250252
('{\n "SERVICEINSTANCEID": "12346",'
251-
'\n "process": "abc"\n}')
253+
'\n "process": "abc",'
254+
'\n "PROCESSINSTANCEID": "2345"\n}'), log_time, 2345
252255
)
253256

254257
assert open(log_file).read() == log_msg
@@ -274,23 +277,25 @@ def test_obtain_file_lock_content(tmpdir):
274277
result += '"wo_comment": '
275278
result += '"Lock could not be obtained on the file {}",'.format(f_name)
276279
result += ' "wo_newparams": '
277-
result += '{"SERVICEINSTANCEID": "12345", "process": "abc"}'
280+
result += '{"SERVICEINSTANCEID": "12345", "process": "abc", "PROCESSINSTANCEID": "2345"}'
278281
result += '}'
279282

280283
with patch('msa_sdk.util.constants.UBI_JENTREPRISE_DIRECTORY', f_dir):
281284
with patch('msa_sdk.util.constants.PROCESS_LOGS_DIRECTORY', f_dir_log):
282285
assert obtain_file_lock(
283-
f_name, 'w+', {"SERVICEINSTANCEID": "12345", "process": "abc"},
286+
f_name, 'w+', {"SERVICEINSTANCEID": "12345", "process": "abc", "PROCESSINSTANCEID": "2345"},
284287
0.5, 2) == result
285288

286289
log_file = '{}/process-12345.log'.format(f_dir_log)
287290

288291
log_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
289292

290-
log_msg = '\n=== {} ===\n{}'.format(
291-
log_time,
293+
log_msg = '\n=== {} ===|{}|\n{}\n=== {} ===|{}|'.format(
294+
log_time, 2345,
292295
('{\n "SERVICEINSTANCEID": "12345",'
293-
'\n "process": "abc"\n}')
296+
'\n "process": "abc",'
297+
'\n "PROCESSINSTANCEID": "2345"\n}'), log_time, 2345
298+
294299
)
295300

296301
assert open(log_file).read() == log_msg
@@ -302,23 +307,24 @@ def test_obtain_file_lock_content(tmpdir):
302307
result = '{"wo_status": "ENDED", '
303308
result += '"wo_comment": "Lock obtained on the file {}",'.format(f_name)
304309
result += ' "wo_newparams": '
305-
result += '{"SERVICEINSTANCEID": "12346", "process": "abc"}'
310+
result += '{"SERVICEINSTANCEID": "12346", "process": "abc", "PROCESSINSTANCEID": "2345"}'
306311
result += '}'
307312

308313
with patch('msa_sdk.util.constants.UBI_JENTREPRISE_DIRECTORY', f_dir):
309314
with patch('msa_sdk.util.constants.PROCESS_LOGS_DIRECTORY', f_dir_log):
310315
assert obtain_file_lock(
311-
f_name, 'w+', {"SERVICEINSTANCEID": "12346", "process": "abc"},
316+
f_name, 'w+', {"SERVICEINSTANCEID": "12346", "process": "abc", "PROCESSINSTANCEID": "2345"},
312317
0.5, 2) == result
313318

314319
log_file = '{}/process-12346.log'.format(f_dir_log)
315320

316321
log_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
317322

318-
log_msg = '\n=== {} ===\n{}'.format(
319-
log_time,
323+
log_msg = '\n=== {} ===|{}|\n{}\n=== {} ===|{}|'.format(
324+
log_time, 2345,
320325
('{\n "SERVICEINSTANCEID": "12346",'
321-
'\n "process": "abc"\n}')
326+
'\n "process": "abc",'
327+
'\n "PROCESSINSTANCEID": "2345"\n}'), log_time, 2345
322328
)
323329

324330
assert open(log_file).read() == log_msg
@@ -344,23 +350,24 @@ def test_release_file_lock(tmpdir):
344350
result += '"wo_comment": '
345351
result += '"Lock released on the file {}",'.format(f_name)
346352
result += ' "wo_newparams": '
347-
result += '{"SERVICEINSTANCEID": "12345", "process": "abc"}'
353+
result += '{"SERVICEINSTANCEID": "12345", "process": "abc", "PROCESSINSTANCEID": "2345"}'
348354
result += '}'
349355

350356
with patch('msa_sdk.util.constants.UBI_JENTREPRISE_DIRECTORY', f_dir):
351357
with patch('msa_sdk.util.constants.PROCESS_LOGS_DIRECTORY', f_dir_log):
352358
assert release_file_lock(
353-
f_name, {"SERVICEINSTANCEID": "12345", "process": "abc"},
359+
f_name, {"SERVICEINSTANCEID": "12345", "process": "abc", "PROCESSINSTANCEID": "2345"},
354360
0.5, 2) == result
355361

356362
log_file = '{}/process-12345.log'.format(f_dir_log)
357363

358364
log_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
359365

360-
log_msg = '\n=== {} ===\n{}'.format(
361-
log_time,
366+
log_msg = '\n=== {} ===|{}|\n{}\n=== {} ===|{}|'.format(
367+
log_time, 2345,
362368
('{\n "SERVICEINSTANCEID": "12345",'
363-
'\n "process": "abc"\n}')
369+
'\n "process": "abc",'
370+
'\n "PROCESSINSTANCEID": "2345"\n}'), log_time, 2345
364371
)
365372

366373
assert open(log_file).read() == log_msg
@@ -389,25 +396,26 @@ def test_release_file_lock_failed(tmpdir):
389396
result += '"wo_comment": '
390397
result += '"Lock could not be released on the file {}",'.format(f_name)
391398
result += ' "wo_newparams": '
392-
result += '{"SERVICEINSTANCEID": "12345", "process": "abc"}'
399+
result += '{"SERVICEINSTANCEID": "12345", "process": "abc", "PROCESSINSTANCEID": "2345"}'
393400
result += '}'
394401

395402
with patch('msa_sdk.util.constants.UBI_JENTREPRISE_DIRECTORY', f_dir):
396403
with patch('msa_sdk.util.constants.PROCESS_LOGS_DIRECTORY', f_dir_log):
397404
with patch('msa_sdk.util.fcntl.flock') as mock_flock:
398405
mock_flock.side_effect = io.BlockingIOError
399406
assert release_file_lock(
400-
f_name, {"SERVICEINSTANCEID": "12345", "process": "abc"},
407+
f_name, {"SERVICEINSTANCEID": "12345", "process": "abc", "PROCESSINSTANCEID": "2345"},
401408
0.5, 2) == result
402409

403410
log_file = '{}/process-12345.log'.format(f_dir_log)
404411

405412
log_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
406413

407-
log_msg = '\n=== {} ===\n{}'.format(
408-
log_time,
414+
log_msg = '\n=== {} ===|{}|\n{}\n=== {} ===|{}|'.format(
415+
log_time, 2345,
409416
('{\n "SERVICEINSTANCEID": "12345",'
410-
'\n "process": "abc"\n}')
417+
'\n "process": "abc",'
418+
'\n "PROCESSINSTANCEID": "2345"\n}'), log_time, 2345
411419
)
412420

413421
assert open(log_file).read() == log_msg
@@ -435,6 +443,44 @@ def test_log_to_process_file_success(tmpdir):
435443
with open(f'{temp_dir}/process-1234.log', 'r') as log_file:
436444
assert re.match(check_pattern, log_file.read())
437445

446+
def test_log_to_service_file_success(tmpdir):
447+
"""
448+
Test if log to process file is success
449+
"""
450+
451+
temp_dir = tmpdir.mkdir('log_to_process_file_success')
452+
453+
with patch('msa_sdk.constants.PROCESS_LOGS_DIRECTORY', temp_dir):
454+
455+
params = {"SERVICEINSTANCEID": 1234, "Other": "Value", "PROCESSINSTANCEID": 2345}
456+
457+
log_message = 'Lorem ipsum dolor sit amet'
458+
459+
assert log_to_process_file(params['SERVICEINSTANCEID'], log_message, params['PROCESSINSTANCEID'])
460+
461+
check_pattern = f'^.+?:|2345|:DEBUG:{log_message}$'
462+
with open(f'{temp_dir}/process-1234.log', 'r') as log_file:
463+
assert re.match(check_pattern, log_file.read())
464+
465+
def test_log_line_break_to_service_file_success(tmpdir):
466+
"""
467+
Test if log to process file is success
468+
"""
469+
470+
temp_dir = tmpdir.mkdir('log_to_process_file_success')
471+
472+
with patch('msa_sdk.constants.PROCESS_LOGS_DIRECTORY', temp_dir):
473+
474+
params = {"SERVICEINSTANCEID": 1234, "Other": "Value", "PROCESSINSTANCEID": 2345}
475+
476+
log_message = 'Lorem ipsum dolor sit amet\ntest'
477+
478+
assert log_to_process_file(params['SERVICEINSTANCEID'], log_message, params['PROCESSINSTANCEID'])
479+
480+
check_pattern = f'^.+?:|2345|:DEBUG:{log_message}$\n^.+?:|2345|'
481+
with open(f'{temp_dir}/process-1234.log', 'r') as log_file:
482+
assert re.match(check_pattern, log_file.read())
483+
438484

439485
def test_log_to_process_file_fail():
440486
"""

0 commit comments

Comments
 (0)