quarchpy 2.2.7.dev1__py2.py3-none-any.whl → 2.2.8__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 (208) hide show
  1. quarchpy/_version.py +1 -1
  2. quarchpy/connection_specific/QPS/win-amd64/{License/argparse4j-license.txt → 3rdPartyLicenses/argparse4j-LICENSE.txt} +23 -25
  3. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/com.sun.istack-license.html +59 -0
  4. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/commons-io-LICENSE-2.0.txt +202 -0
  5. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/controlsfx-license.txt +29 -0
  6. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/jakarta.activation-license.html +59 -0
  7. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/jakarta.xml.bind-api-license.html +59 -0
  8. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/netty-LICENSE.txt +202 -0
  9. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/netty-NOTICE.txt +239 -0
  10. quarchpy/connection_specific/QPS/win-amd64/InstallType.dat +1 -0
  11. quarchpy/connection_specific/QPS/win-amd64/app.jar +0 -0
  12. quarchpy/connection_specific/QPS/win-amd64/app.properties +6 -0
  13. quarchpy/connection_specific/QPS/win-amd64/license.txt +1 -0
  14. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/com.sun.istack-license.html +59 -0
  15. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/dorkbox-LICENSE.Apachev2 +218 -0
  16. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jSerialComm-LICENSE-APACHE-2.0 +202 -0
  17. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jSerialComm-LICENSE-LGPL-3.0 +165 -0
  18. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jakarta.activation-license.html +59 -0
  19. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jakarta.xml.bind-api-license.html +59 -0
  20. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/javassist-License.html +381 -0
  21. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jmdns-LICENSE.txt +202 -0
  22. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jna-AL2.0 +177 -0
  23. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/kotlin-stdlib-LICENSE-2.0.txt +202 -0
  24. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/netty-LICENSE.txt +202 -0
  25. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/netty-NOTICE.txt +239 -0
  26. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/slf4j-LICENSE.txt +24 -0
  27. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/usb4java-LICENSE.md +20 -0
  28. quarchpy/connection_specific/QPS/win-amd64/qis/help.txt +50 -17
  29. quarchpy/connection_specific/QPS/win-amd64/qis/license.txt +1 -0
  30. quarchpy/connection_specific/QPS/win-amd64/qis/qis.jar +0 -0
  31. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/CInterface-2.3.jar +0 -0
  32. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/QuarchCommon-2.0.jar +0 -0
  33. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/{TorridonCommon-1.0.jar → TorridonCommon-1.1.jar} +0 -0
  34. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jmdns-3.5.9.jar +0 -0
  35. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/usb4java-1.3.1.jar +0 -0
  36. quarchpy/connection_specific/QPS/win-amd64/qps-command-reference.html +104 -104
  37. quarchpy/connection_specific/QPS/win-amd64/qps.jar +0 -0
  38. quarchpy/connection_specific/QPS/win-amd64/qps_lib/JFXUtilities-1.0.jar +0 -0
  39. quarchpy/connection_specific/QPS/win-amd64/qps_lib/QuarchCommon-2.0.jar +0 -0
  40. quarchpy/connection_specific/QPS/win-amd64/qps_lib/commons-io-2.18.0.jar +0 -0
  41. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-base-21.0.6-linux-aarch64.jar +0 -0
  42. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-controls-21.0.6-linux-aarch64.jar +0 -0
  43. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-fxml-21.0.6-linux-aarch64.jar +0 -0
  44. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-graphics-21.0.6-linux-aarch64.jar +0 -0
  45. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-swing-21.0.6-linux-aarch64.jar +0 -0
  46. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-base-21.0.5-linux.jar → javafx-base-21.0.6-linux.jar} +0 -0
  47. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-controls-21.0.5-linux.jar → javafx-controls-21.0.6-linux.jar} +0 -0
  48. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-fxml-21.0.5-linux.jar → javafx-fxml-21.0.6-linux.jar} +0 -0
  49. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-graphics-21.0.5-linux.jar → javafx-graphics-21.0.6-linux.jar} +0 -0
  50. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-swing-21.0.5-linux.jar → javafx-swing-21.0.6-linux.jar} +0 -0
  51. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-x64/javafx-base-21.0.5-mac.jar → mac-arm64/javafx-base-21.0.6-mac-aarch64.jar} +0 -0
  52. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-controls-21.0.5-mac-aarch64.jar → javafx-controls-21.0.6-mac-aarch64.jar} +0 -0
  53. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-x64/javafx-fxml-21.0.5-mac.jar → mac-arm64/javafx-fxml-21.0.6-mac-aarch64.jar} +0 -0
  54. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-graphics-21.0.5-mac-aarch64.jar → javafx-graphics-21.0.6-mac-aarch64.jar} +0 -0
  55. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-x64/javafx-swing-21.0.5-mac.jar → mac-arm64/javafx-swing-21.0.6-mac-aarch64.jar} +0 -0
  56. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-arm64/javafx-base-21.0.5-mac-aarch64.jar → mac-x64/javafx-base-21.0.6-mac.jar} +0 -0
  57. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-controls-21.0.5-mac.jar → javafx-controls-21.0.6-mac.jar} +0 -0
  58. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-arm64/javafx-fxml-21.0.5-mac-aarch64.jar → mac-x64/javafx-fxml-21.0.6-mac.jar} +0 -0
  59. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-graphics-21.0.5-mac.jar → javafx-graphics-21.0.6-mac.jar} +0 -0
  60. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-arm64/javafx-swing-21.0.5-mac-aarch64.jar → mac-x64/javafx-swing-21.0.6-mac.jar} +0 -0
  61. quarchpy/connection_specific/QPS/win-amd64/qps_lib/qutils-1.0.jar +0 -0
  62. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-base-21.0.5-win.jar → javafx-base-21.0.6-win.jar} +0 -0
  63. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-controls-21.0.5-win.jar → javafx-controls-21.0.6-win.jar} +0 -0
  64. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-fxml-21.0.5-win.jar → javafx-fxml-21.0.6-win.jar} +0 -0
  65. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-graphics-21.0.5-win.jar → javafx-graphics-21.0.6-win.jar} +0 -0
  66. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-swing-21.0.5-win.jar → javafx-swing-21.0.6-win.jar} +0 -0
  67. quarchpy/connection_specific/QPS/win-amd64/scriptCommands.txt +4 -4
  68. quarchpy/connection_specific/QPS/win-amd64/whats-new.txt +20 -12
  69. quarchpy/connection_specific/connection_QIS.py +1 -0
  70. quarchpy/debug/SystemTest.py +30 -15
  71. quarchpy/device/quarchQPS.py +93 -68
  72. quarchpy/docs/CHANGES.rst +8 -0
  73. quarchpy/docs/_build/doctrees/CHANGES.doctree +0 -0
  74. quarchpy/docs/_build/doctrees/environment.pickle +0 -0
  75. quarchpy/docs/_build/doctrees/source/changelog.doctree +0 -0
  76. quarchpy/docs/_build/doctrees/source/quarchpy.fio.doctree +0 -0
  77. quarchpy/docs/_build/html/CHANGES.html +145 -139
  78. quarchpy/docs/_build/html/_sources/CHANGES.rst.txt +7 -0
  79. quarchpy/docs/_build/html/genindex.html +8 -2
  80. quarchpy/docs/_build/html/index.html +71 -70
  81. quarchpy/docs/_build/html/objects.inv +0 -0
  82. quarchpy/docs/_build/html/searchindex.js +1 -1
  83. quarchpy/docs/_build/html/source/changelog.html +216 -209
  84. quarchpy/docs/_build/html/source/quarchpy.fio.html +64 -0
  85. quarchpy/docs/_build/html/source/quarchpy.html +3 -0
  86. quarchpy/fio/{test_performance_class.py → HIDEtest_performance_class.py} +1 -1
  87. quarchpy/fio_tests_file.fio +1 -0
  88. quarchpy/qis/qisFuncs.py +38 -41
  89. quarchpy/qps/qpsFuncs.py +7 -10
  90. quarchpy/tests/test_device/test_scanDevices.py +21 -0
  91. quarchpy/utilities/utils.py +64 -0
  92. {quarchpy-2.2.7.dev1.dist-info → quarchpy-2.2.8.dist-info}/METADATA +10 -2
  93. {quarchpy-2.2.7.dev1.dist-info → quarchpy-2.2.8.dist-info}/RECORD +99 -172
  94. {quarchpy-2.2.7.dev1.dist-info → quarchpy-2.2.8.dist-info}/WHEEL +1 -1
  95. quarchpy/.idea/.gitignore +0 -3
  96. quarchpy/.idea/inspectionProfiles/Project_Default.xml +0 -12
  97. quarchpy/.idea/inspectionProfiles/profiles_settings.xml +0 -6
  98. quarchpy/.idea/misc.xml +0 -7
  99. quarchpy/.idea/modules.xml +0 -8
  100. quarchpy/.idea/quarchpy.iml +0 -12
  101. quarchpy/.idea/workspace.xml +0 -75
  102. quarchpy/_version.py.bak +0 -1
  103. quarchpy/config_files/__pycache__/__init__.cpython-311.pyc +0 -0
  104. quarchpy/config_files/__pycache__/__init__.cpython-313.pyc +0 -0
  105. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-311.pyc +0 -0
  106. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-313.pyc +0 -0
  107. quarchpy/connection_specific/QPS/win-amd64/License/Netty-license.txt +0 -143
  108. quarchpy/connection_specific/QPS/win-amd64/License/controlsfx-license.txt +0 -26
  109. quarchpy/connection_specific/QPS/win-amd64/License/usb4java-license.txt +0 -167
  110. quarchpy/connection_specific/QPS/win-amd64/launchQPSJ21.bat +0 -4
  111. quarchpy/connection_specific/QPS/win-amd64/launchQPSJ21.sh +0 -4
  112. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-313.pyc +0 -0
  113. quarchpy/connection_specific/__pycache__/__init__.cpython-313.pyc +0 -0
  114. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-313.pyc +0 -0
  115. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-313.pyc +0 -0
  116. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-313.pyc +0 -0
  117. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-313.pyc +0 -0
  118. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-313.pyc +0 -0
  119. quarchpy/connection_specific/__pycache__/connection_Telnet.cpython-313.pyc +0 -0
  120. quarchpy/connection_specific/__pycache__/connection_USB.cpython-313.pyc +0 -0
  121. quarchpy/connection_specific/__pycache__/mDNS.cpython-313.pyc +0 -0
  122. quarchpy/connection_specific/connection_QPS.py.bak +0 -242
  123. quarchpy/connection_specific/jdk_j21_jres/__pycache__/__init__.cpython-313.pyc +0 -0
  124. quarchpy/connection_specific/jdk_j21_jres/__pycache__/fix_permissions.cpython-313.pyc +0 -0
  125. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-313.pyc +0 -0
  126. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-313.pyc +0 -0
  127. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-313.pyc +0 -0
  128. quarchpy/connection_specific/serial/__pycache__/win32.cpython-313.pyc +0 -0
  129. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  130. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-313.pyc +0 -0
  131. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-313.pyc +0 -0
  132. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-313.pyc +0 -0
  133. quarchpy/debug/__pycache__/SystemTest.cpython-311.pyc +0 -0
  134. quarchpy/debug/__pycache__/SystemTest.cpython-313.pyc +0 -0
  135. quarchpy/debug/__pycache__/__init__.cpython-311.pyc +0 -0
  136. quarchpy/debug/__pycache__/__init__.cpython-313.pyc +0 -0
  137. quarchpy/debug/__pycache__/module_debug.cpython-311.pyc +0 -0
  138. quarchpy/debug/__pycache__/module_debug.cpython-313.pyc +0 -0
  139. quarchpy/debug/__pycache__/simple_terminal.cpython-311.pyc +0 -0
  140. quarchpy/debug/__pycache__/simple_terminal.cpython-313.pyc +0 -0
  141. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-311.pyc +0 -0
  142. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-313.pyc +0 -0
  143. quarchpy/debug/__pycache__/versionCompare.cpython-311.pyc +0 -0
  144. quarchpy/debug/__pycache__/versionCompare.cpython-313.pyc +0 -0
  145. quarchpy/device/__pycache__/__init__.cpython-311.pyc +0 -0
  146. quarchpy/device/__pycache__/__init__.cpython-313.pyc +0 -0
  147. quarchpy/device/__pycache__/device.cpython-311.pyc +0 -0
  148. quarchpy/device/__pycache__/device.cpython-313.pyc +0 -0
  149. quarchpy/device/__pycache__/quarchArray.cpython-311.pyc +0 -0
  150. quarchpy/device/__pycache__/quarchArray.cpython-313.pyc +0 -0
  151. quarchpy/device/__pycache__/quarchPPM.cpython-311.pyc +0 -0
  152. quarchpy/device/__pycache__/quarchPPM.cpython-313.pyc +0 -0
  153. quarchpy/device/__pycache__/quarchQPS.cpython-311.pyc +0 -0
  154. quarchpy/device/__pycache__/quarchQPS.cpython-313.pyc +0 -0
  155. quarchpy/device/__pycache__/scanDevices.cpython-311.pyc +0 -0
  156. quarchpy/device/__pycache__/scanDevices.cpython-313.pyc +0 -0
  157. quarchpy/device/quarchQPS.py.bak +0 -398
  158. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-311.pyc +0 -0
  159. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-313.pyc +0 -0
  160. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-311.pyc +0 -0
  161. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-313.pyc +0 -0
  162. quarchpy/disk_test/__pycache__/__init__.cpython-311.pyc +0 -0
  163. quarchpy/disk_test/__pycache__/__init__.cpython-313.pyc +0 -0
  164. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-311.pyc +0 -0
  165. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-313.pyc +0 -0
  166. quarchpy/docs/CHANGES.rst.bak +0 -430
  167. quarchpy/docs/_build/html/.buildinfo.bak +0 -4
  168. quarchpy/docs/_build/html/_static/github-banner.svg +0 -5
  169. quarchpy/fio/FIO_interface.py.bak +0 -317
  170. quarchpy/fio/__pycache__/FIO_interface.cpython-311.pyc +0 -0
  171. quarchpy/fio/__pycache__/FIO_interface.cpython-313.pyc +0 -0
  172. quarchpy/fio/__pycache__/__init__.cpython-311.pyc +0 -0
  173. quarchpy/fio/__pycache__/__init__.cpython-313.pyc +0 -0
  174. quarchpy/fio/__pycache__/fioDiskFinder.cpython-311.pyc +0 -0
  175. quarchpy/fio/__pycache__/fioDiskFinder.cpython-313.pyc +0 -0
  176. quarchpy/iometer/__pycache__/__init__.cpython-311.pyc +0 -0
  177. quarchpy/iometer/__pycache__/__init__.cpython-313.pyc +0 -0
  178. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-311.pyc +0 -0
  179. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-313.pyc +0 -0
  180. quarchpy/iometer/__pycache__/iometerFuncs.cpython-311.pyc +0 -0
  181. quarchpy/iometer/__pycache__/iometerFuncs.cpython-313.pyc +0 -0
  182. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-311.pyc +0 -0
  183. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-313.pyc +0 -0
  184. quarchpy/qis/__pycache__/__init__.cpython-311.pyc +0 -0
  185. quarchpy/qis/__pycache__/__init__.cpython-313.pyc +0 -0
  186. quarchpy/qis/__pycache__/qisFuncs.cpython-311.pyc +0 -0
  187. quarchpy/qis/__pycache__/qisFuncs.cpython-313.pyc +0 -0
  188. quarchpy/qps/__pycache__/__init__.cpython-311.pyc +0 -0
  189. quarchpy/qps/__pycache__/__init__.cpython-313.pyc +0 -0
  190. quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc +0 -0
  191. quarchpy/qps/__pycache__/qpsFuncs.cpython-313.pyc +0 -0
  192. quarchpy/user_interface/__pycache__/__init__.cpython-311.pyc +0 -0
  193. quarchpy/user_interface/__pycache__/__init__.cpython-313.pyc +0 -0
  194. quarchpy/user_interface/__pycache__/user_interface.cpython-311.pyc +0 -0
  195. quarchpy/user_interface/__pycache__/user_interface.cpython-313.pyc +0 -0
  196. quarchpy/utilities/__pycache__/TestCenter.cpython-311.pyc +0 -0
  197. quarchpy/utilities/__pycache__/TestCenter.cpython-313.pyc +0 -0
  198. quarchpy/utilities/__pycache__/TimeValue.cpython-311.pyc +0 -0
  199. quarchpy/utilities/__pycache__/TimeValue.cpython-313.pyc +0 -0
  200. quarchpy/utilities/__pycache__/Version.cpython-311.pyc +0 -0
  201. quarchpy/utilities/__pycache__/Version.cpython-313.pyc +0 -0
  202. quarchpy/utilities/__pycache__/__init__.cpython-311.pyc +0 -0
  203. quarchpy/utilities/__pycache__/__init__.cpython-313.pyc +0 -0
  204. /quarchpy/connection_specific/QPS/win-amd64/{License → 3rdPartyLicenses}/Material-Icons-license.txt +0 -0
  205. /quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/{QTL1995-02.XML → QTL1995-02.xml} +0 -0
  206. /quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/{QTL1999-02.XML → QTL1999-02.xml} +0 -0
  207. /quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/{QTL2312-01.XML → QTL2312-01.xml} +0 -0
  208. {quarchpy-2.2.7.dev1.dist-info → quarchpy-2.2.8.dist-info}/top_level.txt +0 -0
@@ -1,317 +0,0 @@
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