buildgrid 0.2.53__tar.gz → 0.3.1__tar.gz

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 (438) hide show
  1. {buildgrid-0.2.53 → buildgrid-0.3.1}/PKG-INFO +3 -2
  2. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/settings/parser.py +4 -9
  3. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/settings/schema.yml +4 -6
  4. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/index/sql.py +29 -15
  5. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/sql.py +4 -17
  6. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/asset.py +4 -4
  7. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/impl.py +42 -69
  8. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/notifier.py +2 -38
  9. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/0c17a7cb2bc5_initial_database_state.py +0 -4
  10. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/models.py +2 -2
  11. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/provider.py +23 -89
  12. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/utils.py +8 -35
  13. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/version.py +1 -1
  14. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid.egg-info/PKG-INFO +3 -2
  15. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid.egg-info/SOURCES.txt +0 -3
  16. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid.egg-info/requires.txt +2 -1
  17. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/bots-interface.yml +0 -1
  18. {buildgrid-0.2.53 → buildgrid-0.3.1}/pyproject.toml +6 -3
  19. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_instance_pools.py +1 -1
  20. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_scheduler.py +29 -22
  21. buildgrid-0.2.53/buildgrid/server/cas/storage/index/sql_dialect_delegates/__init__.py +0 -4
  22. buildgrid-0.2.53/buildgrid/server/cas/storage/index/sql_dialect_delegates/postgresqldelegate.py +0 -65
  23. buildgrid-0.2.53/buildgrid/server/cas/storage/index/sql_dialect_delegates/sqlitedelegate.py +0 -65
  24. {buildgrid-0.2.53 → buildgrid-0.3.1}/BuildGrid.doap +0 -0
  25. {buildgrid-0.2.53 → buildgrid-0.3.1}/CONTRIBUTING.rst +0 -0
  26. {buildgrid-0.2.53 → buildgrid-0.3.1}/LICENSE +0 -0
  27. {buildgrid-0.2.53 → buildgrid-0.3.1}/MANIFEST.in +0 -0
  28. {buildgrid-0.2.53 → buildgrid-0.3.1}/README.rst +0 -0
  29. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/__init__.py +0 -0
  30. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/__init__.py +0 -0
  31. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/__init__.py +0 -0
  32. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/__init__.py +0 -0
  33. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/__init__.py +0 -0
  34. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/__init__.py +0 -0
  35. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/__init__.py +0 -0
  36. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.py +0 -0
  37. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.pyi +0 -0
  38. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.py +0 -0
  39. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.pyi +0 -0
  40. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc_aio.py +0 -0
  41. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc_aio.pyi +0 -0
  42. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/__init__.py +0 -0
  43. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/__init__.py +0 -0
  44. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py +0 -0
  45. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.pyi +0 -0
  46. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py +0 -0
  47. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.pyi +0 -0
  48. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc_aio.py +0 -0
  49. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc_aio.pyi +0 -0
  50. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/__init__.py +0 -0
  51. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/__init__.py +0 -0
  52. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2.py +0 -0
  53. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2.pyi +0 -0
  54. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc.py +0 -0
  55. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc.pyi +0 -0
  56. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc_aio.py +0 -0
  57. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/remote/logstream/v1/remote_logstream_pb2_grpc_aio.pyi +0 -0
  58. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/__init__.py +0 -0
  59. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/semver_pb2.py +0 -0
  60. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/semver_pb2.pyi +0 -0
  61. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc.py +0 -0
  62. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc.pyi +0 -0
  63. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc_aio.py +0 -0
  64. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/bazel/semver/semver_pb2_grpc_aio.pyi +0 -0
  65. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/__init__.py +0 -0
  66. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/execution_stats_pb2.py +0 -0
  67. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/execution_stats_pb2.pyi +0 -0
  68. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc.py +0 -0
  69. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc.pyi +0 -0
  70. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc_aio.py +0 -0
  71. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildbox/execution_stats_pb2_grpc_aio.pyi +0 -0
  72. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/__init__.py +0 -0
  73. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/identity_pb2.py +0 -0
  74. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/identity_pb2.pyi +0 -0
  75. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc.py +0 -0
  76. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc.pyi +0 -0
  77. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc_aio.py +0 -0
  78. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/identity_pb2_grpc_aio.pyi +0 -0
  79. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/introspection_pb2.py +0 -0
  80. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/introspection_pb2.pyi +0 -0
  81. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc.py +0 -0
  82. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc.pyi +0 -0
  83. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc_aio.py +0 -0
  84. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/introspection_pb2_grpc_aio.pyi +0 -0
  85. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/messaging_pb2.py +0 -0
  86. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/messaging_pb2.pyi +0 -0
  87. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc.py +0 -0
  88. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc.pyi +0 -0
  89. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc_aio.py +0 -0
  90. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/messaging_pb2_grpc_aio.pyi +0 -0
  91. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/monitoring_pb2.py +0 -0
  92. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/monitoring_pb2.pyi +0 -0
  93. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc.py +0 -0
  94. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc.pyi +0 -0
  95. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc_aio.py +0 -0
  96. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/monitoring_pb2_grpc_aio.pyi +0 -0
  97. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/query_build_events_pb2.py +0 -0
  98. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/query_build_events_pb2.pyi +0 -0
  99. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc.py +0 -0
  100. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc.pyi +0 -0
  101. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc_aio.py +0 -0
  102. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/query_build_events_pb2_grpc_aio.pyi +0 -0
  103. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/quota_pb2.py +0 -0
  104. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/quota_pb2.pyi +0 -0
  105. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc.py +0 -0
  106. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc.pyi +0 -0
  107. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc_aio.py +0 -0
  108. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/quota_pb2_grpc_aio.pyi +0 -0
  109. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/scheduling_pb2.py +0 -0
  110. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/scheduling_pb2.pyi +0 -0
  111. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc.py +0 -0
  112. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc.pyi +0 -0
  113. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc_aio.py +0 -0
  114. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/build/buildgrid/scheduling_pb2_grpc_aio.pyi +0 -0
  115. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/__init__.py +0 -0
  116. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/__init__.py +0 -0
  117. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/annotations_pb2.py +0 -0
  118. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/annotations_pb2.pyi +0 -0
  119. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/annotations_pb2_grpc.py +0 -0
  120. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/annotations_pb2_grpc.pyi +0 -0
  121. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/annotations_pb2_grpc_aio.py +0 -0
  122. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/annotations_pb2_grpc_aio.pyi +0 -0
  123. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/client_pb2.py +0 -0
  124. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/client_pb2.pyi +0 -0
  125. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/client_pb2_grpc.py +0 -0
  126. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/client_pb2_grpc.pyi +0 -0
  127. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/client_pb2_grpc_aio.py +0 -0
  128. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/client_pb2_grpc_aio.pyi +0 -0
  129. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/field_behavior_pb2.py +0 -0
  130. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/field_behavior_pb2.pyi +0 -0
  131. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/field_behavior_pb2_grpc.py +0 -0
  132. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/field_behavior_pb2_grpc.pyi +0 -0
  133. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/field_behavior_pb2_grpc_aio.py +0 -0
  134. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/field_behavior_pb2_grpc_aio.pyi +0 -0
  135. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/http_pb2.py +0 -0
  136. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/http_pb2.pyi +0 -0
  137. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/http_pb2_grpc.py +0 -0
  138. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/http_pb2_grpc.pyi +0 -0
  139. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/http_pb2_grpc_aio.py +0 -0
  140. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/api/http_pb2_grpc_aio.pyi +0 -0
  141. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/__init__.py +0 -0
  142. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/bytestream_pb2.py +0 -0
  143. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/bytestream_pb2.pyi +0 -0
  144. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc.py +0 -0
  145. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc.pyi +0 -0
  146. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc_aio.py +0 -0
  147. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/bytestream/bytestream_pb2_grpc_aio.pyi +0 -0
  148. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/__init__.py +0 -0
  149. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/__init__.py +0 -0
  150. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/__init__.py +0 -0
  151. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2.py +0 -0
  152. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2.pyi +0 -0
  153. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc.py +0 -0
  154. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc.pyi +0 -0
  155. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc_aio.py +0 -0
  156. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_events_pb2_grpc_aio.pyi +0 -0
  157. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2.py +0 -0
  158. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2.pyi +0 -0
  159. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc.py +0 -0
  160. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc.pyi +0 -0
  161. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc_aio.py +0 -0
  162. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/build_status_pb2_grpc_aio.pyi +0 -0
  163. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2.py +0 -0
  164. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2.pyi +0 -0
  165. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc.py +0 -0
  166. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc.pyi +0 -0
  167. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc_aio.py +0 -0
  168. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/build/v1/publish_build_event_pb2_grpc_aio.pyi +0 -0
  169. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/__init__.py +0 -0
  170. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/__init__.py +0 -0
  171. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2.py +0 -0
  172. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2.pyi +0 -0
  173. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc.py +0 -0
  174. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc.pyi +0 -0
  175. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc_aio.py +0 -0
  176. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/bots_pb2_grpc_aio.pyi +0 -0
  177. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2.py +0 -0
  178. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2.pyi +0 -0
  179. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc.py +0 -0
  180. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc.pyi +0 -0
  181. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc_aio.py +0 -0
  182. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/command_pb2_grpc_aio.pyi +0 -0
  183. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2.py +0 -0
  184. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2.pyi +0 -0
  185. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc.py +0 -0
  186. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc.pyi +0 -0
  187. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc_aio.py +0 -0
  188. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/tasks_pb2_grpc_aio.pyi +0 -0
  189. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2.py +0 -0
  190. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2.pyi +0 -0
  191. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc.py +0 -0
  192. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc.pyi +0 -0
  193. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc_aio.py +0 -0
  194. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/devtools/remoteworkers/v1test2/worker_pb2_grpc_aio.pyi +0 -0
  195. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/__init__.py +0 -0
  196. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/operations_pb2.py +0 -0
  197. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/operations_pb2.pyi +0 -0
  198. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/operations_pb2_grpc.py +0 -0
  199. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/operations_pb2_grpc.pyi +0 -0
  200. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/operations_pb2_grpc_aio.py +0 -0
  201. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/longrunning/operations_pb2_grpc_aio.pyi +0 -0
  202. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/__init__.py +0 -0
  203. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/code_pb2.py +0 -0
  204. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/code_pb2.pyi +0 -0
  205. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/code_pb2_grpc.py +0 -0
  206. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/code_pb2_grpc.pyi +0 -0
  207. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/code_pb2_grpc_aio.py +0 -0
  208. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/code_pb2_grpc_aio.pyi +0 -0
  209. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/error_details_pb2.py +0 -0
  210. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/error_details_pb2.pyi +0 -0
  211. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/error_details_pb2_grpc.py +0 -0
  212. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/error_details_pb2_grpc.pyi +0 -0
  213. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/error_details_pb2_grpc_aio.py +0 -0
  214. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/error_details_pb2_grpc_aio.pyi +0 -0
  215. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/status_pb2.py +0 -0
  216. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/status_pb2.pyi +0 -0
  217. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/status_pb2_grpc.py +0 -0
  218. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/status_pb2_grpc.pyi +0 -0
  219. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/status_pb2_grpc_aio.py +0 -0
  220. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/_protos/google/rpc/status_pb2_grpc_aio.pyi +0 -0
  221. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/__init__.py +0 -0
  222. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/__init__.py +0 -0
  223. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/__init__.py +0 -0
  224. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/action_cache_abc.py +0 -0
  225. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/lru_cache.py +0 -0
  226. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/mirrored_cache.py +0 -0
  227. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/redis_cache.py +0 -0
  228. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/remote_cache.py +0 -0
  229. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/s3_cache.py +0 -0
  230. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/sharded_cache.py +0 -0
  231. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/with_cache.py +0 -0
  232. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/caches/write_once_cache.py +0 -0
  233. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/instance.py +0 -0
  234. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/actioncache/service.py +0 -0
  235. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/__init__.py +0 -0
  236. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/cli.py +0 -0
  237. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/__init__.py +0 -0
  238. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_actioncache.py +0 -0
  239. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_capabilities.py +0 -0
  240. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_cas.py +0 -0
  241. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_cleanup.py +0 -0
  242. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_execute.py +0 -0
  243. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_janitor.py +0 -0
  244. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_logstream.py +0 -0
  245. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_operation.py +0 -0
  246. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_quota.py +0 -0
  247. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/cmd_server.py +0 -0
  248. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/commands/rpc_utils.py +0 -0
  249. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/settings/__init__.py +0 -0
  250. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/settings/config.py +0 -0
  251. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/settings/mapper.py +0 -0
  252. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/app/settings/reference.yml +0 -0
  253. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/auth/__init__.py +0 -0
  254. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/auth/config.py +0 -0
  255. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/auth/enums.py +0 -0
  256. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/auth/exceptions.py +0 -0
  257. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/auth/manager.py +0 -0
  258. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/bots/__init__.py +0 -0
  259. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/bots/instance.py +0 -0
  260. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/bots/service.py +0 -0
  261. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/build_events/__init__.py +0 -0
  262. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/build_events/service.py +0 -0
  263. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/build_events/storage.py +0 -0
  264. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/capabilities/__init__.py +0 -0
  265. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/capabilities/instance.py +0 -0
  266. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/capabilities/service.py +0 -0
  267. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/__init__.py +0 -0
  268. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/instance.py +0 -0
  269. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/service.py +0 -0
  270. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/__init__.py +0 -0
  271. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/disk.py +0 -0
  272. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/index/__init__.py +0 -0
  273. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/index/index_abc.py +0 -0
  274. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/index/redis.py +0 -0
  275. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/lru_memory_cache.py +0 -0
  276. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/redis.py +0 -0
  277. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/remote.py +0 -0
  278. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/replicated.py +0 -0
  279. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/s3.py +0 -0
  280. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/sharded.py +0 -0
  281. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/size_differentiated.py +0 -0
  282. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/storage_abc.py +0 -0
  283. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cas/storage/with_cache.py +0 -0
  284. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/__init__.py +0 -0
  285. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/cleanup.py +0 -0
  286. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/__init__.py +0 -0
  287. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/config.py +0 -0
  288. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/index.py +0 -0
  289. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/s3.py +0 -0
  290. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/sql.py +0 -0
  291. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/types.py +0 -0
  292. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/cleanup/janitor/utils.py +0 -0
  293. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/__init__.py +0 -0
  294. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/actioncache.py +0 -0
  295. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/auth_token_loader.py +0 -0
  296. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/authentication.py +0 -0
  297. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/capabilities.py +0 -0
  298. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/cas.py +0 -0
  299. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/channel.py +0 -0
  300. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/interceptors.py +0 -0
  301. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/logstream.py +0 -0
  302. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/quota.py +0 -0
  303. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/client/retrier.py +0 -0
  304. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/context.py +0 -0
  305. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/controller.py +0 -0
  306. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/__init__.py +0 -0
  307. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/authorize.py +0 -0
  308. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/errors.py +0 -0
  309. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/instance.py +0 -0
  310. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/io.py +0 -0
  311. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/limiter.py +0 -0
  312. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/metadata.py +0 -0
  313. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/requestid.py +0 -0
  314. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/rpc.py +0 -0
  315. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/decorators/time.py +0 -0
  316. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/enums.py +0 -0
  317. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/exceptions.py +0 -0
  318. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/execution/__init__.py +0 -0
  319. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/execution/instance.py +0 -0
  320. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/execution/service.py +0 -0
  321. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/introspection/__init__.py +0 -0
  322. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/introspection/instance.py +0 -0
  323. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/introspection/service.py +0 -0
  324. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/limiter.py +0 -0
  325. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/logging.py +0 -0
  326. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/metadata.py +0 -0
  327. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/metrics_names.py +0 -0
  328. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/metrics_tags.py +0 -0
  329. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/metrics_utils.py +0 -0
  330. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/monitoring.py +0 -0
  331. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/__init__.py +0 -0
  332. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/filtering/__init__.py +0 -0
  333. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/filtering/filter.py +0 -0
  334. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/filtering/filter_grammar.lark +0 -0
  335. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/filtering/interpreter.py +0 -0
  336. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/filtering/parser.py +0 -0
  337. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/filtering/sanitizer.py +0 -0
  338. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/instance.py +0 -0
  339. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/operations/service.py +0 -0
  340. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/quota/__init__.py +0 -0
  341. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/quota/service.py +0 -0
  342. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/redis/__init__.py +0 -0
  343. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/redis/provider.py +0 -0
  344. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/s3/__init__.py +0 -0
  345. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/s3/s3utils.py +0 -0
  346. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/__init__.py +0 -0
  347. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/assigner.py +0 -0
  348. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/cohorts.py +0 -0
  349. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/events.py +0 -0
  350. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/scheduler/properties.py +0 -0
  351. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sentry.py +0 -0
  352. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/server.py +0 -0
  353. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/servicer.py +0 -0
  354. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/settings.py +0 -0
  355. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/__init__.py +0 -0
  356. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/README +0 -0
  357. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/env.py +0 -0
  358. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/script.py.mako +0 -0
  359. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/0596ea8f5c61_add_bot_locality_hints_table_and_.py +0 -0
  360. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/12992085e81a_add_a_job_index_on_worker_name_and_.py +0 -0
  361. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/1f959c3834d3_drop_the_leases_table.py +0 -0
  362. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/22cc661efef9_add_instance_quotas_table.py +0 -0
  363. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/55acd9b4ec38_add_ix_jobs_property_label_stage.py +0 -0
  364. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/55fcf6c874d3_remove_request_metadata_from_operations.py +0 -0
  365. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/5745d1f0e537_drop_unused_indexes_and_create_.py +0 -0
  366. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/5b90ed0e9d0b_drop_ix_jobs_worker_name_stage.py +0 -0
  367. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/85096c931383_drop_ix_jobs_stage_property_label_and_.py +0 -0
  368. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/8fd7118e215e_add_instanced_job_scheduling_index.py +0 -0
  369. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/90bd87d052a0_add_an_audit_table_for_job_state_changes.py +0 -0
  370. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/910398062924_add_property_labels_table.py +0 -0
  371. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/9e7a59ee4370_add_bot_platform_capabilities_to_the_.py +0 -0
  372. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/9ecd996412a9_add_worker_name_to_jobs_table.py +0 -0
  373. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/b3b9d7300155_add_capacity_to_bots.py +0 -0
  374. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/bde0df23383b_add_cohort_to_bots.py +0 -0
  375. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/d850621a10d8_add_assigner_name_to_jobs.py +0 -0
  376. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/sql/alembic/versions/fb8afebee8e6_add_ix_jobs_worker_name_stage.py +0 -0
  377. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/threading.py +0 -0
  378. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/types.py +0 -0
  379. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/utils/__init__.py +0 -0
  380. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/utils/async_lru_cache.py +0 -0
  381. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/utils/bots.py +0 -0
  382. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/utils/cancellation.py +0 -0
  383. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid/server/utils/digests.py +0 -0
  384. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid.egg-info/dependency_links.txt +0 -0
  385. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid.egg-info/entry_points.txt +0 -0
  386. {buildgrid-0.2.53 → buildgrid-0.3.1}/buildgrid.egg-info/top_level.txt +0 -0
  387. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/all-in-one.yml +0 -0
  388. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/artifacts.yml +0 -0
  389. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/cache.yml +0 -0
  390. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/controller.yml +0 -0
  391. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/default.yml +0 -0
  392. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/logstream.yml +0 -0
  393. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/monitoring-controller.yml +0 -0
  394. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/multi-container.yml +0 -0
  395. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/multi-layer-storage.yml +0 -0
  396. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/redis-cache.yml +0 -0
  397. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/s3-indexed-cas.yml +0 -0
  398. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/storage-redis.yml +0 -0
  399. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/storage-s3.yml +0 -0
  400. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/storage.yml +0 -0
  401. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/with-metering.yml +0 -0
  402. {buildgrid-0.2.53 → buildgrid-0.3.1}/data/config/with-pgbouncer.yml +0 -0
  403. {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/Makefile +0 -0
  404. {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/basic-disk-cas.yml +0 -0
  405. {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/bazel-example-server.yml +0 -0
  406. {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/buildstream-example-server.yml +0 -0
  407. {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/cas-and-ac.yml +0 -0
  408. {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/cas-example-server.yml +0 -0
  409. {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/execution-and-bots.yml +0 -0
  410. {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/data/postgresql-index-cas-only.yml +0 -0
  411. {buildgrid-0.2.53 → buildgrid-0.3.1}/docs/source/index.rst +0 -0
  412. {buildgrid-0.2.53 → buildgrid-0.3.1}/setup.cfg +0 -0
  413. {buildgrid-0.2.53 → buildgrid-0.3.1}/setup.py +0 -0
  414. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/auth.yaml +0 -0
  415. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwks-valid.json +0 -0
  416. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-hs256-conflicting.secret +0 -0
  417. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-hs256-expired.token +0 -0
  418. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-hs256-matching.secret +0 -0
  419. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-hs256-unbounded.token +0 -0
  420. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-hs256-valid.token +0 -0
  421. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-conflicting.pub.key +0 -0
  422. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-expired.token +0 -0
  423. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-jwk-encrypted.token +0 -0
  424. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-matching.priv.key +0 -0
  425. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-matching.pub.key +0 -0
  426. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-unbounded.token +0 -0
  427. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/auth/data/jwt-rs256-valid.token +0 -0
  428. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_async_lru_cache.py +0 -0
  429. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_example_configs.py +0 -0
  430. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_execution_instance.py +0 -0
  431. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_job_assigner.py +0 -0
  432. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_limiter.py +0 -0
  433. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_logging.py +0 -0
  434. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_metrics_tags.py +0 -0
  435. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_metrics_utils.py +0 -0
  436. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_mirrored_cache.py +0 -0
  437. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_request_metadata_utils.py +0 -0
  438. {buildgrid-0.2.53 → buildgrid-0.3.1}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: buildgrid
3
- Version: 0.2.53
3
+ Version: 0.3.1
4
4
  Summary: A remote execution service
5
5
  License: Apache License, Version 2.0
6
6
  Project-URL: Homepage, https://buildgrid.build
@@ -42,7 +42,7 @@ Requires-Dist: fakeredis>=2.10.1; extra == "redis"
42
42
  Requires-Dist: redis>=4.5.1; extra == "redis"
43
43
  Requires-Dist: hiredis; extra == "redis"
44
44
  Provides-Extra: docs
45
- Requires-Dist: Sphinx; extra == "docs"
45
+ Requires-Dist: Sphinx<=8; extra == "docs"
46
46
  Requires-Dist: sphinx-click; extra == "docs"
47
47
  Requires-Dist: sphinx-rtd-theme; extra == "docs"
48
48
  Requires-Dist: sphinxcontrib-apidoc; extra == "docs"
@@ -77,6 +77,7 @@ Requires-Dist: pytest-xdist; extra == "dev"
77
77
  Requires-Dist: memray; extra == "dev"
78
78
  Requires-Dist: ruff; extra == "dev"
79
79
  Requires-Dist: grpcio-tools; extra == "dev"
80
+ Requires-Dist: bump4version; extra == "dev"
80
81
  Provides-Extra: mypy
81
82
  Requires-Dist: mypy; extra == "mypy"
82
83
  Requires-Dist: SQLAlchemy[mypy]; extra == "mypy"
@@ -1025,7 +1025,7 @@ def load_sql_scheduler(
1025
1025
  sql_ro = sql_ro or sql
1026
1026
  sql_notifier = sql_notifier or sql
1027
1027
 
1028
- logstream_url, logstream_credentials, logstream_instance = get_logstream_connection_info(logstream)
1028
+ logstream_url, logstream_credentials = get_logstream_connection_info(logstream)
1029
1029
  logstream_channel: grpc.Channel | None = None
1030
1030
  if logstream_url is not None:
1031
1031
  logstream_credentials = logstream_credentials or {}
@@ -1081,7 +1081,6 @@ def load_sql_scheduler(
1081
1081
  ),
1082
1082
  bot_session_keepalive_timeout=bot_session_keepalive_timeout,
1083
1083
  logstream_channel=logstream_channel,
1084
- logstream_instance=logstream_instance,
1085
1084
  asset_client=asset_client,
1086
1085
  queued_action_retention_hours=queued_action_retention_hours,
1087
1086
  completed_action_retention_hours=completed_action_retention_hours,
@@ -2150,7 +2149,6 @@ def load_metering_service_client(
2150
2149
  def load_asset_client(
2151
2150
  url: str,
2152
2151
  credentials: ClientCredentials | None = None,
2153
- instance_name: str = "",
2154
2152
  request_timeout: float = 5.0,
2155
2153
  retries: int = 3,
2156
2154
  ) -> AssetClient:
@@ -2162,7 +2160,6 @@ def load_asset_client(
2162
2160
 
2163
2161
  - !asset-client
2164
2162
  url: https://remote-asset.com
2165
- instance-name: dev
2166
2163
  credentials:
2167
2164
  tls-client-cert: /path/to/cert
2168
2165
  auth-token: /path/to/token
@@ -2179,7 +2176,7 @@ def load_asset_client(
2179
2176
  server_cert=credentials.get("tls-server-cert"),
2180
2177
  timeout=request_timeout,
2181
2178
  )
2182
- return AssetClient(channel=channel, instance_name=instance_name, retries=retries)
2179
+ return AssetClient(channel=channel, retries=retries)
2183
2180
 
2184
2181
 
2185
2182
  @object_tag("!introspection")
@@ -2378,18 +2375,16 @@ def _validate_server_credentials(credentials: dict[str, str] | None) -> None:
2378
2375
  sys.exit(-1)
2379
2376
 
2380
2377
 
2381
- def get_logstream_connection_info(logstream: Any) -> tuple[str | None, dict[str, str] | None, str | None]:
2378
+ def get_logstream_connection_info(logstream: Any) -> tuple[str | None, dict[str, str] | None]:
2382
2379
  logstream_url = None
2383
2380
  credentials = None
2384
- logstream_instance_name = None
2385
2381
  if logstream:
2386
2382
  logstream_url = logstream["url"]
2387
2383
  credentials = logstream.get("credentials")
2388
2384
  if not _validate_url_and_credentials(logstream_url, credentials=credentials):
2389
2385
  sys.exit(-1)
2390
- logstream_instance_name = logstream.get("instance-name", "")
2391
2386
 
2392
- return logstream_url, credentials, logstream_instance_name
2387
+ return logstream_url, credentials
2393
2388
 
2394
2389
 
2395
2390
  def get_schema(strict: bool = False) -> Any:
@@ -472,7 +472,7 @@ definitions:
472
472
  priority-assignment-percentage: { type: number, minimum: 0 }
473
473
  metering-service-client: { "$ref": "#/definitions/metering-service-client" }
474
474
  metering-throttle-action: { type: string, enum: [deprioritize, reject] }
475
- logstream: { "$ref": "#/definitions/grpc-connection-options" }
475
+ logstream: { "$ref": "#/definitions/logstream-connection-options" }
476
476
  asset-client: { "$ref": "#/definitions/asset-client" }
477
477
  action-browser-url: { type: string }
478
478
  poll-interval: { type: number, minimum: 0 }
@@ -645,12 +645,11 @@ definitions:
645
645
  properties:
646
646
  kind: { type: string, enum: [ "!asset-client" ] }
647
647
  url: { type: string }
648
- instance-name: { type: string }
649
648
  channel-options: { type: object, propertyNames: { pattern: "^[a-z0-9-]+$" } }
650
649
  request-timeout: { type: number }
651
650
  credentials: { "$ref": "#/definitions/grpc-credentials" }
652
651
  retries: { type: number }
653
- required: [kind, url, instance-name]
652
+ required: [kind, url]
654
653
 
655
654
  metering-service-client:
656
655
  type: object
@@ -783,16 +782,15 @@ definitions:
783
782
  retry-limit: { type: integer, min: 0 }
784
783
  required: [instance-name, index, high-watermark, low-watermark, batch-size]
785
784
 
786
- grpc-connection-options:
785
+ logstream-connection-options:
787
786
  type: object
788
787
  propertyNames: { pattern: "^[A-Za-z0-9-]*$" }
789
788
  properties:
790
789
  url: { type: string }
791
- instance-name: { type: string }
792
790
  channel-options: { type: object, propertyNames: { pattern: "^[a-z0-9-]+$" } }
793
791
  request-timeout: { type: number }
794
792
  credentials: { "$ref": "#/definitions/grpc-credentials" }
795
- required: [url, instance-name]
793
+ required: [url]
796
794
 
797
795
  grpc-credentials:
798
796
  type: object
@@ -17,8 +17,7 @@
17
17
  SQLIndex
18
18
  ==================
19
19
 
20
- A SQL index implementation. This can be pointed to either a remote SQL server
21
- or a local SQLite database.
20
+ A SQL index implementation. This must be pointed to a remote SQL server.
22
21
 
23
22
  """
24
23
 
@@ -35,6 +34,8 @@ from sqlalchemy.orm import InstrumentedAttribute, Session, load_only
35
34
  from sqlalchemy.orm.exc import StaleDataError
36
35
  from sqlalchemy.orm.query import Query
37
36
  from sqlalchemy.orm.session import Session as SessionType
37
+ from sqlalchemy.dialects.postgresql import insert
38
+ from sqlalchemy.sql.functions import coalesce
38
39
 
39
40
  from buildgrid._protos.build.bazel.remote.execution.v2.remote_execution_pb2 import Digest
40
41
  from buildgrid._protos.google.rpc import code_pb2
@@ -49,10 +50,8 @@ from buildgrid.server.sql.provider import SqlProvider
49
50
 
50
51
  from ..storage_abc import StorageABC
51
52
  from .index_abc import IndexABC
52
- from .sql_dialect_delegates import PostgreSQLDelegate, SQLiteDelegate
53
53
 
54
54
  LOGGER = buildgrid_logger(__name__)
55
- DIALECT_DELEGATES = {"postgresql": PostgreSQLDelegate, "sqlite": SQLiteDelegate}
56
55
 
57
56
  INLINE_BLOB_SIZE_HARD_MAXIMUM = 1000000000
58
57
 
@@ -151,9 +150,6 @@ class SQLIndex(IndexABC):
151
150
  unknown_args = kwargs_keys - available_options
152
151
  raise TypeError(f"Unknown keyword arguments: [{unknown_args}]")
153
152
 
154
- # Dialect-specific initialization
155
- self._dialect_delegate = DIALECT_DELEGATES.get(self._sql.dialect)
156
-
157
153
  if inclause_limit > 0:
158
154
  if inclause_limit > window_size:
159
155
  LOGGER.warning(
@@ -377,14 +373,32 @@ class SQLIndex(IndexABC):
377
373
 
378
374
  digest_blob_pairs = sorted(digest_blob_pairs, key=lambda pair: (pair[0].hash, pair[0].size_bytes))
379
375
 
380
- if self._dialect_delegate:
381
- try:
382
- self._dialect_delegate._save_digests_to_index( # type: ignore
383
- digest_blob_pairs, session, self._max_inline_blob_size
384
- )
385
- return
386
- except AttributeError:
387
- pass
376
+ # See discussion of __table__ typing in https://github.com/sqlalchemy/sqlalchemy/issues/9130
377
+ index_table = cast(Table, IndexEntry.__table__)
378
+ update_time = datetime.utcnow()
379
+ new_rows = [
380
+ {
381
+ "digest_hash": digest.hash,
382
+ "digest_size_bytes": digest.size_bytes,
383
+ "accessed_timestamp": update_time,
384
+ "inline_blob": (blob if digest.size_bytes <= self._max_inline_blob_size else None),
385
+ "deleted": False,
386
+ }
387
+ for (digest, blob) in digest_blob_pairs
388
+ ]
389
+
390
+ base_insert_stmt = insert(index_table).values(new_rows)
391
+
392
+ update_stmt = base_insert_stmt.on_conflict_do_update(
393
+ index_elements=["digest_hash"],
394
+ set_={
395
+ "accessed_timestamp": update_time,
396
+ "inline_blob": coalesce(base_insert_stmt.excluded.inline_blob, index_table.c.inline_blob),
397
+ "deleted": False,
398
+ },
399
+ )
400
+
401
+ session.execute(update_stmt)
388
402
 
389
403
  update_time = datetime.utcnow()
390
404
  # Figure out which digests we can just update
@@ -26,8 +26,7 @@ from io import BytesIO
26
26
  from typing import IO, Any, Iterator, Sequence, TypedDict, cast
27
27
 
28
28
  from sqlalchemy import CursorResult, delete, func, select
29
- from sqlalchemy.dialects.postgresql import insert as postgresql_insert
30
- from sqlalchemy.dialects.sqlite import insert as sqlite_insert
29
+ from sqlalchemy.dialects.postgresql import insert
31
30
  from sqlalchemy.exc import DBAPIError
32
31
  from sqlalchemy.orm.exc import StaleDataError
33
32
 
@@ -59,7 +58,7 @@ class SQLStorage(StorageABC):
59
58
  self._sql_ro = sql_ro_provider or sql_provider
60
59
  self._inclause_limit = self._sql.default_inlimit
61
60
 
62
- supported_dialects = ["postgresql", "sqlite"]
61
+ supported_dialects = ["postgresql"]
63
62
 
64
63
  if self._sql.dialect not in supported_dialects:
65
64
  raise RuntimeError(
@@ -71,14 +70,6 @@ class SQLStorage(StorageABC):
71
70
  with self._sql.session() as session:
72
71
  session.query(BlobEntry).first()
73
72
 
74
- def _sqlite_bulk_insert(self, new_rows: list[DigestRow]) -> None:
75
- with self._sql.session() as session:
76
- session.execute(sqlite_insert(BlobEntry).values(new_rows).on_conflict_do_nothing())
77
-
78
- def _postgresql_bulk_insert(self, new_rows: list[DigestRow]) -> None:
79
- with self._sql.session() as session:
80
- session.execute(postgresql_insert(BlobEntry).values(new_rows).on_conflict_do_nothing())
81
-
82
73
  def _bulk_insert(self, digests: list[tuple[Digest, bytes]]) -> None:
83
74
  # Sort digests by hash to ensure consistent order to minimize deadlocks
84
75
  # when BatchUpdateBlobs requests have overlapping blobs
@@ -87,12 +78,8 @@ class SQLStorage(StorageABC):
87
78
  for (digest, blob) in sorted(digests, key=lambda x: x[0].hash)
88
79
  ]
89
80
 
90
- if self._sql.dialect == "sqlite":
91
- self._sqlite_bulk_insert(new_rows)
92
- elif self._sql.dialect == "postgresql":
93
- self._postgresql_bulk_insert(new_rows)
94
- else:
95
- raise RuntimeError(f"Unsupported dialect {self._sql.dialect} for bulk_insert")
81
+ with self._sql.session() as session:
82
+ session.execute(insert(BlobEntry).values(new_rows).on_conflict_do_nothing())
96
83
 
97
84
  @timed(METRIC.STORAGE.STAT_DURATION, type=TYPE)
98
85
  def has_blob(self, digest: Digest) -> bool:
@@ -41,13 +41,11 @@ class AssetClient:
41
41
  def __init__(
42
42
  self,
43
43
  channel: grpc.Channel,
44
- instance_name: str,
45
44
  retries: int = 0,
46
45
  max_backoff: int = 64,
47
46
  should_backoff: bool = True,
48
47
  ) -> None:
49
48
  self._channel = channel
50
- self._instance_name = instance_name
51
49
  self._push_stub = PushStub(channel)
52
50
  self._fetch_stub = FetchStub(channel)
53
51
  self._retrier = GrpcRetrier(retries=retries, max_backoff=max_backoff, should_backoff=should_backoff)
@@ -68,6 +66,7 @@ class AssetClient:
68
66
  expire_at: datetime | None = None,
69
67
  referenced_blobs: Iterable[Digest] = [],
70
68
  referenced_directories: Iterable[Digest] = [],
69
+ instance_name: str,
71
70
  ) -> PushBlobResponse:
72
71
  def _push_blob() -> PushBlobResponse:
73
72
  qualifiers_pb = [Qualifier(name=name, value=value) for name, value in qualifiers.items()]
@@ -77,7 +76,7 @@ class AssetClient:
77
76
  expire_at_pb.FromDatetime(expire_at)
78
77
 
79
78
  request = PushBlobRequest(
80
- instance_name=self._instance_name,
79
+ instance_name=instance_name,
81
80
  uris=uris,
82
81
  qualifiers=qualifiers_pb,
83
82
  expire_at=expire_at_pb,
@@ -98,6 +97,7 @@ class AssetClient:
98
97
  expire_at: datetime | None = None,
99
98
  referenced_blobs: Iterable[Digest] = [],
100
99
  referenced_directories: Iterable[Digest] = [],
100
+ instance_name: str,
101
101
  ) -> PushDirectoryResponse:
102
102
  def _push_directory() -> PushDirectoryResponse:
103
103
  qualifiers_pb = [Qualifier(name=name, value=value) for name, value in qualifiers.items()]
@@ -107,7 +107,7 @@ class AssetClient:
107
107
  expire_at_pb.FromDatetime(expire_at)
108
108
 
109
109
  request = PushDirectoryRequest(
110
- instance_name=self._instance_name,
110
+ instance_name=instance_name,
111
111
  uris=uris,
112
112
  qualifiers=qualifiers_pb,
113
113
  expire_at=expire_at_pb,
@@ -31,7 +31,7 @@ from google.protobuf.internal.containers import RepeatedCompositeFieldContainer
31
31
  from google.protobuf.timestamp_pb2 import Timestamp
32
32
  from grpc import Channel
33
33
  from sqlalchemy import ColumnExpressionArgument, CursorResult, and_, delete, func, insert, or_, select, text, update
34
- from sqlalchemy.dialects import postgresql, sqlite
34
+ from sqlalchemy.dialects import postgresql
35
35
  from sqlalchemy.exc import IntegrityError
36
36
  from sqlalchemy.orm import Session, joinedload
37
37
  from sqlalchemy.sql.expression import Insert, Select
@@ -218,7 +218,6 @@ class Scheduler:
218
218
  metering_throttle_action: MeteringThrottleAction | None = None,
219
219
  bot_session_keepalive_timeout: int = 600,
220
220
  logstream_channel: Channel | None = None,
221
- logstream_instance: str | None = None,
222
221
  asset_client: AssetClient | None = None,
223
222
  queued_action_retention_hours: float | None = None,
224
223
  completed_action_retention_hours: float | None = None,
@@ -268,7 +267,6 @@ class Scheduler:
268
267
  self.metering_throttle_action = metering_throttle_action or MeteringThrottleAction.DEPRIORITIZE
269
268
  self.bot_session_keepalive_timeout = bot_session_keepalive_timeout
270
269
  self.logstream_channel = logstream_channel
271
- self.logstream_instance = logstream_instance
272
270
  self.asset_client = asset_client
273
271
  self.queued_action_retention_hours = queued_action_retention_hours
274
272
  self.completed_action_retention_hours = completed_action_retention_hours
@@ -414,7 +412,9 @@ class Scheduler:
414
412
  LOGGER.exception("Checking ActionCache for action failed.", tags=dict(digest=action_digest))
415
413
 
416
414
  # Extend retention for action
417
- self._update_action_retention(action, action_digest, self.queued_action_retention_hours)
415
+ self._update_action_retention(
416
+ action, action_digest, self.queued_action_retention_hours, instance_name=current_instance()
417
+ )
418
418
 
419
419
  return self.create_operation_for_new_job(
420
420
  action=action,
@@ -760,11 +760,10 @@ class Scheduler:
760
760
  )
761
761
 
762
762
  def _notify_job_updated(self, job_names: str | list[str], session: Session) -> None:
763
- if self._sql.dialect == "postgresql":
764
- if isinstance(job_names, str):
765
- job_names = [job_names]
766
- for job_name in job_names:
767
- session.execute(text(f"NOTIFY {NotificationChannel.JOB_UPDATED.value}, '{job_name}';"))
763
+ if isinstance(job_names, str):
764
+ job_names = [job_names]
765
+ for job_name in job_names:
766
+ session.execute(text(f"NOTIFY {NotificationChannel.JOB_UPDATED.value}, '{job_name}';"))
768
767
 
769
768
  def _get_operation(self, operation_name: str, session: Session) -> OperationEntry | None:
770
769
  statement = (
@@ -776,7 +775,7 @@ class Scheduler:
776
775
 
777
776
  def _batch_timeout_jobs(self, job_select_stmt: Select[Any], status_code: int, message: str) -> int:
778
777
  """Timeout all jobs selected by a query"""
779
- with self._sql.session(sqlite_lock_immediately=True, exceptions_to_not_raise_on=[Exception]) as session:
778
+ with self._sql.session(exceptions_to_not_raise_on=[Exception]) as session:
780
779
  # Get the full list of jobs to timeout
781
780
  job_entries = session.execute(job_select_stmt).scalars().all()
782
781
  jobs = []
@@ -838,7 +837,7 @@ class Scheduler:
838
837
  .limit(1)
839
838
  .with_for_update(skip_locked=True)
840
839
  )
841
- with self._sql.session(sqlite_lock_immediately=True, exceptions_to_not_raise_on=[Exception]) as session:
840
+ with self._sql.session(exceptions_to_not_raise_on=[Exception]) as session:
842
841
  job = session.execute(stale_job_statement).scalar_one_or_none()
843
842
  if not job:
844
843
  return False
@@ -916,22 +915,14 @@ class Scheduler:
916
915
  job.cancelled = True
917
916
 
918
917
  # If the job was assigned to a bot, we need to update the quota / capacity
919
- if self._sql.dialect == "postgresql":
920
- update_query = (
921
- update(BotEntry)
922
- .where(BotEntry.bot_id == job.worker_name)
923
- .values(capacity=BotEntry.capacity + 1)
924
- .returning(BotEntry.cohort)
925
- )
926
- if cohort := session.execute(update_query).scalar_one_or_none():
927
- self._update_instance_quota_usage(session, cohort, job.instance_name, -1, guard=None)
928
- else:
929
- if bot := session.execute(
930
- select(BotEntry).where(BotEntry.bot_id == job.worker_name).with_for_update()
931
- ).scalar_one_or_none():
932
- bot.capacity += 1
933
- if bot.cohort:
934
- self._update_instance_quota_usage(session, bot.cohort, job.instance_name, -1, guard=None)
918
+ update_query = (
919
+ update(BotEntry)
920
+ .where(BotEntry.bot_id == job.worker_name)
921
+ .values(capacity=BotEntry.capacity + 1)
922
+ .returning(BotEntry.cohort)
923
+ )
924
+ if cohort := session.execute(update_query).scalar_one_or_none():
925
+ self._update_instance_quota_usage(session, cohort, job.instance_name, -1, guard=None)
935
926
 
936
927
  session.add(
937
928
  JobHistoryEntry(
@@ -1157,8 +1148,7 @@ class Scheduler:
1157
1148
  self._notify_job_updated(job.name, session)
1158
1149
 
1159
1150
  LOGGER.debug("Assigned job to bot", tags=log_tags)
1160
- if self._sql.dialect == "postgresql":
1161
- session.execute(text(f"NOTIFY {NotificationChannel.JOB_ASSIGNED.value}, '{bot.name}';"))
1151
+ session.execute(text(f"NOTIFY {NotificationChannel.JOB_ASSIGNED.value}, '{bot.name}';"))
1162
1152
 
1163
1153
  def _match_bot_by_sampling(
1164
1154
  self, session: Session, query: Select[tuple[BotEntry]], sampling: SamplingConfig
@@ -1523,7 +1513,7 @@ class Scheduler:
1523
1513
  )
1524
1514
 
1525
1515
  updated = False
1526
- with self._sql.session(sqlite_lock_immediately=True) as session:
1516
+ with self._sql.session() as session:
1527
1517
  job = session.execute(job_statement).scalar_one_or_none()
1528
1518
  if job is not None:
1529
1519
  self._match_job_to_bot(session, job, failure_backoff, bot_assignment_fn, assigner_name)
@@ -1558,7 +1548,7 @@ class Scheduler:
1558
1548
  )
1559
1549
 
1560
1550
  updated = False
1561
- with self._sql.session(sqlite_lock_immediately=True) as session:
1551
+ with self._sql.session() as session:
1562
1552
  job = session.execute(job_statement).scalar_one_or_none()
1563
1553
  if job is not None:
1564
1554
  self._match_job_to_bot(session, job, failure_backoff, bot_assignment_fn, assigner_name)
@@ -1702,22 +1692,8 @@ class Scheduler:
1702
1692
  return num_rows_deleted
1703
1693
 
1704
1694
  def _insert_on_conflict_do_nothing(self, model: type[OrmBase]) -> Insert:
1705
- # `Insert.on_conflict_do_nothing` is a SQLAlchemy "generative method", it
1706
- # returns a modified copy of the statement it is called on. For
1707
- # some reason mypy can't understand this, so the errors are ignored here.
1708
- if self._sql.dialect == "sqlite":
1709
- sqlite_insert: sqlite.Insert = sqlite.insert(model)
1710
- return sqlite_insert.on_conflict_do_nothing()
1711
-
1712
- elif self._sql.dialect == "postgresql":
1713
- insertion: postgresql.Insert = postgresql.insert(model)
1714
- return insertion.on_conflict_do_nothing()
1715
-
1716
- else:
1717
- # Fall back to the non-specific insert implementation. This doesn't
1718
- # support `ON CONFLICT DO NOTHING`, so callers need to be careful to
1719
- # still catch IntegrityErrors if other database backends are possible.
1720
- return insert(model)
1695
+ insertion: postgresql.Insert = postgresql.insert(model)
1696
+ return insertion.on_conflict_do_nothing()
1721
1697
 
1722
1698
  def get_or_create_client_identity_in_store(
1723
1699
  self, session: Session, client_id: ClientIdentityEntry
@@ -1744,7 +1720,7 @@ class Scheduler:
1744
1720
  try:
1745
1721
  session.execute(insertion)
1746
1722
 
1747
- # Handle unique constraint violation when using an unsupported database (ie. not PostgreSQL or SQLite)
1723
+ # Handle unique constraint violation when using an unsupported database (ie. not PostgreSQL)
1748
1724
  except IntegrityError:
1749
1725
  LOGGER.debug("Handled IntegrityError when inserting client identity.")
1750
1726
 
@@ -1777,7 +1753,7 @@ class Scheduler:
1777
1753
  try:
1778
1754
  session.execute(insertion)
1779
1755
 
1780
- # Handle unique constraint violation when using an unsupported database (ie. not PostgreSQL or SQLite)
1756
+ # Handle unique constraint violation when using an unsupported database (ie. not PostgreSQL)
1781
1757
  except IntegrityError:
1782
1758
  LOGGER.debug("Handled IntegrityError when inserting request metadata.")
1783
1759
 
@@ -1999,11 +1975,11 @@ class Scheduler:
1999
1975
  return None
2000
1976
 
2001
1977
  def _create_logstream_for_job(self, job: JobEntry, log_tags: Tags) -> None:
2002
- if self.logstream_channel and self.logstream_instance is not None:
1978
+ if self.logstream_channel:
2003
1979
  try:
2004
1980
  action_digest = string_to_digest(job.action_digest)
2005
1981
  parent_base = f"{action_digest.hash}_{action_digest.size_bytes}_{int(time())}"
2006
- with logstream_client(self.logstream_channel, self.logstream_instance) as ls_client:
1982
+ with logstream_client(self.logstream_channel, job.instance_name) as ls_client:
2007
1983
  stdout_stream = ls_client.create(f"{parent_base}_stdout")
2008
1984
  stderr_stream = ls_client.create(f"{parent_base}_stderr")
2009
1985
  job.stdout_stream_name = stdout_stream.name
@@ -2527,9 +2503,12 @@ class Scheduler:
2527
2503
  Action.FromString(job.action),
2528
2504
  string_to_digest(job.action_digest),
2529
2505
  retention_hours=self.completed_action_retention_hours,
2506
+ instance_name=job.instance_name,
2530
2507
  )
2531
2508
  if action_result.ByteSize() > 0:
2532
- self._update_action_result_retention(action_result, retention_hours=self.action_result_retention_hours)
2509
+ self._update_action_result_retention(
2510
+ action_result, retention_hours=self.action_result_retention_hours, instance_name=job.instance_name
2511
+ )
2533
2512
 
2534
2513
  worker_duration = None
2535
2514
  if job.worker_start_timestamp is not None and job.worker_completed_timestamp is not None:
@@ -2773,7 +2752,9 @@ class Scheduler:
2773
2752
  except Exception as exc:
2774
2753
  LOGGER.exception("Cannot publish resource usage.", tags=dict(job_name=job_name), exc_info=exc)
2775
2754
 
2776
- def _update_action_retention(self, action: Action, action_digest: Digest, retention_hours: float | None) -> None:
2755
+ def _update_action_retention(
2756
+ self, action: Action, action_digest: Digest, retention_hours: float | None, instance_name: str
2757
+ ) -> None:
2777
2758
  if not self.asset_client or not retention_hours:
2778
2759
  return
2779
2760
  uri = DIGEST_URI_TEMPLATE.format(digest_hash=action_digest.hash)
@@ -2790,6 +2771,7 @@ class Scheduler:
2790
2771
  expire_at=expire_at,
2791
2772
  referenced_blobs=referenced_blobs,
2792
2773
  referenced_directories=referenced_directories,
2774
+ instance_name=instance_name,
2793
2775
  )
2794
2776
  LOGGER.debug(
2795
2777
  "Extended the retention of action.", tags=dict(digest=action_digest, retention_hours=retention_hours)
@@ -2798,7 +2780,9 @@ class Scheduler:
2798
2780
  LOGGER.exception("Failed to push action as an asset.", tags=dict(digest=action_digest))
2799
2781
  # Not a fatal path, don't reraise here
2800
2782
 
2801
- def _update_action_result_retention(self, action_result: ActionResult, retention_hours: float | None) -> None:
2783
+ def _update_action_result_retention(
2784
+ self, action_result: ActionResult, retention_hours: float | None, instance_name: str
2785
+ ) -> None:
2802
2786
  if not self.asset_client or not retention_hours:
2803
2787
  return
2804
2788
  digest = None
@@ -2837,6 +2821,7 @@ class Scheduler:
2837
2821
  expire_at=expire_at,
2838
2822
  referenced_blobs=referenced_blobs,
2839
2823
  referenced_directories=referenced_directories,
2824
+ instance_name=instance_name,
2840
2825
  )
2841
2826
  LOGGER.debug(
2842
2827
  "Extended the retention of action result.", tags=dict(digest=digest, retention_hours=retention_hours)
@@ -2853,18 +2838,9 @@ class Scheduler:
2853
2838
  if self.bot_locality_hint_limit == 0:
2854
2839
  return
2855
2840
 
2856
- # Insert new hint with dialect-specific seq handling
2857
- if self._sql.dialect == "postgresql":
2858
- # For PostgreSQL, use the sequence to get the next seq number
2859
- next_seq = None
2860
- else:
2861
- # For SQLite, manually find the max seq number
2862
- max_seq = session.execute(
2863
- select(func.coalesce(func.max(BotLocalityHintEntry.sequence_number), 0)).where(
2864
- BotLocalityHintEntry.bot_name == bot_name
2865
- )
2866
- ).scalar_one()
2867
- next_seq = max_seq + 1
2841
+ # Insert new hint with seq handling
2842
+ # For PostgreSQL, use the sequence to get the next seq number
2843
+ next_seq = None
2868
2844
 
2869
2845
  new_hint = BotLocalityHintEntry(
2870
2846
  bot_name=bot_name,
@@ -2969,9 +2945,6 @@ class Scheduler:
2969
2945
  # `greatest(0,_)` is needed if this feature is released when there are already running jobs
2970
2946
  # TODO: remove the safe-guard after the next minor version bump
2971
2947
  new_usage: Any = func.greatest(0, InstanceQuota.current_usage + delta)
2972
- if self._sql.dialect == "sqlite":
2973
- # SQLite does not support `greatest`, so we use a simpler update for it.
2974
- new_usage = InstanceQuota.current_usage + delta
2975
2948
 
2976
2949
  update_usage_query = (
2977
2950
  update(InstanceQuota)
@@ -25,7 +25,7 @@ from sqlalchemy import select as sql_select
25
25
  from sqlalchemy.orm import Session
26
26
 
27
27
  from buildgrid.server.logging import buildgrid_logger
28
- from buildgrid.server.sql.models import BotEntry, JobEntry
28
+ from buildgrid.server.sql.models import BotEntry
29
29
  from buildgrid.server.sql.provider import SqlProvider
30
30
  from buildgrid.server.threading import ContextWorker
31
31
 
@@ -79,10 +79,7 @@ class Notifier(Generic[T]):
79
79
  while not shutdown_requested.is_set():
80
80
  try:
81
81
  with self._sql.session() as session:
82
- if self._sql.dialect == "postgresql":
83
- self._listen_for_updates(shutdown_requested, session)
84
- else:
85
- self._poll_for_updates(shutdown_requested, session)
82
+ self._listen_for_updates(shutdown_requested, session)
86
83
  except Exception as e:
87
84
  LOGGER.warning(
88
85
  f"OperationsNotifier encountered exception: {e}.",
@@ -122,23 +119,6 @@ class Notifier(Generic[T]):
122
119
  notify = dbapi_connection.notifies.pop()
123
120
  self.notify(notify.payload)
124
121
 
125
- def _poll(self, names: list[str], session: Session) -> dict[str, T]:
126
- raise NotImplementedError()
127
-
128
- def _poll_for_updates(self, shutdown_requested: Event, session: Session) -> None:
129
- prev_data: dict[str, T] = {}
130
- while not shutdown_requested.is_set():
131
- with self._lock:
132
- names = list(self._listeners)
133
-
134
- next_data: dict[str, T] = self._poll(names, session)
135
- for name in next_data:
136
- if name not in prev_data or prev_data[name] != next_data[name]:
137
- self.notify(name)
138
-
139
- prev_data = next_data
140
- shutdown_requested.wait(timeout=self.poll_interval)
141
-
142
122
  def notify(self, listener_name: str) -> None:
143
123
  with self._lock:
144
124
  if listener_name in self._listeners:
@@ -179,27 +159,11 @@ class OperationsNotifier(Notifier[tuple[bool, int]]):
179
159
  """
180
160
  super().__init__(sql_provider, NotificationChannel.JOB_UPDATED, "OperationsNotifier", poll_interval)
181
161
 
182
- def _poll(self, names: list[str], session: Session) -> dict[str, tuple[bool, int]]:
183
- # Only query for the minimal amount of data required.
184
- # The subscribers can choose how they want to act (e.g. by querying the full job data).
185
- statement = sql_select(JobEntry.name, JobEntry.cancelled, JobEntry.stage).where(JobEntry.name.in_(names))
186
- next_data: dict[str, tuple[bool, int]] = {}
187
- for [name, cancelled, stage] in session.execute(statement).all():
188
- next_data[name] = (cancelled, stage)
189
- return next_data
190
-
191
162
 
192
163
  class BotNotifier(Notifier[str]):
193
164
  def __init__(self, sql_provider: SqlProvider, poll_interval: float = 1.0) -> None:
194
165
  super().__init__(sql_provider, NotificationChannel.JOB_ASSIGNED, "BotNotifier", poll_interval)
195
166
 
196
- def _poll(self, names: list[str], session: Session) -> dict[str, str]:
197
- statement = sql_select(BotEntry.name, BotEntry.lease_id).where(BotEntry.name.in_(names))
198
- next_data = {}
199
- for name, lease_id in session.execute(statement).all():
200
- next_data[name] = lease_id
201
- return next_data
202
-
203
167
  def listener_count_for_instance(self, instance_name: str) -> int:
204
168
  with self._lock:
205
169
  stmt = sql_select(func.count(BotEntry.name)).where(