nucliadb 2.46.1.post382__py3-none-any.whl → 6.2.1.post2777__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 (431) hide show
  1. migrations/0002_rollover_shards.py +1 -2
  2. migrations/0003_allfields_key.py +2 -37
  3. migrations/0004_rollover_shards.py +1 -2
  4. migrations/0005_rollover_shards.py +1 -2
  5. migrations/0006_rollover_shards.py +2 -4
  6. migrations/0008_cleanup_leftover_rollover_metadata.py +1 -2
  7. migrations/0009_upgrade_relations_and_texts_to_v2.py +5 -4
  8. migrations/0010_fix_corrupt_indexes.py +11 -12
  9. migrations/0011_materialize_labelset_ids.py +2 -18
  10. migrations/0012_rollover_shards.py +6 -12
  11. migrations/0013_rollover_shards.py +2 -4
  12. migrations/0014_rollover_shards.py +5 -7
  13. migrations/0015_targeted_rollover.py +6 -12
  14. migrations/0016_upgrade_to_paragraphs_v2.py +27 -32
  15. migrations/0017_multiple_writable_shards.py +3 -6
  16. migrations/0018_purge_orphan_kbslugs.py +59 -0
  17. migrations/0019_upgrade_to_paragraphs_v3.py +66 -0
  18. migrations/0020_drain_nodes_from_cluster.py +83 -0
  19. nucliadb/standalone/tests/unit/test_run.py → migrations/0021_overwrite_vectorsets_key.py +17 -18
  20. nucliadb/tests/unit/test_openapi.py → migrations/0022_fix_paragraph_deletion_bug.py +16 -11
  21. migrations/0023_backfill_pg_catalog.py +80 -0
  22. migrations/0025_assign_models_to_kbs_v2.py +113 -0
  23. migrations/0026_fix_high_cardinality_content_types.py +61 -0
  24. migrations/0027_rollover_texts3.py +73 -0
  25. nucliadb/ingest/fields/date.py → migrations/pg/0001_bootstrap.py +10 -12
  26. migrations/pg/0002_catalog.py +42 -0
  27. nucliadb/ingest/tests/unit/test_settings.py → migrations/pg/0003_catalog_kbid_index.py +5 -3
  28. nucliadb/common/cluster/base.py +41 -24
  29. nucliadb/common/cluster/discovery/base.py +6 -14
  30. nucliadb/common/cluster/discovery/k8s.py +9 -19
  31. nucliadb/common/cluster/discovery/manual.py +1 -3
  32. nucliadb/common/cluster/discovery/single.py +1 -2
  33. nucliadb/common/cluster/discovery/utils.py +1 -3
  34. nucliadb/common/cluster/grpc_node_dummy.py +11 -16
  35. nucliadb/common/cluster/index_node.py +10 -19
  36. nucliadb/common/cluster/manager.py +223 -102
  37. nucliadb/common/cluster/rebalance.py +42 -37
  38. nucliadb/common/cluster/rollover.py +377 -204
  39. nucliadb/common/cluster/settings.py +16 -9
  40. nucliadb/common/cluster/standalone/grpc_node_binding.py +24 -76
  41. nucliadb/common/cluster/standalone/index_node.py +4 -11
  42. nucliadb/common/cluster/standalone/service.py +2 -6
  43. nucliadb/common/cluster/standalone/utils.py +9 -6
  44. nucliadb/common/cluster/utils.py +43 -29
  45. nucliadb/common/constants.py +20 -0
  46. nucliadb/common/context/__init__.py +6 -4
  47. nucliadb/common/context/fastapi.py +8 -5
  48. nucliadb/{tests/knowledgeboxes/__init__.py → common/counters.py} +8 -2
  49. nucliadb/common/datamanagers/__init__.py +24 -5
  50. nucliadb/common/datamanagers/atomic.py +102 -0
  51. nucliadb/common/datamanagers/cluster.py +5 -5
  52. nucliadb/common/datamanagers/entities.py +6 -16
  53. nucliadb/common/datamanagers/fields.py +84 -0
  54. nucliadb/common/datamanagers/kb.py +101 -24
  55. nucliadb/common/datamanagers/labels.py +26 -56
  56. nucliadb/common/datamanagers/processing.py +2 -6
  57. nucliadb/common/datamanagers/resources.py +214 -117
  58. nucliadb/common/datamanagers/rollover.py +77 -16
  59. nucliadb/{ingest/orm → common/datamanagers}/synonyms.py +16 -28
  60. nucliadb/common/datamanagers/utils.py +19 -11
  61. nucliadb/common/datamanagers/vectorsets.py +110 -0
  62. nucliadb/common/external_index_providers/base.py +257 -0
  63. nucliadb/{ingest/tests/unit/test_cache.py → common/external_index_providers/exceptions.py} +9 -8
  64. nucliadb/common/external_index_providers/manager.py +101 -0
  65. nucliadb/common/external_index_providers/pinecone.py +933 -0
  66. nucliadb/common/external_index_providers/settings.py +52 -0
  67. nucliadb/common/http_clients/auth.py +3 -6
  68. nucliadb/common/http_clients/processing.py +6 -11
  69. nucliadb/common/http_clients/utils.py +1 -3
  70. nucliadb/common/ids.py +240 -0
  71. nucliadb/common/locking.py +43 -13
  72. nucliadb/common/maindb/driver.py +11 -35
  73. nucliadb/common/maindb/exceptions.py +6 -6
  74. nucliadb/common/maindb/local.py +22 -9
  75. nucliadb/common/maindb/pg.py +206 -111
  76. nucliadb/common/maindb/utils.py +13 -44
  77. nucliadb/common/models_utils/from_proto.py +479 -0
  78. nucliadb/common/models_utils/to_proto.py +60 -0
  79. nucliadb/common/nidx.py +260 -0
  80. nucliadb/export_import/datamanager.py +25 -19
  81. nucliadb/export_import/exceptions.py +8 -0
  82. nucliadb/export_import/exporter.py +20 -7
  83. nucliadb/export_import/importer.py +6 -11
  84. nucliadb/export_import/models.py +5 -5
  85. nucliadb/export_import/tasks.py +4 -4
  86. nucliadb/export_import/utils.py +94 -54
  87. nucliadb/health.py +1 -3
  88. nucliadb/ingest/app.py +15 -11
  89. nucliadb/ingest/consumer/auditing.py +30 -147
  90. nucliadb/ingest/consumer/consumer.py +96 -52
  91. nucliadb/ingest/consumer/materializer.py +10 -12
  92. nucliadb/ingest/consumer/pull.py +12 -27
  93. nucliadb/ingest/consumer/service.py +20 -19
  94. nucliadb/ingest/consumer/shard_creator.py +7 -14
  95. nucliadb/ingest/consumer/utils.py +1 -3
  96. nucliadb/ingest/fields/base.py +139 -188
  97. nucliadb/ingest/fields/conversation.py +18 -5
  98. nucliadb/ingest/fields/exceptions.py +1 -4
  99. nucliadb/ingest/fields/file.py +7 -25
  100. nucliadb/ingest/fields/link.py +11 -16
  101. nucliadb/ingest/fields/text.py +9 -4
  102. nucliadb/ingest/orm/brain.py +255 -262
  103. nucliadb/ingest/orm/broker_message.py +181 -0
  104. nucliadb/ingest/orm/entities.py +36 -51
  105. nucliadb/ingest/orm/exceptions.py +12 -0
  106. nucliadb/ingest/orm/knowledgebox.py +334 -278
  107. nucliadb/ingest/orm/processor/__init__.py +2 -697
  108. nucliadb/ingest/orm/processor/auditing.py +117 -0
  109. nucliadb/ingest/orm/processor/data_augmentation.py +164 -0
  110. nucliadb/ingest/orm/processor/pgcatalog.py +84 -0
  111. nucliadb/ingest/orm/processor/processor.py +752 -0
  112. nucliadb/ingest/orm/processor/sequence_manager.py +1 -1
  113. nucliadb/ingest/orm/resource.py +280 -520
  114. nucliadb/ingest/orm/utils.py +25 -31
  115. nucliadb/ingest/partitions.py +3 -9
  116. nucliadb/ingest/processing.py +76 -81
  117. nucliadb/ingest/py.typed +0 -0
  118. nucliadb/ingest/serialize.py +37 -173
  119. nucliadb/ingest/service/__init__.py +1 -3
  120. nucliadb/ingest/service/writer.py +186 -577
  121. nucliadb/ingest/settings.py +13 -22
  122. nucliadb/ingest/utils.py +3 -6
  123. nucliadb/learning_proxy.py +264 -51
  124. nucliadb/metrics_exporter.py +30 -19
  125. nucliadb/middleware/__init__.py +1 -3
  126. nucliadb/migrator/command.py +1 -3
  127. nucliadb/migrator/datamanager.py +13 -13
  128. nucliadb/migrator/migrator.py +57 -37
  129. nucliadb/migrator/settings.py +2 -1
  130. nucliadb/migrator/utils.py +18 -10
  131. nucliadb/purge/__init__.py +139 -33
  132. nucliadb/purge/orphan_shards.py +7 -13
  133. nucliadb/reader/__init__.py +1 -3
  134. nucliadb/reader/api/models.py +3 -14
  135. nucliadb/reader/api/v1/__init__.py +0 -1
  136. nucliadb/reader/api/v1/download.py +27 -94
  137. nucliadb/reader/api/v1/export_import.py +4 -4
  138. nucliadb/reader/api/v1/knowledgebox.py +13 -13
  139. nucliadb/reader/api/v1/learning_config.py +8 -12
  140. nucliadb/reader/api/v1/resource.py +67 -93
  141. nucliadb/reader/api/v1/services.py +70 -125
  142. nucliadb/reader/app.py +16 -46
  143. nucliadb/reader/lifecycle.py +18 -4
  144. nucliadb/reader/py.typed +0 -0
  145. nucliadb/reader/reader/notifications.py +10 -31
  146. nucliadb/search/__init__.py +1 -3
  147. nucliadb/search/api/v1/__init__.py +2 -2
  148. nucliadb/search/api/v1/ask.py +112 -0
  149. nucliadb/search/api/v1/catalog.py +184 -0
  150. nucliadb/search/api/v1/feedback.py +17 -25
  151. nucliadb/search/api/v1/find.py +41 -41
  152. nucliadb/search/api/v1/knowledgebox.py +90 -62
  153. nucliadb/search/api/v1/predict_proxy.py +2 -2
  154. nucliadb/search/api/v1/resource/ask.py +66 -117
  155. nucliadb/search/api/v1/resource/search.py +51 -72
  156. nucliadb/search/api/v1/router.py +1 -0
  157. nucliadb/search/api/v1/search.py +50 -197
  158. nucliadb/search/api/v1/suggest.py +40 -54
  159. nucliadb/search/api/v1/summarize.py +9 -5
  160. nucliadb/search/api/v1/utils.py +2 -1
  161. nucliadb/search/app.py +16 -48
  162. nucliadb/search/lifecycle.py +10 -3
  163. nucliadb/search/predict.py +176 -188
  164. nucliadb/search/py.typed +0 -0
  165. nucliadb/search/requesters/utils.py +41 -63
  166. nucliadb/search/search/cache.py +149 -20
  167. nucliadb/search/search/chat/ask.py +918 -0
  168. nucliadb/search/{tests/unit/test_run.py → search/chat/exceptions.py} +14 -13
  169. nucliadb/search/search/chat/images.py +41 -17
  170. nucliadb/search/search/chat/prompt.py +851 -282
  171. nucliadb/search/search/chat/query.py +274 -267
  172. nucliadb/{writer/resource/slug.py → search/search/cut.py} +8 -6
  173. nucliadb/search/search/fetch.py +43 -36
  174. nucliadb/search/search/filters.py +9 -15
  175. nucliadb/search/search/find.py +214 -54
  176. nucliadb/search/search/find_merge.py +408 -391
  177. nucliadb/search/search/hydrator.py +191 -0
  178. nucliadb/search/search/merge.py +198 -234
  179. nucliadb/search/search/metrics.py +73 -2
  180. nucliadb/search/search/paragraphs.py +64 -106
  181. nucliadb/search/search/pgcatalog.py +233 -0
  182. nucliadb/search/search/predict_proxy.py +1 -1
  183. nucliadb/search/search/query.py +386 -257
  184. nucliadb/search/search/query_parser/exceptions.py +22 -0
  185. nucliadb/search/search/query_parser/models.py +101 -0
  186. nucliadb/search/search/query_parser/parser.py +183 -0
  187. nucliadb/search/search/rank_fusion.py +204 -0
  188. nucliadb/search/search/rerankers.py +270 -0
  189. nucliadb/search/search/shards.py +4 -38
  190. nucliadb/search/search/summarize.py +14 -18
  191. nucliadb/search/search/utils.py +27 -4
  192. nucliadb/search/settings.py +15 -1
  193. nucliadb/standalone/api_router.py +4 -10
  194. nucliadb/standalone/app.py +17 -14
  195. nucliadb/standalone/auth.py +7 -21
  196. nucliadb/standalone/config.py +9 -12
  197. nucliadb/standalone/introspect.py +5 -5
  198. nucliadb/standalone/lifecycle.py +26 -25
  199. nucliadb/standalone/migrations.py +58 -0
  200. nucliadb/standalone/purge.py +9 -8
  201. nucliadb/standalone/py.typed +0 -0
  202. nucliadb/standalone/run.py +25 -18
  203. nucliadb/standalone/settings.py +10 -14
  204. nucliadb/standalone/versions.py +15 -5
  205. nucliadb/tasks/consumer.py +8 -12
  206. nucliadb/tasks/producer.py +7 -6
  207. nucliadb/tests/config.py +53 -0
  208. nucliadb/train/__init__.py +1 -3
  209. nucliadb/train/api/utils.py +1 -2
  210. nucliadb/train/api/v1/shards.py +2 -2
  211. nucliadb/train/api/v1/trainset.py +4 -6
  212. nucliadb/train/app.py +14 -47
  213. nucliadb/train/generator.py +10 -19
  214. nucliadb/train/generators/field_classifier.py +7 -19
  215. nucliadb/train/generators/field_streaming.py +156 -0
  216. nucliadb/train/generators/image_classifier.py +12 -18
  217. nucliadb/train/generators/paragraph_classifier.py +5 -9
  218. nucliadb/train/generators/paragraph_streaming.py +6 -9
  219. nucliadb/train/generators/question_answer_streaming.py +19 -20
  220. nucliadb/train/generators/sentence_classifier.py +9 -15
  221. nucliadb/train/generators/token_classifier.py +45 -36
  222. nucliadb/train/generators/utils.py +14 -18
  223. nucliadb/train/lifecycle.py +7 -3
  224. nucliadb/train/nodes.py +23 -32
  225. nucliadb/train/py.typed +0 -0
  226. nucliadb/train/servicer.py +13 -21
  227. nucliadb/train/settings.py +2 -6
  228. nucliadb/train/types.py +13 -10
  229. nucliadb/train/upload.py +3 -6
  230. nucliadb/train/uploader.py +20 -25
  231. nucliadb/train/utils.py +1 -1
  232. nucliadb/writer/__init__.py +1 -3
  233. nucliadb/writer/api/constants.py +0 -5
  234. nucliadb/{ingest/fields/keywordset.py → writer/api/utils.py} +13 -10
  235. nucliadb/writer/api/v1/export_import.py +102 -49
  236. nucliadb/writer/api/v1/field.py +196 -620
  237. nucliadb/writer/api/v1/knowledgebox.py +221 -71
  238. nucliadb/writer/api/v1/learning_config.py +2 -2
  239. nucliadb/writer/api/v1/resource.py +114 -216
  240. nucliadb/writer/api/v1/services.py +64 -132
  241. nucliadb/writer/api/v1/slug.py +61 -0
  242. nucliadb/writer/api/v1/transaction.py +67 -0
  243. nucliadb/writer/api/v1/upload.py +184 -215
  244. nucliadb/writer/app.py +11 -61
  245. nucliadb/writer/back_pressure.py +62 -43
  246. nucliadb/writer/exceptions.py +0 -4
  247. nucliadb/writer/lifecycle.py +21 -15
  248. nucliadb/writer/py.typed +0 -0
  249. nucliadb/writer/resource/audit.py +2 -1
  250. nucliadb/writer/resource/basic.py +48 -62
  251. nucliadb/writer/resource/field.py +45 -135
  252. nucliadb/writer/resource/origin.py +1 -2
  253. nucliadb/writer/settings.py +14 -5
  254. nucliadb/writer/tus/__init__.py +17 -15
  255. nucliadb/writer/tus/azure.py +111 -0
  256. nucliadb/writer/tus/dm.py +17 -5
  257. nucliadb/writer/tus/exceptions.py +1 -3
  258. nucliadb/writer/tus/gcs.py +56 -84
  259. nucliadb/writer/tus/local.py +21 -37
  260. nucliadb/writer/tus/s3.py +28 -68
  261. nucliadb/writer/tus/storage.py +5 -56
  262. nucliadb/writer/vectorsets.py +125 -0
  263. nucliadb-6.2.1.post2777.dist-info/METADATA +148 -0
  264. nucliadb-6.2.1.post2777.dist-info/RECORD +343 -0
  265. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/WHEEL +1 -1
  266. nucliadb/common/maindb/redis.py +0 -194
  267. nucliadb/common/maindb/tikv.py +0 -412
  268. nucliadb/ingest/fields/layout.py +0 -58
  269. nucliadb/ingest/tests/conftest.py +0 -30
  270. nucliadb/ingest/tests/fixtures.py +0 -771
  271. nucliadb/ingest/tests/integration/consumer/__init__.py +0 -18
  272. nucliadb/ingest/tests/integration/consumer/test_auditing.py +0 -80
  273. nucliadb/ingest/tests/integration/consumer/test_materializer.py +0 -89
  274. nucliadb/ingest/tests/integration/consumer/test_pull.py +0 -144
  275. nucliadb/ingest/tests/integration/consumer/test_service.py +0 -81
  276. nucliadb/ingest/tests/integration/consumer/test_shard_creator.py +0 -68
  277. nucliadb/ingest/tests/integration/ingest/test_ingest.py +0 -691
  278. nucliadb/ingest/tests/integration/ingest/test_processing_engine.py +0 -95
  279. nucliadb/ingest/tests/integration/ingest/test_relations.py +0 -272
  280. nucliadb/ingest/tests/unit/consumer/__init__.py +0 -18
  281. nucliadb/ingest/tests/unit/consumer/test_auditing.py +0 -140
  282. nucliadb/ingest/tests/unit/consumer/test_consumer.py +0 -69
  283. nucliadb/ingest/tests/unit/consumer/test_pull.py +0 -60
  284. nucliadb/ingest/tests/unit/consumer/test_shard_creator.py +0 -139
  285. nucliadb/ingest/tests/unit/consumer/test_utils.py +0 -67
  286. nucliadb/ingest/tests/unit/orm/__init__.py +0 -19
  287. nucliadb/ingest/tests/unit/orm/test_brain.py +0 -247
  288. nucliadb/ingest/tests/unit/orm/test_processor.py +0 -131
  289. nucliadb/ingest/tests/unit/orm/test_resource.py +0 -275
  290. nucliadb/ingest/tests/unit/test_partitions.py +0 -40
  291. nucliadb/ingest/tests/unit/test_processing.py +0 -171
  292. nucliadb/middleware/transaction.py +0 -117
  293. nucliadb/reader/api/v1/learning_collector.py +0 -63
  294. nucliadb/reader/tests/__init__.py +0 -19
  295. nucliadb/reader/tests/conftest.py +0 -31
  296. nucliadb/reader/tests/fixtures.py +0 -136
  297. nucliadb/reader/tests/test_list_resources.py +0 -75
  298. nucliadb/reader/tests/test_reader_file_download.py +0 -273
  299. nucliadb/reader/tests/test_reader_resource.py +0 -379
  300. nucliadb/reader/tests/test_reader_resource_field.py +0 -219
  301. nucliadb/search/api/v1/chat.py +0 -258
  302. nucliadb/search/api/v1/resource/chat.py +0 -94
  303. nucliadb/search/tests/__init__.py +0 -19
  304. nucliadb/search/tests/conftest.py +0 -33
  305. nucliadb/search/tests/fixtures.py +0 -199
  306. nucliadb/search/tests/node.py +0 -465
  307. nucliadb/search/tests/unit/__init__.py +0 -18
  308. nucliadb/search/tests/unit/api/__init__.py +0 -19
  309. nucliadb/search/tests/unit/api/v1/__init__.py +0 -19
  310. nucliadb/search/tests/unit/api/v1/resource/__init__.py +0 -19
  311. nucliadb/search/tests/unit/api/v1/resource/test_ask.py +0 -67
  312. nucliadb/search/tests/unit/api/v1/resource/test_chat.py +0 -97
  313. nucliadb/search/tests/unit/api/v1/test_chat.py +0 -96
  314. nucliadb/search/tests/unit/api/v1/test_predict_proxy.py +0 -98
  315. nucliadb/search/tests/unit/api/v1/test_summarize.py +0 -93
  316. nucliadb/search/tests/unit/search/__init__.py +0 -18
  317. nucliadb/search/tests/unit/search/requesters/__init__.py +0 -18
  318. nucliadb/search/tests/unit/search/requesters/test_utils.py +0 -210
  319. nucliadb/search/tests/unit/search/search/__init__.py +0 -19
  320. nucliadb/search/tests/unit/search/search/test_shards.py +0 -45
  321. nucliadb/search/tests/unit/search/search/test_utils.py +0 -82
  322. nucliadb/search/tests/unit/search/test_chat_prompt.py +0 -266
  323. nucliadb/search/tests/unit/search/test_fetch.py +0 -108
  324. nucliadb/search/tests/unit/search/test_filters.py +0 -125
  325. nucliadb/search/tests/unit/search/test_paragraphs.py +0 -157
  326. nucliadb/search/tests/unit/search/test_predict_proxy.py +0 -106
  327. nucliadb/search/tests/unit/search/test_query.py +0 -201
  328. nucliadb/search/tests/unit/test_app.py +0 -79
  329. nucliadb/search/tests/unit/test_find_merge.py +0 -112
  330. nucliadb/search/tests/unit/test_merge.py +0 -34
  331. nucliadb/search/tests/unit/test_predict.py +0 -584
  332. nucliadb/standalone/tests/__init__.py +0 -19
  333. nucliadb/standalone/tests/conftest.py +0 -33
  334. nucliadb/standalone/tests/fixtures.py +0 -38
  335. nucliadb/standalone/tests/unit/__init__.py +0 -18
  336. nucliadb/standalone/tests/unit/test_api_router.py +0 -61
  337. nucliadb/standalone/tests/unit/test_auth.py +0 -169
  338. nucliadb/standalone/tests/unit/test_introspect.py +0 -35
  339. nucliadb/standalone/tests/unit/test_versions.py +0 -68
  340. nucliadb/tests/benchmarks/__init__.py +0 -19
  341. nucliadb/tests/benchmarks/test_search.py +0 -99
  342. nucliadb/tests/conftest.py +0 -32
  343. nucliadb/tests/fixtures.py +0 -736
  344. nucliadb/tests/knowledgeboxes/philosophy_books.py +0 -203
  345. nucliadb/tests/knowledgeboxes/ten_dummy_resources.py +0 -109
  346. nucliadb/tests/migrations/__init__.py +0 -19
  347. nucliadb/tests/migrations/test_migration_0017.py +0 -80
  348. nucliadb/tests/tikv.py +0 -240
  349. nucliadb/tests/unit/__init__.py +0 -19
  350. nucliadb/tests/unit/common/__init__.py +0 -19
  351. nucliadb/tests/unit/common/cluster/__init__.py +0 -19
  352. nucliadb/tests/unit/common/cluster/discovery/__init__.py +0 -19
  353. nucliadb/tests/unit/common/cluster/discovery/test_k8s.py +0 -170
  354. nucliadb/tests/unit/common/cluster/standalone/__init__.py +0 -18
  355. nucliadb/tests/unit/common/cluster/standalone/test_service.py +0 -113
  356. nucliadb/tests/unit/common/cluster/standalone/test_utils.py +0 -59
  357. nucliadb/tests/unit/common/cluster/test_cluster.py +0 -399
  358. nucliadb/tests/unit/common/cluster/test_kb_shard_manager.py +0 -178
  359. nucliadb/tests/unit/common/cluster/test_rollover.py +0 -279
  360. nucliadb/tests/unit/common/maindb/__init__.py +0 -18
  361. nucliadb/tests/unit/common/maindb/test_driver.py +0 -127
  362. nucliadb/tests/unit/common/maindb/test_tikv.py +0 -53
  363. nucliadb/tests/unit/common/maindb/test_utils.py +0 -81
  364. nucliadb/tests/unit/common/test_context.py +0 -36
  365. nucliadb/tests/unit/export_import/__init__.py +0 -19
  366. nucliadb/tests/unit/export_import/test_datamanager.py +0 -37
  367. nucliadb/tests/unit/export_import/test_utils.py +0 -294
  368. nucliadb/tests/unit/migrator/__init__.py +0 -19
  369. nucliadb/tests/unit/migrator/test_migrator.py +0 -87
  370. nucliadb/tests/unit/tasks/__init__.py +0 -19
  371. nucliadb/tests/unit/tasks/conftest.py +0 -42
  372. nucliadb/tests/unit/tasks/test_consumer.py +0 -93
  373. nucliadb/tests/unit/tasks/test_producer.py +0 -95
  374. nucliadb/tests/unit/tasks/test_tasks.py +0 -60
  375. nucliadb/tests/unit/test_field_ids.py +0 -49
  376. nucliadb/tests/unit/test_health.py +0 -84
  377. nucliadb/tests/unit/test_kb_slugs.py +0 -54
  378. nucliadb/tests/unit/test_learning_proxy.py +0 -252
  379. nucliadb/tests/unit/test_metrics_exporter.py +0 -77
  380. nucliadb/tests/unit/test_purge.py +0 -138
  381. nucliadb/tests/utils/__init__.py +0 -74
  382. nucliadb/tests/utils/aiohttp_session.py +0 -44
  383. nucliadb/tests/utils/broker_messages/__init__.py +0 -167
  384. nucliadb/tests/utils/broker_messages/fields.py +0 -181
  385. nucliadb/tests/utils/broker_messages/helpers.py +0 -33
  386. nucliadb/tests/utils/entities.py +0 -78
  387. nucliadb/train/api/v1/check.py +0 -60
  388. nucliadb/train/tests/__init__.py +0 -19
  389. nucliadb/train/tests/conftest.py +0 -29
  390. nucliadb/train/tests/fixtures.py +0 -342
  391. nucliadb/train/tests/test_field_classification.py +0 -122
  392. nucliadb/train/tests/test_get_entities.py +0 -80
  393. nucliadb/train/tests/test_get_info.py +0 -51
  394. nucliadb/train/tests/test_get_ontology.py +0 -34
  395. nucliadb/train/tests/test_get_ontology_count.py +0 -63
  396. nucliadb/train/tests/test_image_classification.py +0 -222
  397. nucliadb/train/tests/test_list_fields.py +0 -39
  398. nucliadb/train/tests/test_list_paragraphs.py +0 -73
  399. nucliadb/train/tests/test_list_resources.py +0 -39
  400. nucliadb/train/tests/test_list_sentences.py +0 -71
  401. nucliadb/train/tests/test_paragraph_classification.py +0 -123
  402. nucliadb/train/tests/test_paragraph_streaming.py +0 -118
  403. nucliadb/train/tests/test_question_answer_streaming.py +0 -239
  404. nucliadb/train/tests/test_sentence_classification.py +0 -143
  405. nucliadb/train/tests/test_token_classification.py +0 -136
  406. nucliadb/train/tests/utils.py +0 -108
  407. nucliadb/writer/layouts/__init__.py +0 -51
  408. nucliadb/writer/layouts/v1.py +0 -59
  409. nucliadb/writer/resource/vectors.py +0 -120
  410. nucliadb/writer/tests/__init__.py +0 -19
  411. nucliadb/writer/tests/conftest.py +0 -31
  412. nucliadb/writer/tests/fixtures.py +0 -192
  413. nucliadb/writer/tests/test_fields.py +0 -486
  414. nucliadb/writer/tests/test_files.py +0 -743
  415. nucliadb/writer/tests/test_knowledgebox.py +0 -49
  416. nucliadb/writer/tests/test_reprocess_file_field.py +0 -139
  417. nucliadb/writer/tests/test_resources.py +0 -546
  418. nucliadb/writer/tests/test_service.py +0 -137
  419. nucliadb/writer/tests/test_tus.py +0 -203
  420. nucliadb/writer/tests/utils.py +0 -35
  421. nucliadb/writer/tus/pg.py +0 -125
  422. nucliadb-2.46.1.post382.dist-info/METADATA +0 -134
  423. nucliadb-2.46.1.post382.dist-info/RECORD +0 -451
  424. {nucliadb/ingest/tests → migrations/pg}/__init__.py +0 -0
  425. /nucliadb/{ingest/tests/integration → common/external_index_providers}/__init__.py +0 -0
  426. /nucliadb/{ingest/tests/integration/ingest → common/models_utils}/__init__.py +0 -0
  427. /nucliadb/{ingest/tests/unit → search/search/query_parser}/__init__.py +0 -0
  428. /nucliadb/{ingest/tests → tests}/vectors.py +0 -0
  429. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/entry_points.txt +0 -0
  430. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/top_level.txt +0 -0
  431. {nucliadb-2.46.1.post382.dist-info → nucliadb-6.2.1.post2777.dist-info}/zip-safe +0 -0
@@ -1,399 +0,0 @@
1
- # Copyright (C) 2021 Bosutech XXI S.L.
2
- #
3
- # nucliadb is offered under the AGPL v3.0 and as commercial software.
4
- # For commercial licensing, contact us at info@nuclia.com.
5
- #
6
- # AGPL:
7
- # This program is free software: you can redistribute it and/or modify
8
- # it under the terms of the GNU Affero General Public License as
9
- # published by the Free Software Foundation, either version 3 of the
10
- # License, or (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU Affero General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU Affero General Public License
18
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
- #
20
-
21
- from unittest import mock
22
-
23
- import pytest
24
-
25
- from nucliadb.common.cluster import manager
26
- from nucliadb.common.cluster.exceptions import NodeClusterSmall, NoHealthyNodeAvailable
27
- from nucliadb.common.cluster.index_node import IndexNode
28
- from nucliadb.common.cluster.settings import settings
29
- from nucliadb_protos import writer_pb2
30
-
31
-
32
- @pytest.fixture(scope="function")
33
- def available_nodes():
34
- nodes = {
35
- "node-0": IndexNode(
36
- id="node-0", address="node-0", shard_count=1, available_disk=100, dummy=True
37
- ),
38
- "node-30": IndexNode(
39
- id="node-30",
40
- address="node-30",
41
- shard_count=1,
42
- available_disk=30,
43
- dummy=True,
44
- ),
45
- "node-40": IndexNode(
46
- id="node-40",
47
- address="node-40",
48
- shard_count=1,
49
- available_disk=10,
50
- dummy=True,
51
- ),
52
- }
53
- with mock.patch.object(manager, "INDEX_NODES", new=nodes):
54
- yield nodes
55
-
56
-
57
- def test_sorted_primary_nodes_orders_by_available_disk(available_nodes):
58
- with mock.patch.object(settings, "node_replicas", 2):
59
- nodes = manager.sorted_primary_nodes()
60
- assert nodes == ["node-0", "node-30", "node-40"]
61
-
62
-
63
- def test_sorted_primary_nodes_puts_nodes_to_avoid_at_the_end(available_nodes):
64
- with mock.patch.object(settings, "node_replicas", 2):
65
- excluded_node = "node-0"
66
- nodes = manager.sorted_primary_nodes(avoid_nodes=[excluded_node])
67
- assert nodes == ["node-30", "node-40", "node-0"]
68
-
69
- # even if all are used, still should find nodes
70
- all_nodes = list(available_nodes.keys())
71
- assert manager.sorted_primary_nodes(avoid_nodes=all_nodes) == [
72
- "node-0",
73
- "node-30",
74
- "node-40",
75
- ]
76
-
77
-
78
- def test_check_enough_nodes_raises_error_if_not_enough_nodes_are_found(available_nodes):
79
- with mock.patch.object(settings, "node_replicas", 200):
80
- with pytest.raises(NodeClusterSmall):
81
- manager.check_enough_nodes()
82
-
83
-
84
- def test_check_enough_nodes_checks_max_node_replicas_only_if_set(available_nodes):
85
- with mock.patch.object(settings, "max_node_replicas", 0):
86
- with pytest.raises(NodeClusterSmall):
87
- manager.check_enough_nodes()
88
-
89
- with mock.patch.object(settings, "max_node_replicas", -1):
90
- manager.check_enough_nodes()
91
-
92
-
93
- def add_index_node(id: str):
94
- manager.add_index_node(
95
- id=id,
96
- address="nohost",
97
- shard_count=0,
98
- available_disk=100,
99
- dummy=True,
100
- )
101
-
102
-
103
- def add_read_replica_node(id: str, primary_id: str):
104
- manager.add_index_node(
105
- id=id,
106
- address="nohost",
107
- shard_count=0,
108
- available_disk=100,
109
- dummy=True,
110
- primary_id=primary_id,
111
- )
112
-
113
-
114
- def test_choose_node_with_two_primary_nodes():
115
- manager.INDEX_NODES.clear()
116
- add_index_node("node-0")
117
- add_index_node("node-1")
118
-
119
- node, _ = manager.choose_node(
120
- writer_pb2.ShardObject(
121
- replicas=[
122
- writer_pb2.ShardReplica(
123
- shard=writer_pb2.ShardCreated(id="123"), node="node-0"
124
- )
125
- ]
126
- )
127
- )
128
- assert node.id == "node-0"
129
- node, _ = manager.choose_node(
130
- writer_pb2.ShardObject(
131
- replicas=[
132
- writer_pb2.ShardReplica(
133
- shard=writer_pb2.ShardCreated(id="123"), node="node-1"
134
- )
135
- ]
136
- )
137
- )
138
- assert node.id == "node-1"
139
-
140
- manager.INDEX_NODES.clear()
141
-
142
-
143
- def test_choose_node_with_two_read_replicas():
144
- """Test choose_node with two replica nodes pointing to two different primary
145
- nodes.
146
-
147
- """
148
- manager.INDEX_NODES.clear()
149
- add_read_replica_node("node-replica-0", primary_id="node-0")
150
- add_read_replica_node("node-replica-1", primary_id="node-1")
151
-
152
- node, _ = manager.choose_node(
153
- writer_pb2.ShardObject(
154
- replicas=[
155
- writer_pb2.ShardReplica(
156
- shard=writer_pb2.ShardCreated(id="123"), node="node-0"
157
- )
158
- ]
159
- ),
160
- use_read_replica_nodes=True,
161
- )
162
- assert node.id == "node-replica-0"
163
- node, _ = manager.choose_node(
164
- writer_pb2.ShardObject(
165
- replicas=[
166
- writer_pb2.ShardReplica(
167
- shard=writer_pb2.ShardCreated(id="123"), node="node-1"
168
- )
169
- ]
170
- ),
171
- use_read_replica_nodes=True,
172
- )
173
- assert node.id == "node-replica-1"
174
-
175
- manager.INDEX_NODES.clear()
176
-
177
-
178
- def test_choose_node_no_healthy_node_available():
179
- """There's only one read replica for node-0 and we try to choose a node for
180
- a shard in node-1. We expect it to fail as there's no possible valid node to
181
- choose.
182
-
183
- """
184
- manager.INDEX_NODES.clear()
185
- add_read_replica_node("node-replica-0", primary_id="node-0")
186
-
187
- with pytest.raises(NoHealthyNodeAvailable):
188
- manager.choose_node(
189
- writer_pb2.ShardObject(
190
- replicas=[
191
- writer_pb2.ShardReplica(
192
- shard=writer_pb2.ShardCreated(id="123"), node="node-1"
193
- )
194
- ]
195
- ),
196
- use_read_replica_nodes=True,
197
- )
198
-
199
- manager.INDEX_NODES.clear()
200
-
201
-
202
- def repeated_choose_node(
203
- count: int, shard: writer_pb2.ShardObject, **kwargs
204
- ) -> tuple[list[str], list[str]]:
205
- shard_ids = []
206
- node_ids = []
207
-
208
- for _ in range(count):
209
- node, shard_id = manager.choose_node(shard, **kwargs)
210
- shard_ids.append(shard_id)
211
- node_ids.append(node.id)
212
-
213
- return shard_ids, node_ids
214
-
215
-
216
- def test_choose_node_with_nodes_and_replicas(standalone_mode_off):
217
- """Validate how choose node selects between different options depending on
218
- configuration.
219
-
220
- As some choices can be random between a subset of nodes, choose_node is
221
- called multiple times per assert.
222
-
223
- """
224
- TRIES_PER_ASSERT = 10
225
-
226
- shard = writer_pb2.ShardObject(
227
- replicas=[
228
- writer_pb2.ShardReplica(
229
- shard=writer_pb2.ShardCreated(id="123"),
230
- node="node-0",
231
- ),
232
- writer_pb2.ShardReplica(
233
- shard=writer_pb2.ShardCreated(id="456"),
234
- node="node-1",
235
- ),
236
- ]
237
- )
238
-
239
- # Start with 2 nodes and 1 read replica each
240
- manager.INDEX_NODES.clear()
241
- add_index_node("node-0")
242
- add_index_node("node-1")
243
- add_read_replica_node("node-replica-0", primary_id="node-0")
244
- add_read_replica_node("node-replica-1", primary_id="node-1")
245
-
246
- # Without read replicas, we only choose primaries
247
- shard_ids, node_ids = repeated_choose_node(
248
- TRIES_PER_ASSERT, shard, use_read_replica_nodes=False
249
- )
250
- assert set(shard_ids) == {"123", "456"}
251
- assert set(node_ids) == {"node-0", "node-1"}
252
-
253
- # Secondaries are preferred
254
- shard_ids, node_ids = repeated_choose_node(
255
- TRIES_PER_ASSERT, shard, use_read_replica_nodes=True
256
- )
257
- assert set(shard_ids) == {"123", "456"}
258
- assert set(node_ids) == {"node-replica-0", "node-replica-1"}
259
-
260
- # Target replicas take more preference
261
- shard_ids, node_ids = repeated_choose_node(
262
- TRIES_PER_ASSERT,
263
- shard,
264
- use_read_replica_nodes=False,
265
- target_shard_replicas=["456"],
266
- )
267
- assert set(shard_ids) == {"456"}
268
- assert set(node_ids) == {"node-1"}
269
-
270
- shard_ids, node_ids = repeated_choose_node(
271
- TRIES_PER_ASSERT,
272
- shard,
273
- use_read_replica_nodes=True,
274
- target_shard_replicas=["456"],
275
- )
276
- assert set(shard_ids) == {"456"}
277
- assert set(node_ids) == {"node-replica-1"}
278
-
279
- # Let's remove a node so it becomes unavailable, replica keeps working
280
- manager.INDEX_NODES.clear()
281
- add_index_node("node-0")
282
- add_read_replica_node("node-replica-0", primary_id="node-0")
283
- add_read_replica_node("node-replica-1", primary_id="node-1")
284
-
285
- shard_ids, node_ids = repeated_choose_node(
286
- TRIES_PER_ASSERT, shard, use_read_replica_nodes=False
287
- )
288
- assert set(shard_ids) == {"123"}
289
- assert set(node_ids) == {"node-0"}
290
-
291
- shard_ids, node_ids = repeated_choose_node(
292
- TRIES_PER_ASSERT, shard, use_read_replica_nodes=True
293
- )
294
- assert set(shard_ids) == {"123", "456"}
295
- assert set(node_ids) == {"node-replica-0", "node-replica-1"}
296
-
297
- # target replicas is ignored but only primaries are used
298
- shard_ids, node_ids = repeated_choose_node(
299
- TRIES_PER_ASSERT,
300
- shard,
301
- use_read_replica_nodes=False,
302
- target_shard_replicas=["456"],
303
- )
304
- assert set(shard_ids) == {"123"}
305
- assert set(node_ids) == {"node-0"}
306
-
307
- shard_ids, node_ids = repeated_choose_node(
308
- TRIES_PER_ASSERT,
309
- shard,
310
- use_read_replica_nodes=True,
311
- target_shard_replicas=["456"],
312
- )
313
- assert set(shard_ids) == {"456"}
314
- assert set(node_ids) == {"node-replica-1"}
315
-
316
- # Now let's add again the node but remove the replica
317
- manager.INDEX_NODES.clear()
318
- add_index_node("node-0")
319
- add_index_node("node-1")
320
- add_read_replica_node("node-replica-0", primary_id="node-0")
321
-
322
- shard_ids, node_ids = repeated_choose_node(
323
- TRIES_PER_ASSERT, shard, use_read_replica_nodes=False
324
- )
325
- assert set(shard_ids) == {"123", "456"}
326
- assert set(node_ids) == {"node-0", "node-1"}
327
-
328
- shard_ids, node_ids = repeated_choose_node(
329
- TRIES_PER_ASSERT, shard, use_read_replica_nodes=True
330
- )
331
- assert set(shard_ids) == {"123"}
332
- assert set(node_ids) == {"node-replica-0"}
333
-
334
- shard_ids, node_ids = repeated_choose_node(
335
- TRIES_PER_ASSERT,
336
- shard,
337
- use_read_replica_nodes=False,
338
- target_shard_replicas=["456"],
339
- )
340
- assert set(shard_ids) == {"456"}
341
- assert set(node_ids) == {"node-1"}
342
-
343
- shard_ids, node_ids = repeated_choose_node(
344
- TRIES_PER_ASSERT,
345
- shard,
346
- use_read_replica_nodes=True,
347
- target_shard_replicas=["456"],
348
- )
349
- assert set(shard_ids) == {"456"}
350
- assert set(node_ids) == {"node-1"}
351
-
352
- manager.INDEX_NODES.clear()
353
-
354
-
355
- @pytest.fixture(scope="function")
356
- def standalone_mode_off():
357
- prev = settings.standalone_mode
358
- settings.standalone_mode = False
359
- yield
360
- settings.standalone_mode = prev
361
-
362
-
363
- @pytest.fixture(scope="function")
364
- def index_nodes():
365
- index_nodes = {}
366
- with mock.patch.object(manager, "INDEX_NODES", new=index_nodes):
367
- yield index_nodes
368
-
369
-
370
- def test_get_index_nodes(standalone_mode_off, index_nodes):
371
- # Add a primary node
372
- manager.add_index_node(
373
- id="node-0",
374
- address="nohost",
375
- shard_count=0,
376
- available_disk=100,
377
- dummy=True,
378
- )
379
- # Add a secondary replica of node-0
380
- manager.add_index_node(
381
- id="node-1",
382
- address="nohost",
383
- shard_count=0,
384
- available_disk=100,
385
- dummy=True,
386
- primary_id="node-0",
387
- )
388
-
389
- # By default, only primary nodes are returned
390
- nodes = manager.get_index_nodes()
391
- assert len(nodes) == 1
392
- assert nodes[0].id == "node-0"
393
-
394
- # If we ask for secondary, we get both
395
- nodes = manager.get_index_nodes(include_secondary=True)
396
- assert len(nodes) == 2
397
- sorted(nodes, key=lambda x: x.id)
398
- assert nodes[0].id == "node-0"
399
- assert nodes[1].id == "node-1"
@@ -1,178 +0,0 @@
1
- # Copyright (C) 2021 Bosutech XXI S.L.
2
- #
3
- # nucliadb is offered under the AGPL v3.0 and as commercial software.
4
- # For commercial licensing, contact us at info@nuclia.com.
5
- #
6
- # AGPL:
7
- # This program is free software: you can redistribute it and/or modify
8
- # it under the terms of the GNU Affero General Public License as
9
- # published by the Free Software Foundation, either version 3 of the
10
- # License, or (at your option) any later version.
11
- #
12
- # This program is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU Affero General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU Affero General Public License
18
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
19
- #
20
- import asyncio
21
- import uuid
22
- from typing import Any, Optional
23
- from unittest.mock import MagicMock
24
-
25
- import pytest
26
-
27
- from nucliadb.common import datamanagers
28
- from nucliadb.common.cluster import manager
29
- from nucliadb.common.cluster.settings import settings
30
- from nucliadb.common.maindb.driver import Transaction
31
- from nucliadb_protos import knowledgebox_pb2, utils_pb2, writer_pb2
32
-
33
-
34
- def test_should_create_new_shard():
35
- sm = manager.KBShardManager()
36
- low_para_counter = {
37
- "num_paragraphs": settings.max_shard_paragraphs - 1,
38
- "num_fields": 0,
39
- }
40
- high_para_counter = {
41
- "num_paragraphs": settings.max_shard_paragraphs + 1,
42
- "num_fields": 0,
43
- }
44
- assert sm.should_create_new_shard(**low_para_counter) is False
45
- assert sm.should_create_new_shard(**high_para_counter) is True
46
-
47
- low_fields_counter = {"num_fields": settings.max_shard_fields, "num_paragraphs": 0}
48
- high_fields_counter = {
49
- "num_fields": settings.max_shard_fields + 1,
50
- "num_paragraphs": 0,
51
- }
52
- assert sm.should_create_new_shard(**low_fields_counter) is False
53
- assert sm.should_create_new_shard(**high_fields_counter) is True
54
-
55
-
56
- @pytest.fixture(scope="function")
57
- async def fake_node():
58
- manager.INDEX_NODES.clear()
59
- yield manager.add_index_node(
60
- id="node-0",
61
- address="nohost",
62
- shard_count=0,
63
- available_disk=100,
64
- dummy=True,
65
- )
66
- manager.INDEX_NODES.clear()
67
-
68
-
69
- async def test_standalone_node_garbage_collects(fake_node):
70
- mng = manager.StandaloneKBShardManager()
71
-
72
- mng.max_ops_before_checks = 0
73
-
74
- await mng.add_resource(
75
- writer_pb2.ShardObject(
76
- shard="123",
77
- replicas=[
78
- writer_pb2.ShardReplica(
79
- shard=writer_pb2.ShardCreated(id="123"), node="node-0"
80
- )
81
- ],
82
- ),
83
- resource=MagicMock(),
84
- txid=-1,
85
- partition=0,
86
- kb="kb",
87
- )
88
-
89
- await asyncio.sleep(0.05)
90
- assert len(fake_node.writer.calls["GC"]) == 1
91
-
92
-
93
- async def test_shard_creation(fake_index_nodes: list[str], txn: Transaction):
94
- """Given a cluster of index nodes, validate shard creation logic.
95
-
96
- Every logic shard should create a configured amount of indexing replicas and
97
- update the information about writable shards.
98
-
99
- """
100
- index_nodes = set(fake_index_nodes)
101
- kbid = f"kbid:{test_shard_creation.__name__}"
102
- semantic_model = knowledgebox_pb2.SemanticModelMetadata()
103
- release_channel = utils_pb2.ReleaseChannel.STABLE
104
- sm = manager.KBShardManager()
105
-
106
- shards = await datamanagers.cluster.get_kb_shards(txn, kbid=kbid)
107
- assert shards is None
108
-
109
- # create first shard
110
- await sm.create_shard_by_kbid(txn, kbid, semantic_model, release_channel)
111
-
112
- shards = await datamanagers.cluster.get_kb_shards(txn, kbid=kbid)
113
- assert shards is not None
114
- assert len(shards.shards) == 1
115
- assert shards.shards[0].read_only is False
116
- # B/c with Shards.actual
117
- assert shards.actual == 0
118
- assert set((replica.node for replica in shards.shards[0].replicas)) == index_nodes
119
-
120
- # adding a second shard will mark the first as read only
121
- await sm.create_shard_by_kbid(txn, kbid, semantic_model, release_channel)
122
-
123
- shards = await datamanagers.cluster.get_kb_shards(txn, kbid=kbid)
124
- assert shards is not None
125
- assert len(shards.shards) == 2
126
- assert shards.shards[0].read_only is True
127
- assert shards.shards[1].read_only is False
128
- # B/c with Shards.actual
129
- assert shards.actual == 1
130
- assert set((replica.node for replica in shards.shards[1].replicas)) == index_nodes
131
-
132
- # adding a third one will be equivalent
133
- await sm.create_shard_by_kbid(txn, kbid, semantic_model, release_channel)
134
-
135
- shards = await datamanagers.cluster.get_kb_shards(txn, kbid=kbid)
136
- assert shards is not None
137
- assert len(shards.shards) == 3
138
- assert shards.shards[0].read_only is True
139
- assert shards.shards[1].read_only is True
140
- assert shards.shards[2].read_only is False
141
- # B/c with Shards.actual
142
- assert shards.actual == 2
143
- assert set((replica.node for replica in shards.shards[1].replicas)) == index_nodes
144
-
145
-
146
- @pytest.fixture
147
- def txn():
148
- class MockTransaction:
149
- def __init__(self):
150
- self.store = {}
151
-
152
- async def get(self, key: str) -> Optional[Any]:
153
- return self.store.get(key, None)
154
-
155
- async def set(self, key: str, value: Any):
156
- self.store[key] = value
157
-
158
- yield MockTransaction()
159
-
160
-
161
- @pytest.fixture(scope="function")
162
- def fake_index_nodes():
163
- assert len(manager.INDEX_NODES) == 0, "Some test isn't cleaning global state!"
164
-
165
- nodes = [f"node-{i}" for i in range(settings.node_replicas)]
166
- for node_id in nodes:
167
- manager.add_index_node(
168
- id=node_id,
169
- address=f"nohost-{str(uuid.uuid4())}:1234",
170
- shard_count=0,
171
- available_disk=100,
172
- dummy=True,
173
- )
174
-
175
- yield nodes
176
-
177
- for node_id in nodes:
178
- manager.remove_index_node(node_id)