quarchpy 2.2.5__py2.py3-none-any.whl → 2.2.7.dev1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. quarchpy/.idea/misc.xml +4 -1
  2. quarchpy/.idea/modules.xml +0 -1
  3. quarchpy/.idea/quarchpy.iml +1 -2
  4. quarchpy/.idea/workspace.xml +28 -72
  5. quarchpy/_version.py +1 -1
  6. quarchpy/config_files/__pycache__/__init__.cpython-313.pyc +0 -0
  7. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-313.pyc +0 -0
  8. quarchpy/connection_specific/QPS/win-amd64/app.jar +0 -0
  9. quarchpy/connection_specific/QPS/win-amd64/qis/README.txt +2 -2
  10. quarchpy/connection_specific/QPS/win-amd64/qis/help.txt +2 -2
  11. quarchpy/connection_specific/QPS/win-amd64/qis/qis.jar +0 -0
  12. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/{CInterface-2.2.jar → CInterface-2.3.jar} +0 -0
  13. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/QuarchCommon-2.0.jar +0 -0
  14. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/TorridonCommon-1.0.jar +0 -0
  15. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jmdns-3.6.0.jar +0 -0
  16. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/usb4java-1.3.1.jar +0 -0
  17. quarchpy/connection_specific/QPS/win-amd64/qps-command-reference.html +331 -0
  18. quarchpy/connection_specific/QPS/win-amd64/qps_lib/JFXUtilities-1.0.jar +0 -0
  19. quarchpy/connection_specific/QPS/win-amd64/qps_lib/QuarchCommon-2.0.jar +0 -0
  20. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-base-21.0.4-linux.jar → javafx-base-21.0.5-linux.jar} +0 -0
  21. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-controls-21.0.4-linux.jar → javafx-controls-21.0.5-linux.jar} +0 -0
  22. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-fxml-21.0.4-linux.jar → javafx-fxml-21.0.5-linux.jar} +0 -0
  23. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-graphics-21.0.4-linux.jar → javafx-graphics-21.0.5-linux.jar} +0 -0
  24. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-swing-21.0.4-linux.jar → javafx-swing-21.0.5-linux.jar} +0 -0
  25. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-base-21.0.4-mac-aarch64.jar → javafx-base-21.0.5-mac-aarch64.jar} +0 -0
  26. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-controls-21.0.4-mac-aarch64.jar → javafx-controls-21.0.5-mac-aarch64.jar} +0 -0
  27. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-fxml-21.0.4-mac-aarch64.jar → javafx-fxml-21.0.5-mac-aarch64.jar} +0 -0
  28. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-graphics-21.0.4-mac-aarch64.jar → javafx-graphics-21.0.5-mac-aarch64.jar} +0 -0
  29. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-swing-21.0.4-mac-aarch64.jar → javafx-swing-21.0.5-mac-aarch64.jar} +0 -0
  30. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-base-21.0.4-mac.jar → javafx-base-21.0.5-mac.jar} +0 -0
  31. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-controls-21.0.4-mac.jar → javafx-controls-21.0.5-mac.jar} +0 -0
  32. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-fxml-21.0.4-mac.jar → javafx-fxml-21.0.5-mac.jar} +0 -0
  33. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-graphics-21.0.4-mac.jar → javafx-graphics-21.0.5-mac.jar} +0 -0
  34. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-swing-21.0.4-mac.jar → javafx-swing-21.0.5-mac.jar} +0 -0
  35. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-base-21.0.4-win.jar → javafx-base-21.0.5-win.jar} +0 -0
  36. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-controls-21.0.4-win.jar → javafx-controls-21.0.5-win.jar} +0 -0
  37. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-fxml-21.0.4-win.jar → javafx-fxml-21.0.5-win.jar} +0 -0
  38. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-graphics-21.0.4-win.jar → javafx-graphics-21.0.5-win.jar} +0 -0
  39. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-swing-21.0.4-win.jar → javafx-swing-21.0.5-win.jar} +0 -0
  40. quarchpy/connection_specific/QPS/win-amd64/scriptCommands.txt +59 -3
  41. quarchpy/connection_specific/QPS/win-amd64/whats-new.txt +12 -20
  42. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-313.pyc +0 -0
  43. quarchpy/connection_specific/__pycache__/__init__.cpython-313.pyc +0 -0
  44. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-313.pyc +0 -0
  45. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-313.pyc +0 -0
  46. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-313.pyc +0 -0
  47. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-313.pyc +0 -0
  48. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-313.pyc +0 -0
  49. quarchpy/connection_specific/__pycache__/connection_Telnet.cpython-313.pyc +0 -0
  50. quarchpy/connection_specific/__pycache__/connection_USB.cpython-313.pyc +0 -0
  51. quarchpy/connection_specific/__pycache__/mDNS.cpython-313.pyc +0 -0
  52. quarchpy/connection_specific/connection_QPS.py +7 -3
  53. quarchpy/connection_specific/connection_QPS.py.bak +242 -0
  54. quarchpy/connection_specific/jdk_j21_jres/__pycache__/__init__.cpython-313.pyc +0 -0
  55. quarchpy/connection_specific/jdk_j21_jres/__pycache__/fix_permissions.cpython-313.pyc +0 -0
  56. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-313.pyc +0 -0
  57. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-313.pyc +0 -0
  58. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-313.pyc +0 -0
  59. quarchpy/connection_specific/serial/__pycache__/win32.cpython-313.pyc +0 -0
  60. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  61. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-313.pyc +0 -0
  62. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-313.pyc +0 -0
  63. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-313.pyc +0 -0
  64. quarchpy/debug/__pycache__/SystemTest.cpython-313.pyc +0 -0
  65. quarchpy/debug/__pycache__/__init__.cpython-313.pyc +0 -0
  66. quarchpy/debug/__pycache__/module_debug.cpython-313.pyc +0 -0
  67. quarchpy/debug/__pycache__/simple_terminal.cpython-313.pyc +0 -0
  68. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-313.pyc +0 -0
  69. quarchpy/debug/__pycache__/versionCompare.cpython-313.pyc +0 -0
  70. quarchpy/device/__pycache__/__init__.cpython-313.pyc +0 -0
  71. quarchpy/device/__pycache__/device.cpython-313.pyc +0 -0
  72. quarchpy/device/__pycache__/quarchArray.cpython-313.pyc +0 -0
  73. quarchpy/device/__pycache__/quarchPPM.cpython-313.pyc +0 -0
  74. quarchpy/device/__pycache__/quarchQPS.cpython-313.pyc +0 -0
  75. quarchpy/device/__pycache__/scanDevices.cpython-313.pyc +0 -0
  76. quarchpy/device/quarchPPM.py +1 -1
  77. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-313.pyc +0 -0
  78. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-313.pyc +0 -0
  79. quarchpy/disk_test/__pycache__/__init__.cpython-313.pyc +0 -0
  80. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-313.pyc +0 -0
  81. quarchpy/docs/CHANGES.rst +17 -0
  82. quarchpy/docs/_build/doctrees/CHANGES.doctree +0 -0
  83. quarchpy/docs/_build/doctrees/environment.pickle +0 -0
  84. quarchpy/docs/_build/doctrees/index.doctree +0 -0
  85. quarchpy/docs/_build/doctrees/readme.doctree +0 -0
  86. quarchpy/docs/_build/doctrees/source/changelog.doctree +0 -0
  87. quarchpy/docs/_build/doctrees/source/licenses.doctree +0 -0
  88. quarchpy/docs/_build/doctrees/source/modules.doctree +0 -0
  89. quarchpy/docs/_build/doctrees/source/quarchpy.calibration.doctree +0 -0
  90. quarchpy/docs/_build/doctrees/source/quarchpy.config_files.doctree +0 -0
  91. quarchpy/docs/_build/doctrees/source/quarchpy.connection_specific.doctree +0 -0
  92. quarchpy/docs/_build/doctrees/source/quarchpy.debug.doctree +0 -0
  93. quarchpy/docs/_build/doctrees/source/quarchpy.device.doctree +0 -0
  94. quarchpy/docs/_build/doctrees/source/quarchpy.disk_test.doctree +0 -0
  95. quarchpy/docs/_build/doctrees/source/quarchpy.doctree +0 -0
  96. quarchpy/docs/_build/doctrees/source/quarchpy.fio.doctree +0 -0
  97. quarchpy/docs/_build/doctrees/source/quarchpy.iometer.doctree +0 -0
  98. quarchpy/docs/_build/doctrees/source/quarchpy.qis.doctree +0 -0
  99. quarchpy/docs/_build/doctrees/source/quarchpy.qps.doctree +0 -0
  100. quarchpy/docs/_build/doctrees/source/quarchpy.user_interface.doctree +0 -0
  101. quarchpy/docs/_build/doctrees/source/quarchpy.utilities.doctree +0 -0
  102. quarchpy/docs/_build/doctrees/source/readme.doctree +0 -0
  103. quarchpy/docs/_build/html/.buildinfo +2 -2
  104. quarchpy/docs/_build/html/.buildinfo.bak +4 -0
  105. quarchpy/docs/_build/html/CHANGES.html +176 -150
  106. quarchpy/docs/_build/html/_sources/CHANGES.rst.txt +14 -0
  107. quarchpy/docs/_build/html/_static/alabaster.css +47 -87
  108. quarchpy/docs/_build/html/_static/basic.css +3 -14
  109. quarchpy/docs/_build/html/_static/doctools.js +0 -7
  110. quarchpy/docs/_build/html/_static/github-banner.svg +5 -0
  111. quarchpy/docs/_build/html/_static/language_data.js +1 -8
  112. quarchpy/docs/_build/html/_static/pygments.css +2 -1
  113. quarchpy/docs/_build/html/_static/searchtools.js +129 -71
  114. quarchpy/docs/_build/html/genindex.html +22 -55
  115. quarchpy/docs/_build/html/index.html +90 -85
  116. quarchpy/docs/_build/html/objects.inv +0 -0
  117. quarchpy/docs/_build/html/py-modindex.html +20 -29
  118. quarchpy/docs/_build/html/readme.html +20 -19
  119. quarchpy/docs/_build/html/search.html +14 -14
  120. quarchpy/docs/_build/html/searchindex.js +1 -1
  121. quarchpy/docs/_build/html/source/changelog.html +246 -216
  122. quarchpy/docs/_build/html/source/licenses.html +20 -19
  123. quarchpy/docs/_build/html/source/modules.html +22 -21
  124. quarchpy/docs/_build/html/source/quarchpy.calibration.html +20 -19
  125. quarchpy/docs/_build/html/source/quarchpy.config_files.html +20 -19
  126. quarchpy/docs/_build/html/source/quarchpy.connection_specific.html +22 -37
  127. quarchpy/docs/_build/html/source/quarchpy.debug.html +20 -19
  128. quarchpy/docs/_build/html/source/quarchpy.device.html +21 -20
  129. quarchpy/docs/_build/html/source/quarchpy.disk_test.html +20 -19
  130. quarchpy/docs/_build/html/source/quarchpy.fio.html +22 -47
  131. quarchpy/docs/_build/html/source/quarchpy.html +22 -37
  132. quarchpy/docs/_build/html/source/quarchpy.iometer.html +26 -25
  133. quarchpy/docs/_build/html/source/quarchpy.qis.html +20 -19
  134. quarchpy/docs/_build/html/source/quarchpy.qps.html +20 -19
  135. quarchpy/docs/_build/html/source/quarchpy.user_interface.html +20 -19
  136. quarchpy/docs/_build/html/source/quarchpy.utilities.html +20 -19
  137. quarchpy/docs/_build/html/source/readme.html +20 -19
  138. quarchpy/fio/FIO_interface.py +255 -1
  139. quarchpy/fio/FIO_interface.py.bak +317 -0
  140. quarchpy/fio/__pycache__/FIO_interface.cpython-313.pyc +0 -0
  141. quarchpy/fio/__pycache__/__init__.cpython-313.pyc +0 -0
  142. quarchpy/fio/__pycache__/fioDiskFinder.cpython-313.pyc +0 -0
  143. quarchpy/iometer/__pycache__/__init__.cpython-313.pyc +0 -0
  144. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-313.pyc +0 -0
  145. quarchpy/iometer/__pycache__/iometerFuncs.cpython-313.pyc +0 -0
  146. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-313.pyc +0 -0
  147. quarchpy/qis/__pycache__/__init__.cpython-313.pyc +0 -0
  148. quarchpy/qis/__pycache__/qisFuncs.cpython-313.pyc +0 -0
  149. quarchpy/qps/__pycache__/__init__.cpython-313.pyc +0 -0
  150. quarchpy/qps/__pycache__/qpsFuncs.cpython-313.pyc +0 -0
  151. quarchpy/qps/qpsFuncs.py +1 -1
  152. quarchpy/user_interface/__pycache__/__init__.cpython-313.pyc +0 -0
  153. quarchpy/user_interface/__pycache__/user_interface.cpython-313.pyc +0 -0
  154. quarchpy/utilities/__pycache__/TestCenter.cpython-313.pyc +0 -0
  155. quarchpy/utilities/__pycache__/TimeValue.cpython-313.pyc +0 -0
  156. quarchpy/utilities/__pycache__/Version.cpython-313.pyc +0 -0
  157. quarchpy/utilities/__pycache__/__init__.cpython-313.pyc +0 -0
  158. {quarchpy-2.2.5.dist-info → quarchpy-2.2.7.dev1.dist-info}/METADATA +29 -3
  159. {quarchpy-2.2.5.dist-info → quarchpy-2.2.7.dev1.dist-info}/RECORD +161 -104
  160. {quarchpy-2.2.5.dist-info → quarchpy-2.2.7.dev1.dist-info}/WHEEL +1 -1
  161. quarchpy/__pycache__/__init__.cpython-311.pyc +0 -0
  162. quarchpy/__pycache__/_version.cpython-311.pyc +0 -0
  163. quarchpy/__pycache__/connection.cpython-311.pyc +0 -0
  164. quarchpy/__pycache__/run.cpython-311.pyc +0 -0
  165. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jmdns-3.5.9.jar +0 -0
  166. {quarchpy-2.2.5.dist-info → quarchpy-2.2.7.dev1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,317 @@
1
+ import os
2
+ import time
3
+ import json
4
+ from datetime import datetime
5
+ import subprocess
6
+
7
+ all_outputs={"terse_version_3":"0",
8
+ "fio_version":"1",
9
+ "jobname":"2",
10
+ "groupid":"3",
11
+ "error":"4",
12
+ "read_kb":"5",
13
+ "read_bandwidth":"6",
14
+ "read_iops":"7",
15
+ "read_runtime_ms":"8",
16
+ "read_slat_min":"9",
17
+ "read_slat_max":"10",
18
+ "read_slat_mean":"11",
19
+ "read_slat_dev":"12",
20
+ "read_clat_min":"13",
21
+ "read_clat_max":"14",
22
+ "read_clat_mean":"15",
23
+ "read_clat_dev":"16",
24
+ "read_clat_pct01":"17",
25
+ "read_clat_pct02":"18",
26
+ "read_clat_pct03":"19",
27
+ "read_clat_pct04":"20",
28
+ "read_clat_pct05":"21",
29
+ "read_clat_pct06":"22",
30
+ "read_clat_pct07":"23",
31
+ "read_clat_pct08":"24",
32
+ "read_clat_pct09":"25",
33
+ "read_clat_pct10":"26",
34
+ "read_clat_pct11":"27",
35
+ "read_clat_pct12":"28",
36
+ "read_clat_pct13":"29",
37
+ "read_clat_pct14":"30",
38
+ "read_clat_pct15":"31",
39
+ "read_clat_pct16":"32",
40
+ "read_clat_pct17":"33",
41
+ "read_clat_pct18":"34",
42
+ "read_clat_pct19":"35",
43
+ "read_clat_pct20":"36",
44
+ "read_tlat_min":"37",
45
+ "read_lat_max":"38",
46
+ "read_lat_mean":"39",
47
+ "read_lat_dev":"40",
48
+ "read_bw_min":"41",
49
+ "read_bw_max":"42",
50
+ "read_bw_agg_pct":"43",
51
+ "read_bw_mean":"44",
52
+ "read_bw_dev":"45",
53
+ "write_kb":"46",
54
+ "write_bandwidth":"47",
55
+ "write_iops":"48",
56
+ "write_runtime_ms":"49",
57
+ "write_slat_min":"50",
58
+ "write_slat_max":"51",
59
+ "write_slat_mean":"52",
60
+ "write_slat_dev":"53",
61
+ "write_clat_min":"54",
62
+ "write_clat_max":"55",
63
+ "write_clat_mean":"56",
64
+ "write_clat_dev":"57",
65
+ "write_clat_pct01":"58",
66
+ "write_clat_pct02":"59",
67
+ "write_clat_pct03":"60",
68
+ "write_clat_pct04":"61",
69
+ "write_clat_pct05":"62",
70
+ "write_clat_pct06":"63",
71
+ "write_clat_pct07":"64",
72
+ "write_clat_pct08":"65",
73
+ "write_clat_pct09":"66",
74
+ "write_clat_pct10":"67",
75
+ "write_clat_pct11":"68",
76
+ "write_clat_pct12":"69",
77
+ "write_clat_pct13":"70",
78
+ "write_clat_pct14":"71",
79
+ "write_clat_pct15":"72",
80
+ "write_clat_pct16":"73",
81
+ "write_clat_pct17":"74",
82
+ "write_clat_pct18":"75",
83
+ "write_clat_pct19":"76",
84
+ "write_clat_pct20":"77",
85
+ "write_tlat_min":"78",
86
+ "write_lat_max":"79",
87
+ "write_lat_mean":"80",
88
+ "write_lat_dev":"81",
89
+ "write_bw_min":"82",
90
+ "write_bw_max":"83",
91
+ "write_bw_agg_pct":"84",
92
+ "write_bw_mean":"85",
93
+ "write_bw_dev":"86",
94
+ "cpu_user":"87",
95
+ "cpu_sys":"88",
96
+ "cpu_csw":"89",
97
+ "cpu_mjf":"90",
98
+ "cpu_minf":"91",
99
+ "iodepth_1":"92",
100
+ "iodepth_2":"93",
101
+ "iodepth_4":"94",
102
+ "iodepth_8":"95",
103
+ "iodepth_16":"96",
104
+ "iodepth_32":"97",
105
+ "iodepth_64":"98",
106
+ "lat_2us":"99",
107
+ "lat_4us":"100",
108
+ "lat_10us":"101",
109
+ "lat_20us":"102",
110
+ "lat_50us":"103",
111
+ "lat_100us":"104",
112
+ "lat_250us":"105",
113
+ "lat_500us":"106",
114
+ "lat_750us":"107",
115
+ "lat_1000us":"108",
116
+ "lat_2ms":"109",
117
+ "lat_4ms":"110",
118
+ "lat_10ms":"111",
119
+ "lat_20ms":"112",
120
+ "lat_50ms":"113",
121
+ "lat_100ms":"114",
122
+ "lat_250ms":"115",
123
+ "lat_500ms":"116",
124
+ "lat_750ms":"117",
125
+ "lat_1000ms":"118",
126
+ "lat_2000ms":"119",
127
+ "lat_over_2000ms":"120",
128
+ "disk_name":"121",
129
+ "disk_read_iops":"122",
130
+ "disk_write_iops":"123",
131
+ "disk_read_merges":"124",
132
+ "disk_write_merges":"125",
133
+ "disk_read_ticks":"126",
134
+ "write_ticks":"127",
135
+ "disk_queue_time":"128",
136
+ "disk_util":"129"}
137
+
138
+ out_data = {}
139
+
140
+ def follow(thefile, p):
141
+ thefile.seek(0,2)
142
+ #flag for exiting the loop
143
+ processCompleted = False
144
+
145
+ while processCompleted == False:
146
+ line = thefile.readline()
147
+
148
+ #only exists if process is finished and no more data from file
149
+ if p.poll() is not None and not line:
150
+ #yield a specific string we can identify
151
+ yield ("quarch_end_Process")
152
+ processCompleted = True
153
+
154
+ if not line:
155
+ time.sleep(0.1)
156
+ continue
157
+ yield line
158
+
159
+
160
+ def return_data(output_file, p, fioCallbacks, myStream, user_data, arguments):
161
+
162
+ isThreaded = True
163
+ #checking to see if the first line of file needs to be skipped = Windows only
164
+ if os.name == "nt":
165
+ isThreaded = False
166
+ for i in arguments:
167
+ #only needs to be skipped if the "thread" argument has not been issued
168
+ if (str(i.lower()) == "thread"):
169
+ isThreaded = True
170
+
171
+ info_out = {}
172
+ logfile = open(output_file,"r")
173
+ loglines = follow(logfile, p)
174
+
175
+ #variables for parsing json
176
+ iterator = 0
177
+ jobCount = 0
178
+ jsonLines = ""
179
+ openBracketCount = 0
180
+ closeBracketCount = 0
181
+ # Init the job end time to the current start time
182
+ jobEndTime = int(round(time.time() * 1000))
183
+
184
+ for line in loglines:
185
+
186
+
187
+ if (isThreaded == False):
188
+ #skip the very first line -- (title line) --
189
+ if iterator == 0:
190
+ iterator = iterator + 1
191
+ #marking threaded as true for remainder of read > Efficiency
192
+ isThreaded = True
193
+ continue
194
+
195
+ #add to iterator - not needed, may be useful later
196
+ iterator = iterator + 1
197
+
198
+ #concat strings
199
+ jsonLines += line
200
+
201
+ #finding brackets withing json
202
+ if '{' in line:
203
+ openBracketCount = openBracketCount + 1
204
+ if '}' in line:
205
+ closeBracketCount = closeBracketCount + 1
206
+
207
+ #an equal amount of brackets denotes the end of a json object
208
+ if openBracketCount == closeBracketCount and openBracketCount != 0:
209
+ try:
210
+ #format into a json parsable string
211
+ TempJsonObject = jsonLines[ 0 : jsonLines.rindex('}') + 1 ]
212
+
213
+ #parse json
214
+ jsonobject = json.loads(TempJsonObject)
215
+
216
+ #checking for first job
217
+ if (jobCount == 0):
218
+ #getting start time of job
219
+ startTime = (jsonobject['timestamp_ms'] - jsonobject['jobs'][0]['read']['runtime'])
220
+ comment = str(arguments).replace(",","\n").replace("}","").replace("{","")
221
+ jobName = str(jsonobject['jobs'][0]['jobname'])
222
+ #adding start annotation
223
+ fioCallbacks["TEST_START"](myStream, str(startTime), jobName, comment)
224
+
225
+ #pass specific data
226
+ readDataValue = jsonobject['jobs'][0]['read']['iops']
227
+ writeDataValue = jsonobject['jobs'][0]['write']['iops']
228
+ blockSize=jsonobject['global options']['bs']
229
+ #converted to ditionary - easy script use
230
+ dataValues = {"read_iops" : readDataValue, "write_iops" : writeDataValue, "block_size":blockSize}
231
+ jobEndTime = str(jsonobject['timestamp_ms'])
232
+ fioCallbacks["TEST_RESULT"](myStream, jobEndTime, dataValues)
233
+
234
+ #jsonLines variable is now all characters after last job + any new that come in
235
+ jsonLines = jsonLines[jsonLines.rindex('}') + 1 : ]
236
+
237
+ #add 1 to the job count
238
+ jobCount += 1
239
+
240
+ except:
241
+ #exception caused by not being able to find substring -- Last json object --
242
+ pass
243
+
244
+
245
+
246
+ #looks for end of process and the specific string we return indicating end of file
247
+ if p.poll() is not None:
248
+ if line == "quarch_end_Process":
249
+ time.sleep(0.1)
250
+ #callback to end test -- adds 1 milli second so this time is always after the last data point --
251
+ fioCallbacks["TEST_END"](myStream, str(int(jobEndTime) + 1))
252
+ #CLOSE FILE ON FINISH
253
+ logfile.close()
254
+ return
255
+
256
+ def start_fio(output_file, mode, options, fileName=""):
257
+
258
+ if mode == "cli":
259
+ command = command + " > pipe"
260
+
261
+ #command line to be sent -- output is in json format --
262
+ if mode == "file":
263
+ command = "fio " + fileName + " --log_unix_epoch=1 --output-format=json --output="+ output_file + " --status-interval=1 --eta=never"
264
+
265
+ if mode == "arg":
266
+ command = "fio --log_unix_epoch=1 --output-format=json"
267
+
268
+ for i in options:
269
+ if (options[i] == ""):
270
+ command = command + " --" + i
271
+ else:
272
+ command = command + " --" + i + "=" + options[i]
273
+ command = command + " > pipe"
274
+
275
+ #removes the output file if it already exists.
276
+ if os.path.exists(output_file):
277
+ os.remove(output_file)
278
+
279
+ if os.path.exists("pipe"):
280
+ os.remove("pipe")
281
+
282
+ print(command)
283
+ p = subprocess.Popen(command, shell=True)
284
+
285
+ while not os.path.exists(output_file):
286
+ time.sleep(0.1)
287
+
288
+ return p
289
+
290
+ def runFIO(myStream, mode, fioCallbacks, user_data, arguments="", file_name=""):
291
+
292
+ try:
293
+ xrange
294
+ except NameError:
295
+ xrange = range
296
+
297
+ for i in xrange(0,len(arguments)):
298
+
299
+ try:
300
+ arguments_ori = arguments[i]
301
+ except:
302
+ arguments_ori = arguments
303
+
304
+ output_file = arguments_ori["output"]
305
+ if (file_name != ""):
306
+ #allows filename with spaces
307
+ file_name = "\"" + file_name + "\""
308
+
309
+ p = start_fio(output_file, mode, arguments_ori, file_name)
310
+
311
+ return_data(output_file, p, fioCallbacks, myStream, user_data, arguments_ori)
312
+
313
+ if os.path.exists("pipe"):
314
+ os.remove("pipe")
315
+
316
+ if isinstance(arguments, dict):
317
+ break
quarchpy/qps/qpsFuncs.py CHANGED
@@ -77,7 +77,7 @@ def startLocalQps(keepQisRunning=False, args=[], timeout=30, startQPSMinimised=T
77
77
  temp =" "
78
78
  args = temp.join(args)
79
79
  if startQPSMinimised == True: #TODO add to release for QPS 1.38
80
- if "-ccs=" not in args.lower():
80
+ if "-ccs" not in args.lower():
81
81
  args +=" -ccs=MIN"
82
82
 
83
83
  # Record current working directory
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: quarchpy
3
- Version: 2.2.5
3
+ Version: 2.2.7.dev1
4
4
  Summary: This packpage offers Python support for Quarch Technology modules.
5
5
  Author: Quarch Technology ltd
6
6
  Author-email: support@quarch.com
@@ -17,9 +17,18 @@ Classifier: Topic :: Scientific/Engineering :: Information Analysis
17
17
  Classifier: Topic :: System
18
18
  Classifier: Topic :: System :: Power (UPS)
19
19
  Description-Content-Type: text/x-rst
20
- Requires-Dist: zeroconf >=0.23.0
20
+ Requires-Dist: zeroconf>=0.23.0
21
21
  Requires-Dist: numpy
22
22
  Requires-Dist: pandas
23
+ Dynamic: author
24
+ Dynamic: author-email
25
+ Dynamic: classifier
26
+ Dynamic: description
27
+ Dynamic: description-content-type
28
+ Dynamic: keywords
29
+ Dynamic: license
30
+ Dynamic: requires-dist
31
+ Dynamic: summary
23
32
 
24
33
  ====================
25
34
  Changelog (Quarchpy)
@@ -37,6 +46,23 @@ Change Log
37
46
  ----------
38
47
 
39
48
 
49
+ 2.2.6
50
+ -----
51
+ - New QPS 1.45 and QIS 1.47
52
+
53
+ 2.2.5
54
+ -----
55
+ - Minor Bug fix and removal of redundant jar
56
+
57
+ 2.2.4
58
+ -----
59
+ - Update to Java libraries to run QPS
60
+ - Removal of depracated libs saveing space
61
+
62
+ 2.2.3
63
+ -----
64
+ - Minor bug fix
65
+
40
66
  2.2.2
41
67
  -----
42
68
  - New QPS 1.44 and QIS 1.46