Skip to content

Commit d12634e

Browse files
committed
station_server: provide history handlers
While the history handlers do need to match what has been saved on disk, the project provides MfgEvent protobuffer writers out of the box, and no-others, so at least let the out of box experience function as expected, even if you would want to change this in your own implementations. To enable the (built in) writers, something like this is required in your station server. ``` if __name__ == '__main__': openhtf.util.conf.load(station_server_port='4444') interface = mfg_inspector.MfgInspector() interface.set_converter(mfg_event_from_test_record) with station_server.StationServer(history_path="somepath") as server: while 1: test = .... #your tests here test.add_output_callbacks(server.publish_final_state) # explicitly match hardcoded pattern in HistoryListHandler test.add_output_callbacks(interface.save_to_disk("somepath/mfg_event_{dut_id}_{start_time_millis}.pb")) test.execute(test_start=user_input.prompt_for_test_start()) ``` Signed-off-by: Karl Palsson <karlp@etactica.com>
1 parent 4fa142e commit d12634e

File tree

1 file changed

+38
-4
lines changed

1 file changed

+38
-4
lines changed

openhtf/output/servers/station_server.py

+38-4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
import openhtf
2323
from openhtf.output.callbacks import mfg_inspector
24+
from openhtf.output.proto import mfg_event_converter
25+
from openhtf.output.proto import mfg_event_pb2
2426
from openhtf.output.servers import pub_sub
2527
from openhtf.output.servers import web_gui_server
2628
from openhtf.util import conf
@@ -463,8 +465,25 @@ class HistoryItemHandler(BaseHistoryHandler):
463465
def get(self, file_name):
464466
# TODO(Kenadia): Implement the history item handler. The implementation
465467
# depends on the format used to store test records on disk.
466-
self.write('Not implemented.')
467-
self.set_status(500)
468+
# (Out of box disk format is fixed, only subclasses/alternative
469+
# implementations would need to concern themselves with that)
470+
471+
fn = os.path.join(self.history_path, file_name)
472+
if not os.path.isfile(fn):
473+
self.write("Not found")
474+
self.set_status(404)
475+
return
476+
477+
with open(fn, mode="rb") as f:
478+
me = mfg_event_pb2.MfgEvent()
479+
me.ParseFromString(f.read())
480+
from openhtf.core.test_record import TestRecord
481+
tr: TestRecord = mfg_event_converter.test_record_from_mfg_event(me)
482+
test_record_dict = data.convert_to_base_types(tr)
483+
test_state_dict = _test_state_from_record(test_record_dict,
484+
StationPubSub._last_execution_uid)
485+
self.set_status(200)
486+
self.write(test_state_dict)
468487

469488

470489
class HistoryAttachmentsHandler(BaseHistoryHandler):
@@ -479,8 +498,23 @@ class HistoryAttachmentsHandler(BaseHistoryHandler):
479498
def get(self, file_name, attachment_name):
480499
# TODO(Kenadia): Implement the history item handler. The implementation
481500
# depends on the format used to store test records on disk.
482-
self.write('Not implemented.')
483-
self.set_status(500)
501+
fn = os.path.join(self.history_path, file_name)
502+
if not os.path.isfile(fn):
503+
self.write("Not found")
504+
self.set_status(404)
505+
return
506+
507+
with open(fn, mode="rb") as f:
508+
me = mfg_event_pb2.MfgEvent()
509+
me.ParseFromString(f.read())
510+
# TODO - could use sha1 here to check?
511+
desired_real = [a for a in me.attachment if a.name == attachment_name]
512+
if len(desired_real) > 0:
513+
self.write(desired_real[0].value_binary)
514+
self.set_status(200)
515+
else:
516+
self.write("some, but no match?!")
517+
self.set_status(404)
484518

485519

486520
class StationMulticast(multicast.MulticastListener):

0 commit comments

Comments
 (0)