redis-benchmarks-specification 0.2.42__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 (336) hide show
  1. redis_benchmarks_specification/__api__/Readme.md +7 -0
  2. redis_benchmarks_specification/__api__/__init__.py +5 -0
  3. redis_benchmarks_specification/__api__/api.py +87 -0
  4. redis_benchmarks_specification/__api__/app.py +191 -0
  5. redis_benchmarks_specification/__builder__/Readme.md +7 -0
  6. redis_benchmarks_specification/__builder__/__init__.py +5 -0
  7. redis_benchmarks_specification/__builder__/builder.py +1010 -0
  8. redis_benchmarks_specification/__builder__/schema.py +23 -0
  9. redis_benchmarks_specification/__cli__/__init__.py +5 -0
  10. redis_benchmarks_specification/__cli__/args.py +226 -0
  11. redis_benchmarks_specification/__cli__/cli.py +624 -0
  12. redis_benchmarks_specification/__cli__/stats.py +1304 -0
  13. redis_benchmarks_specification/__common__/__init__.py +0 -0
  14. redis_benchmarks_specification/__common__/builder_schema.py +256 -0
  15. redis_benchmarks_specification/__common__/env.py +96 -0
  16. redis_benchmarks_specification/__common__/github.py +280 -0
  17. redis_benchmarks_specification/__common__/package.py +28 -0
  18. redis_benchmarks_specification/__common__/runner.py +485 -0
  19. redis_benchmarks_specification/__common__/spec.py +143 -0
  20. redis_benchmarks_specification/__common__/suppress_warnings.py +20 -0
  21. redis_benchmarks_specification/__common__/timeseries.py +1621 -0
  22. redis_benchmarks_specification/__compare__/__init__.py +5 -0
  23. redis_benchmarks_specification/__compare__/args.py +240 -0
  24. redis_benchmarks_specification/__compare__/compare.py +3322 -0
  25. redis_benchmarks_specification/__init__.py +15 -0
  26. redis_benchmarks_specification/__runner__/__init__.py +5 -0
  27. redis_benchmarks_specification/__runner__/args.py +334 -0
  28. redis_benchmarks_specification/__runner__/remote_profiling.py +535 -0
  29. redis_benchmarks_specification/__runner__/runner.py +3837 -0
  30. redis_benchmarks_specification/__self_contained_coordinator__/__init__.py +5 -0
  31. redis_benchmarks_specification/__self_contained_coordinator__/args.py +210 -0
  32. redis_benchmarks_specification/__self_contained_coordinator__/artifacts.py +27 -0
  33. redis_benchmarks_specification/__self_contained_coordinator__/build_info.py +61 -0
  34. redis_benchmarks_specification/__self_contained_coordinator__/clients.py +58 -0
  35. redis_benchmarks_specification/__self_contained_coordinator__/cpuset.py +17 -0
  36. redis_benchmarks_specification/__self_contained_coordinator__/docker.py +108 -0
  37. redis_benchmarks_specification/__self_contained_coordinator__/post_processing.py +19 -0
  38. redis_benchmarks_specification/__self_contained_coordinator__/prepopulation.py +96 -0
  39. redis_benchmarks_specification/__self_contained_coordinator__/runners.py +740 -0
  40. redis_benchmarks_specification/__self_contained_coordinator__/self_contained_coordinator.py +2554 -0
  41. redis_benchmarks_specification/__setups__/__init__.py +0 -0
  42. redis_benchmarks_specification/__setups__/topologies.py +17 -0
  43. redis_benchmarks_specification/__spec__/__init__.py +5 -0
  44. redis_benchmarks_specification/__spec__/args.py +78 -0
  45. redis_benchmarks_specification/__spec__/cli.py +259 -0
  46. redis_benchmarks_specification/__watchdog__/__init__.py +5 -0
  47. redis_benchmarks_specification/__watchdog__/args.py +54 -0
  48. redis_benchmarks_specification/__watchdog__/watchdog.py +175 -0
  49. redis_benchmarks_specification/commands/__init__.py +0 -0
  50. redis_benchmarks_specification/commands/commands.py +15 -0
  51. redis_benchmarks_specification/setups/builders/gcc:15.2.0-amd64-debian-bookworm-default.yml +20 -0
  52. redis_benchmarks_specification/setups/builders/gcc:15.2.0-arm64-debian-bookworm-default.yml +20 -0
  53. redis_benchmarks_specification/setups/platforms/aws-ec2-1node-c5.4xlarge.yml +27 -0
  54. redis_benchmarks_specification/setups/topologies/topologies.yml +153 -0
  55. redis_benchmarks_specification/test-suites/defaults.yml +32 -0
  56. redis_benchmarks_specification/test-suites/generate.py +114 -0
  57. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hexpire-5-fields-10B-values.yml +43 -0
  58. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hexpire-50-fields-10B-values.yml +53 -0
  59. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hexpireat-5-fields-10B-values.yml +43 -0
  60. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hexpireat-50-fields-10B-values.yml +53 -0
  61. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hgetall-50-fields-100B-values.yml +52 -0
  62. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hgetex-5-fields-10B-values.yml +43 -0
  63. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hgetex-50-fields-10B-values.yml +53 -0
  64. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hgetex-persist-50-fields-10B-values.yml +53 -0
  65. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hpexpire-5-fields-10B-values.yml +43 -0
  66. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hpexpire-50-fields-10B-values.yml +53 -0
  67. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hpexpireat-5-fields-10B-values.yml +43 -0
  68. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-hpexpireat-50-fields-10B-values.yml +53 -0
  69. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-hash-htll-50-fields-10B-values.yml +53 -0
  70. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-1-fields-with-1000B-values-expiration.yml +35 -0
  71. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-1-fields-with-10B-values-expiration.yml +34 -0
  72. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-1-fields-with-10B-values-long-expiration.yml +35 -0
  73. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-1-fields-with-10B-values-short-expiration.yml +35 -0
  74. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-20-fields-with-1B-values-pipeline-30.yml +43 -0
  75. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-5-fields-with-1000B-values-expiration.yml +36 -0
  76. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-5-fields-with-10B-values-expiration.yml +35 -0
  77. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-5-fields-with-10B-values-long-expiration.yml +36 -0
  78. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-5-fields-with-10B-values-short-expiration.yml +36 -0
  79. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-1000B-values-expiration.yml +45 -0
  80. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-1000B-values.yml +44 -0
  81. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-100B-values.yml +44 -0
  82. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-10B-values-expiration.yml +44 -0
  83. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-10B-values-long-expiration.yml +45 -0
  84. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-10B-values-short-expiration.yml +45 -0
  85. redis_benchmarks_specification/test-suites/memtier_benchmark-100Kkeys-load-hash-50-fields-with-10B-values.yml +43 -0
  86. redis_benchmarks_specification/test-suites/memtier_benchmark-10Kkeys-load-hash-50-fields-with-10000B-values.yml +44 -0
  87. redis_benchmarks_specification/test-suites/memtier_benchmark-10Kkeys-load-list-rpush-bulkload-pipeline-50.yml +39 -0
  88. redis_benchmarks_specification/test-suites/memtier_benchmark-10Kkeys-load-list-with-10B-values-pipeline-50.yml +33 -0
  89. redis_benchmarks_specification/test-suites/memtier_benchmark-10Mkeys-load-hash-5-fields-with-100B-values-pipeline-10.yml +33 -0
  90. redis_benchmarks_specification/test-suites/memtier_benchmark-10Mkeys-load-hash-5-fields-with-100B-values.yml +33 -0
  91. redis_benchmarks_specification/test-suites/memtier_benchmark-10Mkeys-load-hash-5-fields-with-10B-values-pipeline-10.yml +34 -0
  92. redis_benchmarks_specification/test-suites/memtier_benchmark-10Mkeys-load-hash-5-fields-with-10B-values.yml +33 -0
  93. redis_benchmarks_specification/test-suites/memtier_benchmark-10Mkeys-string-get-10B-pipeline-100-nokeyprefix.yml +38 -0
  94. redis_benchmarks_specification/test-suites/memtier_benchmark-1Kkeys-hash-listpack-500-fields-update-20-fields-with-1B-to-64B-values.yml +75 -0
  95. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-100B-expire-use-case.yml +50 -0
  96. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-10B-expire-use-case.yml +50 -0
  97. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-10B-psetex-expire-use-case.yml +43 -0
  98. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-10B-setex-expire-use-case.yml +43 -0
  99. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-1KiB-expire-use-case.yml +49 -0
  100. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-4KiB-expire-use-case.yml +50 -0
  101. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-bitmap-getbit-pipeline-10.yml +42 -0
  102. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-exists-pipeline-10.yml +41 -0
  103. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-expire-pipeline-10.yml +41 -0
  104. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-expireat-pipeline-10.yml +41 -0
  105. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-pexpire-pipeline-10.yml +41 -0
  106. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-scan-count-500-pipeline-10.yml +41 -0
  107. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-scan-cursor-count-500-pipeline-10.yml +42 -0
  108. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-scan-cursor-count-5000-pipeline-10.yml +42 -0
  109. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-scan-cursor-pipeline-10.yml +42 -0
  110. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-scan-pipeline-10.yml +41 -0
  111. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-scan-type-pipeline-10.yml +41 -0
  112. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-touch-pipeline-10.yml +41 -0
  113. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-generic-ttl-pipeline-10.yml +41 -0
  114. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hexists.yml +45 -0
  115. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hget-hgetall-hkeys-hvals-with-100B-values.yml +48 -0
  116. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hgetall-50-fields-10B-values.yml +53 -0
  117. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hincrby.yml +42 -0
  118. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hincrbyfloat.yml +42 -0
  119. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hkeys-10-fields-with-10B-values-with-expiration-pipeline-10.yml +45 -0
  120. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hkeys-5-fields-with-100B-values-with-expiration-pipeline-10.yml +44 -0
  121. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hkeys-5-fields-with-10B-values-with-expiration-pipeline-10.yml +44 -0
  122. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hkeys-50-fields-with-10B-values-with-expiration-pipeline-10.yml +54 -0
  123. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-hmget-5-fields-with-100B-values-pipeline-10.yml +44 -0
  124. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-hash-transactions-multi-exec-pipeline-20.yml +43 -0
  125. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-list-lpop-rpop-with-100B-values.yml +44 -0
  126. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-list-lpop-rpop-with-10B-values.yml +44 -0
  127. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-list-lpop-rpop-with-1KiB-values.yml +44 -0
  128. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-list-rpoplpush-with-10B-values.yml +42 -0
  129. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-hash-5-fields-with-1000B-values-pipeline-10.yml +34 -0
  130. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-hash-5-fields-with-1000B-values.yml +33 -0
  131. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-hash-50-fields-with-10B-values-long-expiration-pipeline-10.yml +46 -0
  132. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-hash-hmset-5-fields-with-1000B-values.yml +33 -0
  133. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-list-rpush-with-10B-values.yml +32 -0
  134. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-list-with-100B-values.yml +32 -0
  135. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-list-with-10B-values-pipeline-10.yml +33 -0
  136. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-list-with-10B-values.yml +32 -0
  137. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-list-with-1KiB-values.yml +32 -0
  138. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-set-intset-with-100-elements-19-digits-pipeline-10.yml +58 -0
  139. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-set-intset-with-100-elements-19-digits.yml +58 -0
  140. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-set-intset-with-100-elements-pipeline-10.yml +41 -0
  141. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-set-intset-with-100-elements.yml +40 -0
  142. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-stream-1-fields-with-100B-values-pipeline-10.yml +33 -0
  143. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-stream-1-fields-with-100B-values.yml +33 -0
  144. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-stream-5-fields-with-100B-values-pipeline-10.yml +34 -0
  145. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-stream-5-fields-with-100B-values.yml +33 -0
  146. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-100B-values-pipeline-10.yml +32 -0
  147. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-100B-values.yml +35 -0
  148. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-10.yml +33 -0
  149. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-100-nokeyprefix.yml +29 -0
  150. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-100.yml +33 -0
  151. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-50.yml +33 -0
  152. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-10B-values-pipeline-500.yml +33 -0
  153. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-10B-values.yml +32 -0
  154. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-1KiB-values-pipeline-10.yml +32 -0
  155. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-1KiB-values.yml +32 -0
  156. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-string-with-20KiB-values.yml +35 -0
  157. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-zset-listpack-with-100-elements-double-score.yml +91 -0
  158. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-zset-with-10-elements-double-score.yml +35 -0
  159. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-load-zset-with-10-elements-int-score.yml +34 -0
  160. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-append-1-100B-pipeline-10.yml +43 -0
  161. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-append-1-100B.yml +42 -0
  162. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-decr.yml +41 -0
  163. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-100B-pipeline-10.yml +41 -0
  164. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-100B.yml +41 -0
  165. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-10B-pipeline-10.yml +41 -0
  166. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-10B-pipeline-100-nokeyprefix.yml +38 -0
  167. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-10B-pipeline-100.yml +41 -0
  168. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-10B-pipeline-50.yml +41 -0
  169. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-10B-pipeline-500.yml +41 -0
  170. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-10B.yml +41 -0
  171. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-1KiB-pipeline-10.yml +41 -0
  172. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-1KiB.yml +41 -0
  173. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-32B-pipeline-10.yml +40 -0
  174. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-get-32B.yml +40 -0
  175. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-incr-pipeline-10.yml +30 -0
  176. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-incrby-pipeline-10.yml +30 -0
  177. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-incrby.yml +30 -0
  178. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-incrbyfloat-pipeline-10.yml +30 -0
  179. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-incrbyfloat.yml +30 -0
  180. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-int-encoding-strlen-pipeline-10.yml +40 -0
  181. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mget-1KiB.yml +41 -0
  182. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-100B-expire-pipeline-10.yml +45 -0
  183. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-100B-expire.yml +45 -0
  184. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-100B-pipeline-10.yml +43 -0
  185. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-100B.yml +42 -0
  186. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-1KB-pipeline-10.yml +42 -0
  187. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-1KB.yml +41 -0
  188. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-32B-pipeline-10.yml +43 -0
  189. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-32B.yml +42 -0
  190. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-512B-pipeline-10.yml +43 -0
  191. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-512B.yml +42 -0
  192. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-mixed-50-50-set-get-with-expiration-240B-400_conns.yml +47 -0
  193. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-set-with-ex-100B-pipeline-10.yml +41 -0
  194. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setex-100B-pipeline-10.yml +41 -0
  195. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setget200c-1KiB-pipeline-1.yml +43 -0
  196. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setget200c-1KiB-pipeline-10.yml +43 -0
  197. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setget200c-4KiB-pipeline-1.yml +43 -0
  198. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setget200c-4KiB-pipeline-10.yml +43 -0
  199. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setget200c-512B-pipeline-1.yml +43 -0
  200. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setget200c-512B-pipeline-10.yml +43 -0
  201. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setrange-100B-pipeline-10.yml +42 -0
  202. redis_benchmarks_specification/test-suites/memtier_benchmark-1Mkeys-string-setrange-100B.yml +42 -0
  203. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-100M-bits-bitmap-bitcount.yml +45 -0
  204. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-1Billion-bits-bitmap-bitcount.yml +45 -0
  205. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-2-elements-geopos.yml +38 -0
  206. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-2-elements-geosearch-fromlonlat-withcoord.yml +39 -0
  207. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geodist-pipeline-10.yml +36 -0
  208. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geodist.yml +36 -0
  209. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geohash-pipeline-10.yml +35 -0
  210. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geohash.yml +34 -0
  211. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geopos-pipeline-10.yml +35 -0
  212. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geopos.yml +34 -0
  213. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geosearch-fromlonlat-bybox.yml +36 -0
  214. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geosearch-fromlonlat-pipeline-10.yml +36 -0
  215. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-geo-60M-elements-geosearch-fromlonlat.yml +36 -0
  216. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-hash-1K-fields-hgetall-pipeline-10.yml +285 -0
  217. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-hash-1K-fields-hgetall.yml +284 -0
  218. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-hash-hscan-1K-fields-100B-values-cursor-count-1000.yml +291 -0
  219. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-hash-hscan-1K-fields-10B-values-cursor-count-100.yml +291 -0
  220. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-hash-hscan-1K-fields-10B-values.yml +290 -0
  221. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-hash-hscan-50-fields-10B-values.yml +54 -0
  222. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10-elements-lrange-all-elements-pipeline-10.yml +37 -0
  223. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10-elements-lrange-all-elements.yml +36 -0
  224. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-100-elements-int-7bit-uint-lrange-all-elements-pipeline-10.yml +44 -0
  225. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-100-elements-int-lrange-all-elements-pipeline-10.yml +52 -0
  226. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-100-elements-llen-pipeline-10.yml +52 -0
  227. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-100-elements-lrange-all-elements-pipeline-10.yml +52 -0
  228. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-100-elements-lrange-all-elements.yml +51 -0
  229. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-lindex-integer.yml +41 -0
  230. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-lindex-string-pipeline-10.yml +42 -0
  231. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-lindex-string.yml +41 -0
  232. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-linsert-lrem-integer.yml +45 -0
  233. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-linsert-lrem-string.yml +45 -0
  234. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-lpos-integer.yml +41 -0
  235. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-10K-elements-lpos-string.yml +41 -0
  236. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-1K-elements-lrange-all-elements-pipeline-10.yml +202 -0
  237. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-1K-elements-lrange-all-elements.yml +201 -0
  238. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-list-2K-elements-quicklist-lrange-all-elements-longs.yml +258 -0
  239. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-load-hash-1K-fields-with-5B-values.yml +282 -0
  240. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-load-zset-with-5-elements-parsing-float-score.yml +36 -0
  241. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-load-zset-with-5-elements-parsing-hexa-score.yml +36 -0
  242. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-pfadd-4KB-values-pipeline-10.yml +32 -0
  243. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-10-elements-smembers-pipeline-10.yml +37 -0
  244. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-10-elements-smembers.yml +36 -0
  245. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-10-elements-smismember.yml +38 -0
  246. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-100-elements-sismember-is-a-member.yml +53 -0
  247. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-100-elements-sismember-not-a-member.yml +53 -0
  248. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-100-elements-smembers.yml +50 -0
  249. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-100-elements-smismember.yml +54 -0
  250. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-100-elements-sscan.yml +50 -0
  251. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-10M-elements-sismember-50pct-chance.yml +41 -0
  252. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-10M-elements-srem-50pct-chance.yml +40 -0
  253. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-1K-elements-smembers.yml +200 -0
  254. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-1K-elements-sscan-cursor-count-100.yml +201 -0
  255. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-1K-elements-sscan.yml +200 -0
  256. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-1M-elements-sismember-50pct-chance.yml +40 -0
  257. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-200K-elements-sadd-constant.yml +41 -0
  258. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-set-2M-elements-sadd-increasing.yml +32 -0
  259. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zincrby-1M-elements-pipeline-1.yml +40 -0
  260. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrank-100K-elements-pipeline-1.yml +40 -0
  261. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrank-10M-elements-pipeline-1.yml +41 -0
  262. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrank-1M-elements-pipeline-1.yml +40 -0
  263. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrem-5M-elements-pipeline-1.yml +47 -0
  264. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrevrangebyscore-256K-elements-pipeline-1.yml +41 -0
  265. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrevrangebyscore-256K-elements-pipeline-10.yml +41 -0
  266. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zrevrank-1M-elements-pipeline-1.yml +40 -0
  267. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-10-elements-zrange-all-elements-long-scores.yml +41 -0
  268. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-10-elements-zrange-all-elements.yml +40 -0
  269. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-100-elements-zrange-all-elements.yml +66 -0
  270. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-100-elements-zrangebyscore-all-elements-long-scores.yml +66 -0
  271. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-100-elements-zrangebyscore-all-elements.yml +66 -0
  272. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-100-elements-zscan.yml +65 -0
  273. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1K-elements-zrange-all-elements.yml +322 -0
  274. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1K-elements-zscan.yml +321 -0
  275. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1M-elements-zcard-pipeline-10.yml +39 -0
  276. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1M-elements-zremrangebyscore-pipeline-10.yml +41 -0
  277. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1M-elements-zrevrange-5-elements.yml +40 -0
  278. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1M-elements-zrevrange-withscores-5-elements-pipeline-10.yml +41 -0
  279. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-1M-elements-zscore-pipeline-10.yml +40 -0
  280. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-600K-elements-zrangestore-1K-elements.yml +41 -0
  281. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-600K-elements-zrangestore-300K-elements.yml +43 -0
  282. redis_benchmarks_specification/test-suites/memtier_benchmark-1key-zset-listpack-zrank-100-elements-pipeline-1.yml +50 -0
  283. redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-lua-eval-hset-expire.yml +37 -0
  284. redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-lua-evalsha-hset-expire.yml +41 -0
  285. redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-set-10-100-elements-sdiff.yml +57 -0
  286. redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-set-10-100-elements-sinter.yml +57 -0
  287. redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-set-10-100-elements-sunion.yml +57 -0
  288. redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-stream-5-entries-xread-all-entries-pipeline-10.yml +46 -0
  289. redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-stream-5-entries-xread-all-entries.yml +46 -0
  290. redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-zset-300-elements-skiplist-encoded-zunion.yml +434 -0
  291. redis_benchmarks_specification/test-suites/memtier_benchmark-2keys-zset-300-elements-skiplist-encoded-zunionstore.yml +434 -0
  292. redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-load-string-with-512B-values-pipeline-10.yml +37 -0
  293. redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-load-string-with-512B-values.yml +37 -0
  294. redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-get-with-1KiB-values-400_conns.yml +45 -0
  295. redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-get-with-1KiB-values-40_conns.yml +45 -0
  296. redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-get-with-1KiB-values-pipeline-10-2000_conns.yml +46 -0
  297. redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-get-with-1KiB-values-pipeline-10-400_conns.yml +46 -0
  298. redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-get-with-1KiB-values-pipeline-10-40_conns.yml +46 -0
  299. redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-mixed-20-80-with-512B-values-400_conns.yml +45 -0
  300. redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-mixed-20-80-with-512B-values-pipeline-10-2000_conns.yml +46 -0
  301. redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-mixed-20-80-with-512B-values-pipeline-10-400_conns.yml +46 -0
  302. redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-mixed-20-80-with-512B-values-pipeline-10-5200_conns.yml +46 -0
  303. redis_benchmarks_specification/test-suites/memtier_benchmark-3Mkeys-string-mixed-50-50-with-512B-values-with-expiration-pipeline-10-400_conns.yml +43 -0
  304. redis_benchmarks_specification/test-suites/memtier_benchmark-connection-hello-pipeline-10.yml +32 -0
  305. redis_benchmarks_specification/test-suites/memtier_benchmark-connection-hello.yml +32 -0
  306. redis_benchmarks_specification/test-suites/memtier_benchmark-multiple-hll-pfcount-100B-values.yml +34 -0
  307. redis_benchmarks_specification/test-suites/memtier_benchmark-multiple-hll-pfmerge-100B-values.yml +34 -0
  308. redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-connection-ping-pipeline-10.yml +29 -0
  309. redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-pubsub-mixed-100-channels-128B-100-publishers-100-subscribers.yml +40 -0
  310. redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-pubsub-mixed-100-channels-128B-100-publishers-1000-subscribers.yml +40 -0
  311. redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-pubsub-mixed-100-channels-128B-100-publishers-5000-subscribers.yml +40 -0
  312. redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-pubsub-mixed-100-channels-128B-100-publishers-50K-subscribers-5k-conns.yml +40 -0
  313. redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-pubsub-publish-1K-channels-10B-no-subscribers.yml +30 -0
  314. redis_benchmarks_specification/test-suites/memtier_benchmark-nokeys-server-time-pipeline-10.yml +29 -0
  315. redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-leaderboard-top-10.yml +68 -0
  316. redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-leaderboard-top-100.yml +69 -0
  317. redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-leaderboard-top-1000.yml +68 -0
  318. redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-rate-limiting-lua-100k-sessions.yml +64 -0
  319. redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-realtime-analytics-membership-pipeline-10.yml +56 -0
  320. redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-realtime-analytics-membership.yml +56 -0
  321. redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-session-caching-hash-100k-sessions.yml +108 -0
  322. redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-session-caching-json-100k-sessions.yml +109 -0
  323. redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-session-caching-string-100k-sessions.yml +98 -0
  324. redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-session-storage-100k-sessions.yml +205 -0
  325. redis_benchmarks_specification/test-suites/memtier_benchmark-playbook-session-storage-1k-sessions.yml +205 -0
  326. redis_benchmarks_specification/test-suites/memtier_benchmark-stream-10M-entries-xread-count-100.yml +36 -0
  327. redis_benchmarks_specification/test-suites/memtier_benchmark-stream-10M-entries-xreadgroup-count-100-noack.yml +38 -0
  328. redis_benchmarks_specification/test-suites/memtier_benchmark-stream-10M-entries-xreadgroup-count-100.yml +38 -0
  329. redis_benchmarks_specification/test-suites/memtier_benchmark-stream-concurrent-xadd-xreadgroup-70-30.yml +50 -0
  330. redis_benchmarks_specification/test-suites/template.txt +18 -0
  331. redis_benchmarks_specification/vector-search-test-suites/vector_db_benchmark_test.yml +41 -0
  332. redis_benchmarks_specification-0.2.42.dist-info/LICENSE +201 -0
  333. redis_benchmarks_specification-0.2.42.dist-info/METADATA +434 -0
  334. redis_benchmarks_specification-0.2.42.dist-info/RECORD +336 -0
  335. redis_benchmarks_specification-0.2.42.dist-info/WHEEL +4 -0
  336. redis_benchmarks_specification-0.2.42.dist-info/entry_points.txt +10 -0
@@ -0,0 +1,624 @@
1
+ # BSD 3-Clause License
2
+ #
3
+ # Copyright (c) 2021., Redis Labs Modules
4
+ # All rights reserved.
5
+ #
6
+
7
+ import argparse
8
+ import datetime
9
+ import logging
10
+ import re
11
+ import shutil
12
+ import subprocess
13
+ import sys
14
+ import tempfile
15
+
16
+ import docker
17
+ import git
18
+ import packaging
19
+ import redis
20
+ from packaging import version
21
+ import time
22
+
23
+ from redis_benchmarks_specification.__builder__.builder import (
24
+ generate_benchmark_stream_request,
25
+ store_airgap_image_redis,
26
+ )
27
+ from redis_benchmarks_specification.__common__.github import (
28
+ update_comment_if_needed,
29
+ create_new_pr_comment,
30
+ check_github_available_and_actionable,
31
+ generate_build_finished_pr_comment,
32
+ )
33
+
34
+ from redis_benchmarks_specification.__cli__.args import spec_cli_args
35
+ from redis_benchmarks_specification.__cli__.stats import (
36
+ generate_stats_cli_command_logic,
37
+ )
38
+ from redis_benchmarks_specification.__common__.builder_schema import (
39
+ get_commit_dict_from_sha,
40
+ request_build_from_commit_info,
41
+ )
42
+ from redis_benchmarks_specification.__common__.env import (
43
+ REDIS_BINS_EXPIRE_SECS,
44
+ STREAM_KEYNAME_GH_EVENTS_COMMIT,
45
+ STREAM_GH_EVENTS_COMMIT_BUILDERS_CG,
46
+ STREAM_KEYNAME_NEW_BUILD_EVENTS,
47
+ get_arch_specific_stream_name,
48
+ )
49
+ from redis_benchmarks_specification.__common__.package import (
50
+ get_version_string,
51
+ populate_with_poetry_data,
52
+ )
53
+
54
+ # logging settings
55
+ logging.basicConfig(
56
+ format="%(asctime)s %(levelname)-4s %(message)s",
57
+ level=logging.INFO,
58
+ datefmt="%Y-%m-%d %H:%M:%S",
59
+ )
60
+
61
+
62
+ def trigger_tests_dockerhub_cli_command_logic(args, project_name, project_version):
63
+ logging.info(
64
+ "Using: {project_name} {project_version}".format(
65
+ project_name=project_name, project_version=project_version
66
+ )
67
+ )
68
+ logging.info(
69
+ "Checking connection to redis with user: {}, host: {}, port: {}".format(
70
+ args.redis_user,
71
+ args.redis_host,
72
+ args.redis_port,
73
+ )
74
+ )
75
+ conn = redis.StrictRedis(
76
+ host=args.redis_host,
77
+ port=args.redis_port,
78
+ password=args.redis_pass,
79
+ username=args.redis_user,
80
+ decode_responses=False,
81
+ )
82
+ conn.ping()
83
+
84
+ # Extract version from Docker image tag if possible
85
+ # e.g., "redis:7.4.0" -> "7.4.0"
86
+ # e.g., "valkey/valkey:7.2.6-bookworm" -> "7.2.6"
87
+ git_version = None
88
+ if ":" in args.run_image:
89
+ tag = args.run_image.split(":")[-1]
90
+ # Try to extract version number from tag
91
+ # Common patterns: "7.4.0", "7.2.6-bookworm", "latest"
92
+ import re
93
+
94
+ version_match = re.match(r"^(\d+\.\d+\.\d+)", tag)
95
+ if version_match:
96
+ git_version = version_match.group(1)
97
+ logging.info(f"Extracted git_version '{git_version}' from image tag")
98
+
99
+ testDetails = {}
100
+ build_stream_fields, result = generate_benchmark_stream_request(
101
+ args.id,
102
+ conn,
103
+ args.run_image,
104
+ args.arch,
105
+ testDetails,
106
+ "n/a",
107
+ [],
108
+ None,
109
+ None,
110
+ None,
111
+ None,
112
+ None,
113
+ None,
114
+ None,
115
+ git_version, # Pass extracted version
116
+ None,
117
+ None,
118
+ None,
119
+ None,
120
+ ".*",
121
+ 0,
122
+ 10000,
123
+ args.tests_regexp,
124
+ ".*", # command_regexp
125
+ False, # use_git_timestamp
126
+ "redis", # server_name
127
+ "redis", # github_org
128
+ "redis", # github_repo
129
+ None, # existing_artifact_keys
130
+ )
131
+ build_stream_fields["github_repo"] = args.gh_repo
132
+ build_stream_fields["github_org"] = args.gh_org
133
+ build_stream_fields["restore_build_artifacts"] = "False"
134
+ server_name = args.gh_repo
135
+ if args.server_name is not None:
136
+ server_name = args.server_name
137
+ build_stream_fields["server_name"] = server_name
138
+ build_stream_fields["mnt_point"] = args.mnt_point
139
+ if args.docker_dont_air_gap is False:
140
+ docker_client = docker.from_env()
141
+ store_airgap_image_redis(conn, docker_client, args.run_image)
142
+
143
+ if result is True:
144
+ # Use architecture-specific stream
145
+ arch_specific_stream = get_arch_specific_stream_name(args.arch)
146
+ logging.info(
147
+ f"CLI adding work to architecture-specific stream: {arch_specific_stream}"
148
+ )
149
+ benchmark_stream_id = conn.xadd(arch_specific_stream, build_stream_fields)
150
+ logging.info(
151
+ "sucessfully requested a new run {}. Stream id: {}".format(
152
+ build_stream_fields, benchmark_stream_id
153
+ )
154
+ )
155
+
156
+
157
+ def main():
158
+ _, _, project_version = populate_with_poetry_data()
159
+ project_name = "redis-benchmarks-spec-cli"
160
+ parser = argparse.ArgumentParser(
161
+ description=get_version_string(project_name, project_version),
162
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
163
+ )
164
+ parser = spec_cli_args(parser)
165
+ args = parser.parse_args()
166
+ if args.tool == "trigger":
167
+ trigger_tests_cli_command_logic(args, project_name, project_version)
168
+ if args.tool == "stats":
169
+ generate_stats_cli_command_logic(args, project_name, project_version)
170
+ if args.tool == "dockerhub":
171
+ trigger_tests_dockerhub_cli_command_logic(args, project_name, project_version)
172
+
173
+
174
+ def get_commits_by_branch(args, repo):
175
+ total_commits = 0
176
+ commits = []
177
+ for commit in repo.iter_commits():
178
+ commit_datetime = commit.committed_datetime
179
+ git_timestamp_ms = int(
180
+ datetime.datetime.utcfromtimestamp(commit_datetime.timestamp()).timestamp()
181
+ * 1000
182
+ )
183
+ if (
184
+ args.from_date
185
+ <= datetime.datetime.utcfromtimestamp(commit_datetime.timestamp())
186
+ <= args.to_date
187
+ ):
188
+ if (args.last_n > 0 and total_commits < args.last_n) or args.last_n == -1:
189
+ total_commits = total_commits + 1
190
+ print(commit.summary)
191
+ commits.append(
192
+ {
193
+ "git_hash": commit.hexsha,
194
+ "git_branch": repo.active_branch.name,
195
+ "commit_summary": commit.summary,
196
+ "commit_datetime": str(commit_datetime),
197
+ "git_timestamp_ms": git_timestamp_ms,
198
+ }
199
+ )
200
+ return commits, total_commits
201
+
202
+
203
+ def get_commits_by_tags(args, repo):
204
+ commits = []
205
+ tags_regexp = args.tags_regexp
206
+ if tags_regexp == ".*":
207
+ logging.info(
208
+ "Acception all tags that follow semver between the timeframe. If you need further filter specify a regular expression via --tags-regexp"
209
+ )
210
+ else:
211
+ logging.info(
212
+ "Filtering all tags via a regular expression: {}".format(tags_regexp)
213
+ )
214
+ tags_regex_string = re.compile(tags_regexp)
215
+
216
+ tags = sorted(repo.tags, key=lambda t: t.commit.committed_datetime)
217
+ for tag in tags:
218
+
219
+ git_timestamp_ms = int(
220
+ datetime.datetime.utcfromtimestamp(
221
+ tag.commit.committed_datetime.timestamp()
222
+ ).timestamp()
223
+ * 1000
224
+ )
225
+
226
+ if (
227
+ args.from_date
228
+ <= datetime.datetime.utcfromtimestamp(
229
+ tag.commit.committed_datetime.timestamp()
230
+ )
231
+ <= args.to_date
232
+ ):
233
+ try:
234
+ version.Version(tag.name)
235
+ match_obj = re.search(tags_regex_string, tag.name)
236
+ if match_obj is None:
237
+ logging.info(
238
+ "Skipping {} given it does not match regex {}".format(
239
+ tag.name, tags_regexp
240
+ )
241
+ )
242
+ else:
243
+ git_version = tag.name
244
+ commit_datetime = str(tag.commit.committed_datetime)
245
+ print(
246
+ "Commit summary: {}. Extract semver: {}".format(
247
+ tag.commit.summary, git_version
248
+ )
249
+ )
250
+ commits.append(
251
+ {
252
+ "git_hash": tag.commit.hexsha,
253
+ "git_version": git_version,
254
+ "commit_summary": tag.commit.summary,
255
+ "commit_datetime": commit_datetime,
256
+ "git_timestamp_ms": git_timestamp_ms,
257
+ }
258
+ )
259
+ except packaging.version.InvalidVersion:
260
+ logging.info(
261
+ "Ignoring tag {} given we were not able to extract commit or version info from it.".format(
262
+ tag.name
263
+ )
264
+ )
265
+ pass
266
+ return commits
267
+
268
+
269
+ def get_repo(args):
270
+ redisDirPath = args.redis_repo
271
+ cleanUp = False
272
+ last_n = args.last_n
273
+ if redisDirPath is None:
274
+ cleanUp = True
275
+ redisDirPath = tempfile.mkdtemp()
276
+ remote_url = f"https://github.com/{args.gh_org}/{args.gh_repo}"
277
+ logging.info(
278
+ f"Retrieving redis repo from remote {remote_url} into {redisDirPath}. Using branch {args.branch}."
279
+ )
280
+ depth_str = ""
281
+ if last_n > 0:
282
+ depth_str = f" --depth {last_n}"
283
+ cmd = f"git clone {remote_url} {redisDirPath} --branch {args.branch} {depth_str}\n"
284
+ process = subprocess.Popen(
285
+ "/bin/bash", stdin=subprocess.PIPE, stdout=subprocess.PIPE
286
+ )
287
+ process.communicate(cmd.encode())
288
+ else:
289
+ logging.info(
290
+ "Using the following redis repo to retrieve versions info {}. No need to fetch remote data.".format(
291
+ redisDirPath
292
+ )
293
+ )
294
+ return redisDirPath, cleanUp
295
+
296
+
297
+ def check_benchmark_run_comment(comments):
298
+ res = False
299
+ pos = -1
300
+ for n, comment in enumerate(comments):
301
+ body = comment.body
302
+ if "CE Performance Automation" in body and "Triggered a benchmark" in body:
303
+ res = True
304
+ pos = n
305
+ return res, pos
306
+
307
+
308
+ def check_benchmark_build_comment(comments):
309
+ res = False
310
+ pos = -1
311
+ for n, comment in enumerate(comments):
312
+ body = comment.body
313
+ if "CE Performance Automation : step 1 of 2" in body:
314
+ res = True
315
+ pos = n
316
+ return res, pos
317
+
318
+
319
+ def trigger_tests_cli_command_logic(args, project_name, project_version):
320
+ logging.info(
321
+ "Using: {project_name} {project_version}".format(
322
+ project_name=project_name, project_version=project_version
323
+ )
324
+ )
325
+
326
+ if args.use_branch is False and args.use_tags is False:
327
+ logging.error("You must specify either --use-tags or --use-branch flag")
328
+ sys.exit(1)
329
+
330
+ github_token = args.github_token
331
+ pull_request = args.pull_request
332
+ verbose = True
333
+ auto_approve = args.auto_approve
334
+
335
+ fn = check_benchmark_build_comment
336
+ (
337
+ contains_regression_comment,
338
+ github_pr,
339
+ is_actionable_pr,
340
+ old_regression_comment_body,
341
+ pr_link,
342
+ regression_comment,
343
+ ) = check_github_available_and_actionable(
344
+ fn, github_token, pull_request, "redis", "redis", verbose
345
+ )
346
+
347
+ redisDirPath, cleanUp = get_repo(args)
348
+ repo = git.Repo(redisDirPath)
349
+
350
+ logging.info(
351
+ "Using the following timeframe: from {} to {}".format(
352
+ args.from_date, args.to_date
353
+ )
354
+ )
355
+
356
+ commits = []
357
+ if args.use_branch:
358
+ commits, total_commits = get_commits_by_branch(args, repo)
359
+ if args.use_tags:
360
+ commits = get_commits_by_tags(args, repo)
361
+
362
+ by_description = "n/a"
363
+ if args.use_branch:
364
+ by_description = "from branch {}".format(repo.active_branch.name)
365
+ if args.use_tags:
366
+ by_description = "by tags"
367
+ logging.info(
368
+ "Will trigger {} distinct tests {}.".format(len(commits), by_description)
369
+ )
370
+ if args.platform:
371
+ logging.info("Will trigger tests only for platform {}".format(args.platform))
372
+
373
+ hash_regexp = args.hash_regexp
374
+ if hash_regexp == ".*":
375
+ logging.info(
376
+ "Acception all commit hashes. If you need further filter specify a regular expression via --hash-regexp"
377
+ )
378
+ else:
379
+ logging.info(
380
+ "Filtering all commit hashes via a regular expression: {}".format(
381
+ hash_regexp
382
+ )
383
+ )
384
+ enable_hash_filtering = False
385
+ hash_filters = []
386
+ if args.git_hash != "":
387
+ enable_hash_filtering = True
388
+ hash_filters = args.git_hash.split(",")
389
+ logging.info(
390
+ f"There is a total of {len(hash_filters)} commit hash fitlers: {hash_filters}"
391
+ )
392
+ hash_regexp_string = re.compile(hash_regexp)
393
+ filtered_hash_commits = []
394
+ for cdict in commits:
395
+ commit_hash = cdict["git_hash"]
396
+ if enable_hash_filtering:
397
+ if commit_hash not in hash_filters:
398
+ logging.info(
399
+ f"Skipping {commit_hash} given it does not match any commit hash in {hash_filters}"
400
+ )
401
+ continue
402
+ commit_summary = cdict["commit_summary"]
403
+ commit_datetime = cdict["commit_datetime"]
404
+ match_obj = re.search(hash_regexp_string, commit_hash)
405
+ if match_obj is None:
406
+ logging.info(
407
+ "Skipping {} given it does not match regex {}".format(
408
+ commit_hash, hash_regexp_string
409
+ )
410
+ )
411
+ else:
412
+ print(
413
+ f"Commit with hash: {commit_hash} from {commit_datetime} added. summary: {commit_summary}"
414
+ )
415
+ filtered_hash_commits.append(cdict)
416
+
417
+ logging.info(
418
+ "Checking connection to redis with user: {}, host: {}, port: {}".format(
419
+ args.redis_user,
420
+ args.redis_host,
421
+ args.redis_port,
422
+ )
423
+ )
424
+ conn = redis.StrictRedis(
425
+ host=args.redis_host,
426
+ port=args.redis_port,
427
+ password=args.redis_pass,
428
+ username=args.redis_user,
429
+ decode_responses=False,
430
+ )
431
+ conn.ping()
432
+ for rep in range(0, 1):
433
+ for cdict in filtered_hash_commits:
434
+ # Pass local repository path if using local repo
435
+ local_repo_path = redisDirPath if args.redis_repo is not None else None
436
+
437
+ (
438
+ result,
439
+ error_msg,
440
+ commit_dict,
441
+ _,
442
+ binary_key,
443
+ binary_value,
444
+ ) = get_commit_dict_from_sha(
445
+ cdict["git_hash"],
446
+ args.gh_org,
447
+ args.gh_repo,
448
+ cdict,
449
+ True,
450
+ args.gh_token,
451
+ None, # gh_branch
452
+ local_repo_path,
453
+ )
454
+ if args.platform:
455
+ commit_dict["platform"] = args.platform
456
+ tests_priority_upper_limit = args.tests_priority_upper_limit
457
+ tests_priority_lower_limit = args.tests_priority_lower_limit
458
+ tests_regexp = args.tests_regexp
459
+ tests_groups_regexp = args.tests_groups_regexp
460
+ commit_dict["tests_priority_upper_limit"] = tests_priority_upper_limit
461
+ commit_dict["tests_priority_lower_limit"] = tests_priority_lower_limit
462
+ commit_dict["tests_regexp"] = tests_regexp
463
+ commit_dict["tests_groups_regexp"] = tests_groups_regexp
464
+ commit_dict["github_org"] = args.gh_org
465
+ commit_dict["github_repo"] = args.gh_repo
466
+ if args.arch is not None:
467
+ commit_dict["build_arch"] = args.arch
468
+ commit_dict["arch"] = args.arch
469
+ if args.server_name is not None and args.server_name != "":
470
+ commit_dict["server_name"] = args.server_name
471
+ if args.build_artifacts != "":
472
+ commit_dict["build_artifacts"] = args.build_artifacts
473
+ if args.build_command != "":
474
+ commit_dict["build_command"] = args.build_command
475
+ if pull_request is not None:
476
+ logging.info(
477
+ f"Have a pull request info to include in build request {pull_request}"
478
+ )
479
+ commit_dict["pull_request"] = pull_request
480
+ git_hash = cdict["git_hash"]
481
+ git_branch = "n/a"
482
+ if "git_branch" in cdict:
483
+ git_branch = cdict["git_branch"]
484
+ commit_datetime = cdict["commit_datetime"]
485
+ commit_summary = cdict["commit_summary"]
486
+ reply_fields = {}
487
+ use_git_timestamp = args.use_git_timestamp
488
+ if use_git_timestamp is False:
489
+ reply_fields["use_git_timestamp"] = str(use_git_timestamp)
490
+
491
+ logging.info(
492
+ f"Setting use use_git_timestamp={use_git_timestamp}. ({args.use_git_timestamp})"
493
+ )
494
+
495
+ if result is True:
496
+ stream_id = "n/a"
497
+ if args.dry_run is False:
498
+ (
499
+ result,
500
+ reply_fields,
501
+ error_msg,
502
+ ) = request_build_from_commit_info(
503
+ conn,
504
+ commit_dict,
505
+ reply_fields,
506
+ binary_key,
507
+ binary_value,
508
+ REDIS_BINS_EXPIRE_SECS,
509
+ )
510
+ stream_id = reply_fields["id"]
511
+ logging.info(
512
+ "Successfully requested a build for commit: {}. Date: {} Request stream id: {}. full commited info: {}. Reply fields: {}".format(
513
+ cdict["git_hash"],
514
+ cdict["commit_datetime"],
515
+ stream_id,
516
+ commit_dict,
517
+ reply_fields,
518
+ )
519
+ )
520
+
521
+ if args.wait_build is True:
522
+ build_start_datetime = datetime.datetime.utcnow()
523
+ decoded_stream_id = stream_id.decode()
524
+ builder_list_streams = (
525
+ f"builder:{decoded_stream_id}:builds_completed"
526
+ )
527
+ len_list = 0
528
+ stream_ack = False
529
+ sleep_secs = 10
530
+ benchmark_stream_ids = []
531
+ while len_list == 0 or stream_ack is False:
532
+
533
+ logging.info(
534
+ f"checking benchmark streams info in key: {builder_list_streams}"
535
+ )
536
+ benchmark_stream_ids = conn.lrange(
537
+ builder_list_streams, 0, -1
538
+ )
539
+ len_list = len(benchmark_stream_ids)
540
+ logging.info(
541
+ f"There is a total of {len_list} already build benchmark stream ids for this build: {benchmark_stream_ids}"
542
+ )
543
+
544
+ if len_list > 0:
545
+ pending_build_streams = conn.xpending_range(
546
+ STREAM_KEYNAME_GH_EVENTS_COMMIT,
547
+ STREAM_GH_EVENTS_COMMIT_BUILDERS_CG,
548
+ "-",
549
+ "+",
550
+ 1000,
551
+ )
552
+ len_pending = len(pending_build_streams)
553
+ logging.info(
554
+ f"There is a total of {len_pending} pending builds for stream {STREAM_KEYNAME_GH_EVENTS_COMMIT} and cg {STREAM_GH_EVENTS_COMMIT_BUILDERS_CG}. Checking for stream id: {stream_id}"
555
+ )
556
+ found_id = False
557
+ for pending_try in pending_build_streams:
558
+ logging.info(f"pending entry: {pending_try}")
559
+ pending_id = pending_try["message_id"]
560
+ if stream_id == pending_id:
561
+ found_id = True
562
+ logging.info(
563
+ f"Found the stream id {stream_id} as part of pending entry list. Waiting for it to be ack."
564
+ )
565
+
566
+ if found_id is True:
567
+ logging.info(
568
+ f"Sleeping for {sleep_secs} before checking pending list again."
569
+ )
570
+ time.sleep(sleep_secs)
571
+ else:
572
+ stream_ack = True
573
+ else:
574
+ logging.info(
575
+ f"Sleeping for {sleep_secs} before checking builds again."
576
+ )
577
+ time.sleep(sleep_secs)
578
+ logging.info(
579
+ f"FINAL total of {len_list} already build benchmark stream ids for this build: {benchmark_stream_ids}"
580
+ )
581
+ build_end_datetime = datetime.datetime.utcnow()
582
+ build_duration = build_end_datetime - build_start_datetime
583
+ build_duration_secs = build_duration.total_seconds()
584
+
585
+ comment_body = generate_build_finished_pr_comment(
586
+ benchmark_stream_ids,
587
+ commit_datetime,
588
+ commit_summary,
589
+ git_branch,
590
+ git_hash,
591
+ tests_groups_regexp,
592
+ tests_priority_lower_limit,
593
+ tests_priority_upper_limit,
594
+ tests_regexp,
595
+ build_start_datetime,
596
+ build_duration_secs,
597
+ )
598
+ if is_actionable_pr:
599
+ if contains_regression_comment:
600
+ update_comment_if_needed(
601
+ auto_approve,
602
+ comment_body,
603
+ old_regression_comment_body,
604
+ regression_comment,
605
+ verbose,
606
+ )
607
+ else:
608
+ create_new_pr_comment(
609
+ auto_approve, comment_body, github_pr, pr_link
610
+ )
611
+
612
+ else:
613
+ logging.info(
614
+ "DRY-RUN: build for commit: {}. Date: {} Full commited info: {}".format(
615
+ cdict["git_hash"],
616
+ cdict["commit_datetime"],
617
+ commit_dict,
618
+ )
619
+ )
620
+ else:
621
+ logging.error(error_msg)
622
+ if cleanUp is True:
623
+ logging.info("Removing temporary redis dir {}.".format(redisDirPath))
624
+ shutil.rmtree(redisDirPath)