nucliadb 4.0.0.post542__py3-none-any.whl → 6.2.1.post2798__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.
- migrations/0003_allfields_key.py +1 -35
- migrations/0009_upgrade_relations_and_texts_to_v2.py +4 -2
- migrations/0010_fix_corrupt_indexes.py +10 -10
- migrations/0011_materialize_labelset_ids.py +1 -16
- migrations/0012_rollover_shards.py +5 -10
- migrations/0014_rollover_shards.py +4 -5
- migrations/0015_targeted_rollover.py +5 -10
- migrations/0016_upgrade_to_paragraphs_v2.py +25 -28
- migrations/0017_multiple_writable_shards.py +2 -4
- migrations/0018_purge_orphan_kbslugs.py +5 -7
- migrations/0019_upgrade_to_paragraphs_v3.py +25 -28
- migrations/0020_drain_nodes_from_cluster.py +3 -3
- nucliadb/standalone/tests/unit/test_run.py → migrations/0021_overwrite_vectorsets_key.py +16 -19
- nucliadb/tests/unit/test_openapi.py → migrations/0022_fix_paragraph_deletion_bug.py +16 -11
- migrations/0023_backfill_pg_catalog.py +80 -0
- migrations/0025_assign_models_to_kbs_v2.py +113 -0
- migrations/0026_fix_high_cardinality_content_types.py +61 -0
- migrations/0027_rollover_texts3.py +73 -0
- nucliadb/ingest/fields/date.py → migrations/pg/0001_bootstrap.py +10 -12
- migrations/pg/0002_catalog.py +42 -0
- nucliadb/ingest/tests/unit/test_settings.py → migrations/pg/0003_catalog_kbid_index.py +5 -3
- nucliadb/common/cluster/base.py +30 -16
- nucliadb/common/cluster/discovery/base.py +6 -14
- nucliadb/common/cluster/discovery/k8s.py +9 -19
- nucliadb/common/cluster/discovery/manual.py +1 -3
- nucliadb/common/cluster/discovery/utils.py +1 -3
- nucliadb/common/cluster/grpc_node_dummy.py +3 -11
- nucliadb/common/cluster/index_node.py +10 -19
- nucliadb/common/cluster/manager.py +174 -59
- nucliadb/common/cluster/rebalance.py +27 -29
- nucliadb/common/cluster/rollover.py +353 -194
- nucliadb/common/cluster/settings.py +6 -0
- nucliadb/common/cluster/standalone/grpc_node_binding.py +13 -64
- nucliadb/common/cluster/standalone/index_node.py +4 -11
- nucliadb/common/cluster/standalone/service.py +2 -6
- nucliadb/common/cluster/standalone/utils.py +2 -6
- nucliadb/common/cluster/utils.py +29 -22
- nucliadb/common/constants.py +20 -0
- nucliadb/common/context/__init__.py +3 -0
- nucliadb/common/context/fastapi.py +8 -5
- nucliadb/{tests/knowledgeboxes/__init__.py → common/counters.py} +8 -2
- nucliadb/common/datamanagers/__init__.py +7 -1
- nucliadb/common/datamanagers/atomic.py +22 -4
- nucliadb/common/datamanagers/cluster.py +5 -5
- nucliadb/common/datamanagers/entities.py +6 -16
- nucliadb/common/datamanagers/fields.py +84 -0
- nucliadb/common/datamanagers/kb.py +83 -37
- nucliadb/common/datamanagers/labels.py +26 -56
- nucliadb/common/datamanagers/processing.py +2 -6
- nucliadb/common/datamanagers/resources.py +41 -103
- nucliadb/common/datamanagers/rollover.py +76 -15
- nucliadb/common/datamanagers/synonyms.py +1 -1
- nucliadb/common/datamanagers/utils.py +15 -6
- nucliadb/common/datamanagers/vectorsets.py +110 -0
- nucliadb/common/external_index_providers/base.py +257 -0
- nucliadb/{ingest/tests/unit/orm/test_orm_utils.py → common/external_index_providers/exceptions.py} +9 -8
- nucliadb/common/external_index_providers/manager.py +101 -0
- nucliadb/common/external_index_providers/pinecone.py +933 -0
- nucliadb/common/external_index_providers/settings.py +52 -0
- nucliadb/common/http_clients/auth.py +3 -6
- nucliadb/common/http_clients/processing.py +6 -11
- nucliadb/common/http_clients/utils.py +1 -3
- nucliadb/common/ids.py +240 -0
- nucliadb/common/locking.py +29 -7
- nucliadb/common/maindb/driver.py +11 -35
- nucliadb/common/maindb/exceptions.py +3 -0
- nucliadb/common/maindb/local.py +22 -9
- nucliadb/common/maindb/pg.py +206 -111
- nucliadb/common/maindb/utils.py +11 -42
- nucliadb/common/models_utils/from_proto.py +479 -0
- nucliadb/common/models_utils/to_proto.py +60 -0
- nucliadb/common/nidx.py +260 -0
- nucliadb/export_import/datamanager.py +25 -19
- nucliadb/export_import/exporter.py +5 -11
- nucliadb/export_import/importer.py +5 -7
- nucliadb/export_import/models.py +3 -3
- nucliadb/export_import/tasks.py +4 -4
- nucliadb/export_import/utils.py +25 -37
- nucliadb/health.py +1 -3
- nucliadb/ingest/app.py +15 -11
- nucliadb/ingest/consumer/auditing.py +21 -19
- nucliadb/ingest/consumer/consumer.py +82 -47
- nucliadb/ingest/consumer/materializer.py +5 -12
- nucliadb/ingest/consumer/pull.py +12 -27
- nucliadb/ingest/consumer/service.py +19 -17
- nucliadb/ingest/consumer/shard_creator.py +2 -4
- nucliadb/ingest/consumer/utils.py +1 -3
- nucliadb/ingest/fields/base.py +137 -105
- nucliadb/ingest/fields/conversation.py +18 -5
- nucliadb/ingest/fields/exceptions.py +1 -4
- nucliadb/ingest/fields/file.py +7 -16
- nucliadb/ingest/fields/link.py +5 -10
- nucliadb/ingest/fields/text.py +9 -4
- nucliadb/ingest/orm/brain.py +200 -213
- nucliadb/ingest/orm/broker_message.py +181 -0
- nucliadb/ingest/orm/entities.py +36 -51
- nucliadb/ingest/orm/exceptions.py +12 -0
- nucliadb/ingest/orm/knowledgebox.py +322 -197
- nucliadb/ingest/orm/processor/__init__.py +2 -700
- nucliadb/ingest/orm/processor/auditing.py +4 -23
- nucliadb/ingest/orm/processor/data_augmentation.py +164 -0
- nucliadb/ingest/orm/processor/pgcatalog.py +84 -0
- nucliadb/ingest/orm/processor/processor.py +752 -0
- nucliadb/ingest/orm/processor/sequence_manager.py +1 -1
- nucliadb/ingest/orm/resource.py +249 -403
- nucliadb/ingest/orm/utils.py +4 -4
- nucliadb/ingest/partitions.py +3 -9
- nucliadb/ingest/processing.py +70 -73
- nucliadb/ingest/py.typed +0 -0
- nucliadb/ingest/serialize.py +37 -167
- nucliadb/ingest/service/__init__.py +1 -3
- nucliadb/ingest/service/writer.py +185 -412
- nucliadb/ingest/settings.py +10 -20
- nucliadb/ingest/utils.py +3 -6
- nucliadb/learning_proxy.py +242 -55
- nucliadb/metrics_exporter.py +30 -19
- nucliadb/middleware/__init__.py +1 -3
- nucliadb/migrator/command.py +1 -3
- nucliadb/migrator/datamanager.py +13 -13
- nucliadb/migrator/migrator.py +47 -30
- nucliadb/migrator/utils.py +18 -10
- nucliadb/purge/__init__.py +139 -33
- nucliadb/purge/orphan_shards.py +7 -13
- nucliadb/reader/__init__.py +1 -3
- nucliadb/reader/api/models.py +1 -12
- nucliadb/reader/api/v1/__init__.py +0 -1
- nucliadb/reader/api/v1/download.py +21 -88
- nucliadb/reader/api/v1/export_import.py +1 -1
- nucliadb/reader/api/v1/knowledgebox.py +10 -10
- nucliadb/reader/api/v1/learning_config.py +2 -6
- nucliadb/reader/api/v1/resource.py +62 -88
- nucliadb/reader/api/v1/services.py +64 -83
- nucliadb/reader/app.py +12 -29
- nucliadb/reader/lifecycle.py +18 -4
- nucliadb/reader/py.typed +0 -0
- nucliadb/reader/reader/notifications.py +10 -28
- nucliadb/search/__init__.py +1 -3
- nucliadb/search/api/v1/__init__.py +1 -2
- nucliadb/search/api/v1/ask.py +17 -10
- nucliadb/search/api/v1/catalog.py +184 -0
- nucliadb/search/api/v1/feedback.py +16 -24
- nucliadb/search/api/v1/find.py +36 -36
- nucliadb/search/api/v1/knowledgebox.py +89 -60
- nucliadb/search/api/v1/resource/ask.py +2 -8
- nucliadb/search/api/v1/resource/search.py +49 -70
- nucliadb/search/api/v1/search.py +44 -210
- nucliadb/search/api/v1/suggest.py +39 -54
- nucliadb/search/app.py +12 -32
- nucliadb/search/lifecycle.py +10 -3
- nucliadb/search/predict.py +136 -187
- nucliadb/search/py.typed +0 -0
- nucliadb/search/requesters/utils.py +25 -58
- nucliadb/search/search/cache.py +149 -20
- nucliadb/search/search/chat/ask.py +571 -123
- nucliadb/search/{tests/unit/test_run.py → search/chat/exceptions.py} +14 -14
- nucliadb/search/search/chat/images.py +41 -17
- nucliadb/search/search/chat/prompt.py +817 -266
- nucliadb/search/search/chat/query.py +213 -309
- nucliadb/{tests/migrations/__init__.py → search/search/cut.py} +8 -8
- nucliadb/search/search/fetch.py +43 -36
- nucliadb/search/search/filters.py +9 -15
- nucliadb/search/search/find.py +214 -53
- nucliadb/search/search/find_merge.py +408 -391
- nucliadb/search/search/hydrator.py +191 -0
- nucliadb/search/search/merge.py +187 -223
- nucliadb/search/search/metrics.py +73 -2
- nucliadb/search/search/paragraphs.py +64 -106
- nucliadb/search/search/pgcatalog.py +233 -0
- nucliadb/search/search/predict_proxy.py +1 -1
- nucliadb/search/search/query.py +305 -150
- nucliadb/search/search/query_parser/exceptions.py +22 -0
- nucliadb/search/search/query_parser/models.py +101 -0
- nucliadb/search/search/query_parser/parser.py +183 -0
- nucliadb/search/search/rank_fusion.py +204 -0
- nucliadb/search/search/rerankers.py +270 -0
- nucliadb/search/search/shards.py +3 -32
- nucliadb/search/search/summarize.py +7 -18
- nucliadb/search/search/utils.py +27 -4
- nucliadb/search/settings.py +15 -1
- nucliadb/standalone/api_router.py +4 -10
- nucliadb/standalone/app.py +8 -14
- nucliadb/standalone/auth.py +7 -21
- nucliadb/standalone/config.py +7 -10
- nucliadb/standalone/lifecycle.py +26 -25
- nucliadb/standalone/migrations.py +1 -3
- nucliadb/standalone/purge.py +1 -1
- nucliadb/standalone/py.typed +0 -0
- nucliadb/standalone/run.py +3 -6
- nucliadb/standalone/settings.py +9 -16
- nucliadb/standalone/versions.py +15 -5
- nucliadb/tasks/consumer.py +8 -12
- nucliadb/tasks/producer.py +7 -6
- nucliadb/tests/config.py +53 -0
- nucliadb/train/__init__.py +1 -3
- nucliadb/train/api/utils.py +1 -2
- nucliadb/train/api/v1/shards.py +1 -1
- nucliadb/train/api/v1/trainset.py +2 -4
- nucliadb/train/app.py +10 -31
- nucliadb/train/generator.py +10 -19
- nucliadb/train/generators/field_classifier.py +7 -19
- nucliadb/train/generators/field_streaming.py +156 -0
- nucliadb/train/generators/image_classifier.py +12 -18
- nucliadb/train/generators/paragraph_classifier.py +5 -9
- nucliadb/train/generators/paragraph_streaming.py +6 -9
- nucliadb/train/generators/question_answer_streaming.py +19 -20
- nucliadb/train/generators/sentence_classifier.py +9 -15
- nucliadb/train/generators/token_classifier.py +48 -39
- nucliadb/train/generators/utils.py +14 -18
- nucliadb/train/lifecycle.py +7 -3
- nucliadb/train/nodes.py +23 -32
- nucliadb/train/py.typed +0 -0
- nucliadb/train/servicer.py +13 -21
- nucliadb/train/settings.py +2 -6
- nucliadb/train/types.py +13 -10
- nucliadb/train/upload.py +3 -6
- nucliadb/train/uploader.py +19 -23
- nucliadb/train/utils.py +1 -1
- nucliadb/writer/__init__.py +1 -3
- nucliadb/{ingest/fields/keywordset.py → writer/api/utils.py} +13 -10
- nucliadb/writer/api/v1/export_import.py +67 -14
- nucliadb/writer/api/v1/field.py +16 -269
- nucliadb/writer/api/v1/knowledgebox.py +218 -68
- nucliadb/writer/api/v1/resource.py +68 -88
- nucliadb/writer/api/v1/services.py +51 -70
- nucliadb/writer/api/v1/slug.py +61 -0
- nucliadb/writer/api/v1/transaction.py +67 -0
- nucliadb/writer/api/v1/upload.py +143 -117
- nucliadb/writer/app.py +6 -43
- nucliadb/writer/back_pressure.py +16 -38
- nucliadb/writer/exceptions.py +0 -4
- nucliadb/writer/lifecycle.py +21 -15
- nucliadb/writer/py.typed +0 -0
- nucliadb/writer/resource/audit.py +2 -1
- nucliadb/writer/resource/basic.py +48 -46
- nucliadb/writer/resource/field.py +37 -128
- nucliadb/writer/resource/origin.py +1 -2
- nucliadb/writer/settings.py +6 -2
- nucliadb/writer/tus/__init__.py +17 -15
- nucliadb/writer/tus/azure.py +111 -0
- nucliadb/writer/tus/dm.py +17 -5
- nucliadb/writer/tus/exceptions.py +1 -3
- nucliadb/writer/tus/gcs.py +49 -84
- nucliadb/writer/tus/local.py +21 -37
- nucliadb/writer/tus/s3.py +28 -68
- nucliadb/writer/tus/storage.py +5 -56
- nucliadb/writer/vectorsets.py +125 -0
- nucliadb-6.2.1.post2798.dist-info/METADATA +148 -0
- nucliadb-6.2.1.post2798.dist-info/RECORD +343 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/WHEEL +1 -1
- nucliadb/common/maindb/redis.py +0 -194
- nucliadb/common/maindb/tikv.py +0 -433
- nucliadb/ingest/fields/layout.py +0 -58
- nucliadb/ingest/tests/conftest.py +0 -30
- nucliadb/ingest/tests/fixtures.py +0 -764
- nucliadb/ingest/tests/integration/consumer/__init__.py +0 -18
- nucliadb/ingest/tests/integration/consumer/test_auditing.py +0 -78
- nucliadb/ingest/tests/integration/consumer/test_materializer.py +0 -126
- nucliadb/ingest/tests/integration/consumer/test_pull.py +0 -144
- nucliadb/ingest/tests/integration/consumer/test_service.py +0 -81
- nucliadb/ingest/tests/integration/consumer/test_shard_creator.py +0 -68
- nucliadb/ingest/tests/integration/ingest/test_ingest.py +0 -684
- nucliadb/ingest/tests/integration/ingest/test_processing_engine.py +0 -95
- nucliadb/ingest/tests/integration/ingest/test_relations.py +0 -272
- nucliadb/ingest/tests/unit/consumer/__init__.py +0 -18
- nucliadb/ingest/tests/unit/consumer/test_auditing.py +0 -139
- nucliadb/ingest/tests/unit/consumer/test_consumer.py +0 -69
- nucliadb/ingest/tests/unit/consumer/test_pull.py +0 -60
- nucliadb/ingest/tests/unit/consumer/test_shard_creator.py +0 -140
- nucliadb/ingest/tests/unit/consumer/test_utils.py +0 -67
- nucliadb/ingest/tests/unit/orm/__init__.py +0 -19
- nucliadb/ingest/tests/unit/orm/test_brain.py +0 -247
- nucliadb/ingest/tests/unit/orm/test_brain_vectors.py +0 -74
- nucliadb/ingest/tests/unit/orm/test_processor.py +0 -131
- nucliadb/ingest/tests/unit/orm/test_resource.py +0 -331
- nucliadb/ingest/tests/unit/test_cache.py +0 -31
- nucliadb/ingest/tests/unit/test_partitions.py +0 -40
- nucliadb/ingest/tests/unit/test_processing.py +0 -171
- nucliadb/middleware/transaction.py +0 -117
- nucliadb/reader/api/v1/learning_collector.py +0 -63
- nucliadb/reader/tests/__init__.py +0 -19
- nucliadb/reader/tests/conftest.py +0 -31
- nucliadb/reader/tests/fixtures.py +0 -136
- nucliadb/reader/tests/test_list_resources.py +0 -75
- nucliadb/reader/tests/test_reader_file_download.py +0 -273
- nucliadb/reader/tests/test_reader_resource.py +0 -353
- nucliadb/reader/tests/test_reader_resource_field.py +0 -219
- nucliadb/search/api/v1/chat.py +0 -263
- nucliadb/search/api/v1/resource/chat.py +0 -174
- nucliadb/search/tests/__init__.py +0 -19
- nucliadb/search/tests/conftest.py +0 -33
- nucliadb/search/tests/fixtures.py +0 -199
- nucliadb/search/tests/node.py +0 -466
- nucliadb/search/tests/unit/__init__.py +0 -18
- nucliadb/search/tests/unit/api/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/resource/__init__.py +0 -19
- nucliadb/search/tests/unit/api/v1/resource/test_chat.py +0 -98
- nucliadb/search/tests/unit/api/v1/test_ask.py +0 -120
- nucliadb/search/tests/unit/api/v1/test_chat.py +0 -96
- nucliadb/search/tests/unit/api/v1/test_predict_proxy.py +0 -98
- nucliadb/search/tests/unit/api/v1/test_summarize.py +0 -99
- nucliadb/search/tests/unit/search/__init__.py +0 -18
- nucliadb/search/tests/unit/search/requesters/__init__.py +0 -18
- nucliadb/search/tests/unit/search/requesters/test_utils.py +0 -211
- nucliadb/search/tests/unit/search/search/__init__.py +0 -19
- nucliadb/search/tests/unit/search/search/test_shards.py +0 -45
- nucliadb/search/tests/unit/search/search/test_utils.py +0 -82
- nucliadb/search/tests/unit/search/test_chat_prompt.py +0 -270
- nucliadb/search/tests/unit/search/test_fetch.py +0 -108
- nucliadb/search/tests/unit/search/test_filters.py +0 -125
- nucliadb/search/tests/unit/search/test_paragraphs.py +0 -157
- nucliadb/search/tests/unit/search/test_predict_proxy.py +0 -106
- nucliadb/search/tests/unit/search/test_query.py +0 -153
- nucliadb/search/tests/unit/test_app.py +0 -79
- nucliadb/search/tests/unit/test_find_merge.py +0 -112
- nucliadb/search/tests/unit/test_merge.py +0 -34
- nucliadb/search/tests/unit/test_predict.py +0 -525
- nucliadb/standalone/tests/__init__.py +0 -19
- nucliadb/standalone/tests/conftest.py +0 -33
- nucliadb/standalone/tests/fixtures.py +0 -38
- nucliadb/standalone/tests/unit/__init__.py +0 -18
- nucliadb/standalone/tests/unit/test_api_router.py +0 -61
- nucliadb/standalone/tests/unit/test_auth.py +0 -169
- nucliadb/standalone/tests/unit/test_introspect.py +0 -35
- nucliadb/standalone/tests/unit/test_migrations.py +0 -63
- nucliadb/standalone/tests/unit/test_versions.py +0 -68
- nucliadb/tests/benchmarks/__init__.py +0 -19
- nucliadb/tests/benchmarks/test_search.py +0 -99
- nucliadb/tests/conftest.py +0 -32
- nucliadb/tests/fixtures.py +0 -735
- nucliadb/tests/knowledgeboxes/philosophy_books.py +0 -202
- nucliadb/tests/knowledgeboxes/ten_dummy_resources.py +0 -107
- nucliadb/tests/migrations/test_migration_0017.py +0 -76
- nucliadb/tests/migrations/test_migration_0018.py +0 -95
- nucliadb/tests/tikv.py +0 -240
- nucliadb/tests/unit/__init__.py +0 -19
- nucliadb/tests/unit/common/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/discovery/__init__.py +0 -19
- nucliadb/tests/unit/common/cluster/discovery/test_k8s.py +0 -172
- nucliadb/tests/unit/common/cluster/standalone/__init__.py +0 -18
- nucliadb/tests/unit/common/cluster/standalone/test_service.py +0 -114
- nucliadb/tests/unit/common/cluster/standalone/test_utils.py +0 -61
- nucliadb/tests/unit/common/cluster/test_cluster.py +0 -408
- nucliadb/tests/unit/common/cluster/test_kb_shard_manager.py +0 -173
- nucliadb/tests/unit/common/cluster/test_rebalance.py +0 -38
- nucliadb/tests/unit/common/cluster/test_rollover.py +0 -282
- nucliadb/tests/unit/common/maindb/__init__.py +0 -18
- nucliadb/tests/unit/common/maindb/test_driver.py +0 -127
- nucliadb/tests/unit/common/maindb/test_tikv.py +0 -53
- nucliadb/tests/unit/common/maindb/test_utils.py +0 -92
- nucliadb/tests/unit/common/test_context.py +0 -36
- nucliadb/tests/unit/export_import/__init__.py +0 -19
- nucliadb/tests/unit/export_import/test_datamanager.py +0 -37
- nucliadb/tests/unit/export_import/test_utils.py +0 -301
- nucliadb/tests/unit/migrator/__init__.py +0 -19
- nucliadb/tests/unit/migrator/test_migrator.py +0 -87
- nucliadb/tests/unit/tasks/__init__.py +0 -19
- nucliadb/tests/unit/tasks/conftest.py +0 -42
- nucliadb/tests/unit/tasks/test_consumer.py +0 -92
- nucliadb/tests/unit/tasks/test_producer.py +0 -95
- nucliadb/tests/unit/tasks/test_tasks.py +0 -58
- nucliadb/tests/unit/test_field_ids.py +0 -49
- nucliadb/tests/unit/test_health.py +0 -86
- nucliadb/tests/unit/test_kb_slugs.py +0 -54
- nucliadb/tests/unit/test_learning_proxy.py +0 -252
- nucliadb/tests/unit/test_metrics_exporter.py +0 -77
- nucliadb/tests/unit/test_purge.py +0 -136
- nucliadb/tests/utils/__init__.py +0 -74
- nucliadb/tests/utils/aiohttp_session.py +0 -44
- nucliadb/tests/utils/broker_messages/__init__.py +0 -171
- nucliadb/tests/utils/broker_messages/fields.py +0 -197
- nucliadb/tests/utils/broker_messages/helpers.py +0 -33
- nucliadb/tests/utils/entities.py +0 -78
- nucliadb/train/api/v1/check.py +0 -60
- nucliadb/train/tests/__init__.py +0 -19
- nucliadb/train/tests/conftest.py +0 -29
- nucliadb/train/tests/fixtures.py +0 -342
- nucliadb/train/tests/test_field_classification.py +0 -122
- nucliadb/train/tests/test_get_entities.py +0 -80
- nucliadb/train/tests/test_get_info.py +0 -51
- nucliadb/train/tests/test_get_ontology.py +0 -34
- nucliadb/train/tests/test_get_ontology_count.py +0 -63
- nucliadb/train/tests/test_image_classification.py +0 -221
- nucliadb/train/tests/test_list_fields.py +0 -39
- nucliadb/train/tests/test_list_paragraphs.py +0 -73
- nucliadb/train/tests/test_list_resources.py +0 -39
- nucliadb/train/tests/test_list_sentences.py +0 -71
- nucliadb/train/tests/test_paragraph_classification.py +0 -123
- nucliadb/train/tests/test_paragraph_streaming.py +0 -118
- nucliadb/train/tests/test_question_answer_streaming.py +0 -239
- nucliadb/train/tests/test_sentence_classification.py +0 -143
- nucliadb/train/tests/test_token_classification.py +0 -136
- nucliadb/train/tests/utils.py +0 -101
- nucliadb/writer/layouts/__init__.py +0 -51
- nucliadb/writer/layouts/v1.py +0 -59
- nucliadb/writer/tests/__init__.py +0 -19
- nucliadb/writer/tests/conftest.py +0 -31
- nucliadb/writer/tests/fixtures.py +0 -191
- nucliadb/writer/tests/test_fields.py +0 -475
- nucliadb/writer/tests/test_files.py +0 -740
- nucliadb/writer/tests/test_knowledgebox.py +0 -49
- nucliadb/writer/tests/test_reprocess_file_field.py +0 -133
- nucliadb/writer/tests/test_resources.py +0 -476
- nucliadb/writer/tests/test_service.py +0 -137
- nucliadb/writer/tests/test_tus.py +0 -203
- nucliadb/writer/tests/utils.py +0 -35
- nucliadb/writer/tus/pg.py +0 -125
- nucliadb-4.0.0.post542.dist-info/METADATA +0 -135
- nucliadb-4.0.0.post542.dist-info/RECORD +0 -462
- {nucliadb/ingest/tests → migrations/pg}/__init__.py +0 -0
- /nucliadb/{ingest/tests/integration → common/external_index_providers}/__init__.py +0 -0
- /nucliadb/{ingest/tests/integration/ingest → common/models_utils}/__init__.py +0 -0
- /nucliadb/{ingest/tests/unit → search/search/query_parser}/__init__.py +0 -0
- /nucliadb/{ingest/tests → tests}/vectors.py +0 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/entry_points.txt +0 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/top_level.txt +0 -0
- {nucliadb-4.0.0.post542.dist-info → nucliadb-6.2.1.post2798.dist-info}/zip-safe +0 -0
nucliadb/search/tests/node.py
DELETED
@@ -1,466 +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 dataclasses
|
21
|
-
import logging
|
22
|
-
import os
|
23
|
-
import time
|
24
|
-
from typing import Union
|
25
|
-
|
26
|
-
import backoff
|
27
|
-
import docker # type: ignore
|
28
|
-
import pytest
|
29
|
-
from grpc import insecure_channel
|
30
|
-
from grpc_health.v1 import health_pb2_grpc
|
31
|
-
from grpc_health.v1.health_pb2 import HealthCheckRequest
|
32
|
-
from nucliadb_protos.nodewriter_pb2 import EmptyQuery, ShardId
|
33
|
-
from nucliadb_protos.nodewriter_pb2_grpc import NodeWriterStub
|
34
|
-
from pytest_docker_fixtures import images # type: ignore
|
35
|
-
from pytest_docker_fixtures.containers._base import BaseImage # type: ignore
|
36
|
-
from pytest_lazy_fixtures import lazy_fixture
|
37
|
-
|
38
|
-
from nucliadb.common.cluster.settings import settings as cluster_settings
|
39
|
-
from nucliadb_utils.tests.conftest import get_testing_storage_backend
|
40
|
-
|
41
|
-
logger = logging.getLogger(__name__)
|
42
|
-
|
43
|
-
images.settings["nucliadb_node_reader"] = {
|
44
|
-
"image": "europe-west4-docker.pkg.dev/nuclia-internal/nuclia/node",
|
45
|
-
"version": "latest",
|
46
|
-
"env": {
|
47
|
-
"FILE_BACKEND": "unset",
|
48
|
-
"HOST_KEY_PATH": "/data/node.key",
|
49
|
-
"DATA_PATH": "/data",
|
50
|
-
"READER_LISTEN_ADDRESS": "0.0.0.0:4445",
|
51
|
-
"NUCLIADB_DISABLE_ANALYTICS": "True",
|
52
|
-
"RUST_BACKTRACE": "full",
|
53
|
-
"RUST_LOG": "nucliadb_*=DEBUG",
|
54
|
-
},
|
55
|
-
"options": {
|
56
|
-
"command": [
|
57
|
-
"/usr/local/bin/node_reader",
|
58
|
-
],
|
59
|
-
"ports": {"4445": ("0.0.0.0", 0)},
|
60
|
-
"publish_all_ports": False,
|
61
|
-
"mem_limit": "3g", # default is 1g, need to override
|
62
|
-
"platform": "linux/amd64",
|
63
|
-
},
|
64
|
-
}
|
65
|
-
|
66
|
-
images.settings["nucliadb_node_writer"] = {
|
67
|
-
"image": "europe-west4-docker.pkg.dev/nuclia-internal/nuclia/node",
|
68
|
-
"version": "latest",
|
69
|
-
"env": {
|
70
|
-
"FILE_BACKEND": "unset",
|
71
|
-
"HOST_KEY_PATH": "/data/node.key",
|
72
|
-
"DATA_PATH": "/data",
|
73
|
-
"WRITER_LISTEN_ADDRESS": "0.0.0.0:4446",
|
74
|
-
"NUCLIADB_DISABLE_ANALYTICS": "True",
|
75
|
-
"RUST_BACKTRACE": "full",
|
76
|
-
"RUST_LOG": "nucliadb_*=DEBUG",
|
77
|
-
},
|
78
|
-
"options": {
|
79
|
-
"command": [
|
80
|
-
"/usr/local/bin/node_writer",
|
81
|
-
],
|
82
|
-
"ports": {"4446": ("0.0.0.0", 0)},
|
83
|
-
"publish_all_ports": False,
|
84
|
-
"mem_limit": "3g", # default is 1g, need to override
|
85
|
-
"platform": "linux/amd64",
|
86
|
-
},
|
87
|
-
}
|
88
|
-
|
89
|
-
images.settings["nucliadb_node_sidecar"] = {
|
90
|
-
"image": "europe-west4-docker.pkg.dev/nuclia-internal/nuclia/node_sidecar",
|
91
|
-
"version": "latest",
|
92
|
-
"env": {
|
93
|
-
"INDEX_JETSTREAM_SERVERS": "[]",
|
94
|
-
"CACHE_PUBSUB_NATS_URL": "",
|
95
|
-
"HOST_KEY_PATH": "/data/node.key",
|
96
|
-
"DATA_PATH": "/data",
|
97
|
-
"SIDECAR_LISTEN_ADDRESS": "0.0.0.0:4447",
|
98
|
-
"READER_LISTEN_ADDRESS": "0.0.0.0:4445",
|
99
|
-
"WRITER_LISTEN_ADDRESS": "0.0.0.0:4446",
|
100
|
-
"PYTHONUNBUFFERED": "1",
|
101
|
-
"LOG_LEVEL": "DEBUG",
|
102
|
-
},
|
103
|
-
"options": {
|
104
|
-
"command": [
|
105
|
-
"node_sidecar",
|
106
|
-
],
|
107
|
-
"ports": {"4447": ("0.0.0.0", 0)},
|
108
|
-
"publish_all_ports": False,
|
109
|
-
"platform": "linux/amd64",
|
110
|
-
},
|
111
|
-
}
|
112
|
-
|
113
|
-
|
114
|
-
def get_container_host(container_obj):
|
115
|
-
return container_obj.attrs["NetworkSettings"]["IPAddress"]
|
116
|
-
|
117
|
-
|
118
|
-
class nucliadbNodeReader(BaseImage):
|
119
|
-
name = "nucliadb_node_reader"
|
120
|
-
port = 4445
|
121
|
-
|
122
|
-
def run(self, volume):
|
123
|
-
self._volume = volume
|
124
|
-
self._mount = "/data"
|
125
|
-
return super(nucliadbNodeReader, self).run()
|
126
|
-
|
127
|
-
def get_image_options(self):
|
128
|
-
options = super(nucliadbNodeReader, self).get_image_options()
|
129
|
-
options["volumes"] = {self._volume.name: {"bind": "/data"}}
|
130
|
-
return options
|
131
|
-
|
132
|
-
def check(self):
|
133
|
-
channel = insecure_channel(f"{self.host}:{self.get_port()}")
|
134
|
-
stub = health_pb2_grpc.HealthStub(channel)
|
135
|
-
pb = HealthCheckRequest(service="nodereader.NodeReader")
|
136
|
-
try:
|
137
|
-
result = stub.Check(pb)
|
138
|
-
return result.status == 1
|
139
|
-
except: # noqa
|
140
|
-
return False
|
141
|
-
|
142
|
-
|
143
|
-
class nucliadbNodeWriter(BaseImage):
|
144
|
-
name = "nucliadb_node_writer"
|
145
|
-
port = 4446
|
146
|
-
|
147
|
-
def run(self, volume):
|
148
|
-
self._volume = volume
|
149
|
-
self._mount = "/data"
|
150
|
-
return super(nucliadbNodeWriter, self).run()
|
151
|
-
|
152
|
-
def get_image_options(self):
|
153
|
-
options = super(nucliadbNodeWriter, self).get_image_options()
|
154
|
-
options["volumes"] = {self._volume.name: {"bind": "/data"}}
|
155
|
-
return options
|
156
|
-
|
157
|
-
def check(self):
|
158
|
-
channel = insecure_channel(f"{self.host}:{self.get_port()}")
|
159
|
-
stub = health_pb2_grpc.HealthStub(channel)
|
160
|
-
pb = HealthCheckRequest(service="nodewriter.NodeWriter")
|
161
|
-
try:
|
162
|
-
result = stub.Check(pb)
|
163
|
-
return result.status == 1
|
164
|
-
except: # noqa
|
165
|
-
return False
|
166
|
-
|
167
|
-
|
168
|
-
class nucliadbNodeSidecar(BaseImage):
|
169
|
-
name = "nucliadb_node_sidecar"
|
170
|
-
port = 4447
|
171
|
-
|
172
|
-
def run(self, volume):
|
173
|
-
self._volume = volume
|
174
|
-
self._mount = "/data"
|
175
|
-
return super(nucliadbNodeSidecar, self).run()
|
176
|
-
|
177
|
-
def get_image_options(self):
|
178
|
-
options = super(nucliadbNodeSidecar, self).get_image_options()
|
179
|
-
options["volumes"] = {self._volume.name: {"bind": "/data"}}
|
180
|
-
return options
|
181
|
-
|
182
|
-
def check(self):
|
183
|
-
channel = insecure_channel(f"{self.host}:{self.get_port()}")
|
184
|
-
stub = health_pb2_grpc.HealthStub(channel)
|
185
|
-
pb = HealthCheckRequest(service="")
|
186
|
-
try:
|
187
|
-
result = stub.Check(pb)
|
188
|
-
return result.status == 1
|
189
|
-
except: # noqa
|
190
|
-
return False
|
191
|
-
|
192
|
-
|
193
|
-
nucliadb_node_1_reader = nucliadbNodeReader()
|
194
|
-
nucliadb_node_1_writer = nucliadbNodeWriter()
|
195
|
-
nucliadb_node_1_sidecar = nucliadbNodeSidecar()
|
196
|
-
|
197
|
-
nucliadb_node_2_reader = nucliadbNodeReader()
|
198
|
-
nucliadb_node_2_writer = nucliadbNodeWriter()
|
199
|
-
nucliadb_node_2_sidecar = nucliadbNodeSidecar()
|
200
|
-
|
201
|
-
|
202
|
-
@dataclasses.dataclass
|
203
|
-
class NodeS3Storage:
|
204
|
-
server: str
|
205
|
-
|
206
|
-
def envs(self):
|
207
|
-
return {
|
208
|
-
"FILE_BACKEND": "s3",
|
209
|
-
"S3_CLIENT_ID": "",
|
210
|
-
"S3_CLIENT_SECRET": "",
|
211
|
-
"S3_BUCKET": "test",
|
212
|
-
"S3_INDEXING_BUCKET": "indexing",
|
213
|
-
"S3_DEADLETTER_BUCKET": "deadletter",
|
214
|
-
"S3_ENDPOINT": self.server,
|
215
|
-
}
|
216
|
-
|
217
|
-
|
218
|
-
@dataclasses.dataclass
|
219
|
-
class NodeGCSStorage:
|
220
|
-
server: str
|
221
|
-
|
222
|
-
def envs(self):
|
223
|
-
return {
|
224
|
-
"FILE_BACKEND": "gcs",
|
225
|
-
"GCS_BUCKET": "test",
|
226
|
-
"GCS_INDEXING_BUCKET": "indexing",
|
227
|
-
"GCS_DEADLETTER_BUCKET": "deadletter",
|
228
|
-
"GCS_ENDPOINT_URL": self.server,
|
229
|
-
}
|
230
|
-
|
231
|
-
|
232
|
-
NodeStorage = Union[NodeGCSStorage, NodeS3Storage]
|
233
|
-
|
234
|
-
|
235
|
-
class _NodeRunner:
|
236
|
-
def __init__(self, natsd, storage: NodeStorage):
|
237
|
-
self.docker_client = docker.from_env(version=BaseImage.docker_version)
|
238
|
-
self.natsd = natsd
|
239
|
-
self.storage = storage
|
240
|
-
self.data = {} # type: ignore
|
241
|
-
|
242
|
-
def start(self):
|
243
|
-
docker_platform_name = self.docker_client.api.version()["Platform"][
|
244
|
-
"Name"
|
245
|
-
].upper()
|
246
|
-
if "GITHUB_ACTION" not in os.environ and (
|
247
|
-
"DESKTOP" in docker_platform_name
|
248
|
-
# newer versions use community
|
249
|
-
or "DOCKER ENGINE - COMMUNITY" == docker_platform_name
|
250
|
-
):
|
251
|
-
# Valid when using Docker desktop
|
252
|
-
docker_internal_host = "host.docker.internal"
|
253
|
-
else:
|
254
|
-
# Valid when using github actions
|
255
|
-
docker_internal_host = "172.17.0.1"
|
256
|
-
|
257
|
-
self.volume_node_1 = self.docker_client.volumes.create(driver="local")
|
258
|
-
self.volume_node_2 = self.docker_client.volumes.create(driver="local")
|
259
|
-
|
260
|
-
writer1_host, writer1_port = nucliadb_node_1_writer.run(self.volume_node_1)
|
261
|
-
writer2_host, writer2_port = nucliadb_node_2_writer.run(self.volume_node_2)
|
262
|
-
|
263
|
-
reader1_host, reader1_port = nucliadb_node_1_reader.run(self.volume_node_1)
|
264
|
-
reader2_host, reader2_port = nucliadb_node_2_reader.run(self.volume_node_2)
|
265
|
-
|
266
|
-
natsd_server = self.natsd.replace("localhost", docker_internal_host)
|
267
|
-
images.settings["nucliadb_node_sidecar"]["env"].update(
|
268
|
-
{
|
269
|
-
"INDEX_JETSTREAM_SERVERS": f'["{natsd_server}"]',
|
270
|
-
"CACHE_PUBSUB_NATS_URL": f'["{natsd_server}"]',
|
271
|
-
"READER_LISTEN_ADDRESS": f"{docker_internal_host}:{reader1_port}",
|
272
|
-
"WRITER_LISTEN_ADDRESS": f"{docker_internal_host}:{writer1_port}",
|
273
|
-
}
|
274
|
-
)
|
275
|
-
self.storage.server = self.storage.server.replace(
|
276
|
-
"localhost", docker_internal_host
|
277
|
-
)
|
278
|
-
images.settings["nucliadb_node_sidecar"]["env"].update(self.storage.envs())
|
279
|
-
|
280
|
-
sidecar1_host, sidecar1_port = nucliadb_node_1_sidecar.run(self.volume_node_1)
|
281
|
-
|
282
|
-
images.settings["nucliadb_node_sidecar"]["env"][
|
283
|
-
"READER_LISTEN_ADDRESS"
|
284
|
-
] = f"{docker_internal_host}:{reader2_port}"
|
285
|
-
images.settings["nucliadb_node_sidecar"]["env"][
|
286
|
-
"WRITER_LISTEN_ADDRESS"
|
287
|
-
] = f"{docker_internal_host}:{writer2_port}"
|
288
|
-
|
289
|
-
sidecar2_host, sidecar2_port = nucliadb_node_2_sidecar.run(self.volume_node_2)
|
290
|
-
|
291
|
-
writer1_internal_host = get_container_host(nucliadb_node_1_writer.container_obj)
|
292
|
-
writer2_internal_host = get_container_host(nucliadb_node_2_writer.container_obj)
|
293
|
-
|
294
|
-
self.data.update(
|
295
|
-
{
|
296
|
-
"writer1_internal_host": writer1_internal_host,
|
297
|
-
"writer2_internal_host": writer2_internal_host,
|
298
|
-
"writer1": {
|
299
|
-
"host": writer1_host,
|
300
|
-
"port": writer1_port,
|
301
|
-
},
|
302
|
-
"writer2": {
|
303
|
-
"host": writer2_host,
|
304
|
-
"port": writer2_port,
|
305
|
-
},
|
306
|
-
"reader1": {
|
307
|
-
"host": reader1_host,
|
308
|
-
"port": reader1_port,
|
309
|
-
},
|
310
|
-
"reader2": {
|
311
|
-
"host": reader2_host,
|
312
|
-
"port": reader2_port,
|
313
|
-
},
|
314
|
-
"sidecar1": {
|
315
|
-
"host": sidecar1_host,
|
316
|
-
"port": sidecar1_port,
|
317
|
-
},
|
318
|
-
"sidecar2": {
|
319
|
-
"host": sidecar2_host,
|
320
|
-
"port": sidecar2_port,
|
321
|
-
},
|
322
|
-
}
|
323
|
-
)
|
324
|
-
return self.data
|
325
|
-
|
326
|
-
def stop(self):
|
327
|
-
container_ids = []
|
328
|
-
for component in [
|
329
|
-
nucliadb_node_1_reader,
|
330
|
-
nucliadb_node_1_writer,
|
331
|
-
nucliadb_node_1_sidecar,
|
332
|
-
nucliadb_node_2_writer,
|
333
|
-
nucliadb_node_2_reader,
|
334
|
-
nucliadb_node_2_sidecar,
|
335
|
-
]:
|
336
|
-
container_obj = getattr(component, "container_obj", None)
|
337
|
-
if container_obj:
|
338
|
-
container_ids.append(container_obj.id)
|
339
|
-
component.stop()
|
340
|
-
|
341
|
-
for container_id in container_ids:
|
342
|
-
for _ in range(5):
|
343
|
-
try:
|
344
|
-
self.docker_client.containers.get(container_id) # type: ignore
|
345
|
-
except docker.errors.NotFound:
|
346
|
-
break
|
347
|
-
time.sleep(2)
|
348
|
-
|
349
|
-
self.volume_node_1.remove()
|
350
|
-
self.volume_node_2.remove()
|
351
|
-
|
352
|
-
def setup_env(self):
|
353
|
-
# reset on every test run in case something touches it
|
354
|
-
cluster_settings.writer_port_map = {
|
355
|
-
self.data["writer1_internal_host"]: self.data["writer1"]["port"],
|
356
|
-
self.data["writer2_internal_host"]: self.data["writer2"]["port"],
|
357
|
-
}
|
358
|
-
cluster_settings.reader_port_map = {
|
359
|
-
self.data["writer1_internal_host"]: self.data["reader1"]["port"],
|
360
|
-
self.data["writer2_internal_host"]: self.data["reader2"]["port"],
|
361
|
-
}
|
362
|
-
|
363
|
-
cluster_settings.node_writer_port = None # type: ignore
|
364
|
-
cluster_settings.node_reader_port = None # type: ignore
|
365
|
-
|
366
|
-
cluster_settings.cluster_discovery_mode = "manual"
|
367
|
-
cluster_settings.cluster_discovery_manual_addresses = [
|
368
|
-
self.data["writer1_internal_host"],
|
369
|
-
self.data["writer2_internal_host"],
|
370
|
-
]
|
371
|
-
|
372
|
-
|
373
|
-
@pytest.fixture(scope="session")
|
374
|
-
def gcs_node_storage(gcs):
|
375
|
-
return NodeGCSStorage(server=gcs)
|
376
|
-
|
377
|
-
|
378
|
-
@pytest.fixture(scope="session")
|
379
|
-
def s3_node_storage(s3):
|
380
|
-
return NodeS3Storage(server=s3)
|
381
|
-
|
382
|
-
|
383
|
-
def lazy_load_storage_backend():
|
384
|
-
backend = get_testing_storage_backend()
|
385
|
-
if backend == "gcs":
|
386
|
-
return [lazy_fixture.lf("gcs_node_storage")]
|
387
|
-
elif backend == "s3":
|
388
|
-
return [lazy_fixture.lf("s3_node_storage")]
|
389
|
-
else:
|
390
|
-
print(f"Unknown storage backend {backend}, using gcs")
|
391
|
-
return [lazy_fixture.lf("gcs_node_storage")]
|
392
|
-
|
393
|
-
|
394
|
-
@pytest.fixture(scope="session", params=lazy_load_storage_backend())
|
395
|
-
def node_storage(request):
|
396
|
-
return request.param
|
397
|
-
|
398
|
-
|
399
|
-
@pytest.fixture(scope="session", autouse=False)
|
400
|
-
def _node(natsd: str, node_storage):
|
401
|
-
nr = _NodeRunner(natsd, node_storage)
|
402
|
-
try:
|
403
|
-
cluster_info = nr.start()
|
404
|
-
except Exception:
|
405
|
-
nr.stop()
|
406
|
-
raise
|
407
|
-
nr.setup_env()
|
408
|
-
yield cluster_info
|
409
|
-
nr.stop()
|
410
|
-
|
411
|
-
|
412
|
-
@pytest.fixture(scope="function")
|
413
|
-
def node(_node, request):
|
414
|
-
# clean up all shard data before each test
|
415
|
-
channel1 = insecure_channel(
|
416
|
-
f"{_node['writer1']['host']}:{_node['writer1']['port']}"
|
417
|
-
)
|
418
|
-
channel2 = insecure_channel(
|
419
|
-
f"{_node['writer2']['host']}:{_node['writer2']['port']}"
|
420
|
-
)
|
421
|
-
writer1 = NodeWriterStub(channel1)
|
422
|
-
writer2 = NodeWriterStub(channel2)
|
423
|
-
|
424
|
-
logger.debug("cleaning up shards data")
|
425
|
-
try:
|
426
|
-
cleanup_node(writer1)
|
427
|
-
cleanup_node(writer2)
|
428
|
-
except Exception:
|
429
|
-
logger.error(
|
430
|
-
"Error cleaning up shards data. Maybe the node fixture could not start properly?",
|
431
|
-
exc_info=True,
|
432
|
-
)
|
433
|
-
|
434
|
-
client = docker.client.from_env()
|
435
|
-
containers_by_port = {}
|
436
|
-
for container in client.containers.list():
|
437
|
-
name = container.name
|
438
|
-
command = container.attrs["Config"]["Cmd"]
|
439
|
-
ports = container.ports
|
440
|
-
print(f"container {name} executing {command} is using ports: {ports}")
|
441
|
-
|
442
|
-
for internal_port in container.ports:
|
443
|
-
for host in container.ports[internal_port]:
|
444
|
-
port = host["HostPort"]
|
445
|
-
port_containers = containers_by_port.setdefault(port, [])
|
446
|
-
if container not in port_containers:
|
447
|
-
port_containers.append(container)
|
448
|
-
|
449
|
-
for port, containers in containers_by_port.items():
|
450
|
-
if len(containers) > 1:
|
451
|
-
names = ", ".join([container.name for container in containers])
|
452
|
-
print(f"ATENTION! Containers {names} share port {port}!")
|
453
|
-
raise
|
454
|
-
finally:
|
455
|
-
channel1.close()
|
456
|
-
channel2.close()
|
457
|
-
|
458
|
-
yield _node
|
459
|
-
|
460
|
-
|
461
|
-
@backoff.on_exception(
|
462
|
-
backoff.expo, Exception, jitter=backoff.random_jitter, max_tries=5
|
463
|
-
)
|
464
|
-
def cleanup_node(writer: NodeWriterStub):
|
465
|
-
for shard in writer.ListShards(EmptyQuery()).ids:
|
466
|
-
writer.DeleteShard(ShardId(id=shard.id))
|
@@ -1,18 +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/>.
|
@@ -1,19 +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
|
-
#
|
@@ -1,19 +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
|
-
#
|
@@ -1,19 +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
|
-
#
|
@@ -1,98 +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
|
-
from unittest import mock
|
21
|
-
from unittest.mock import Mock
|
22
|
-
|
23
|
-
import pytest
|
24
|
-
from starlette.requests import Request
|
25
|
-
|
26
|
-
from nucliadb.models.responses import HTTPClientError
|
27
|
-
from nucliadb.search import predict
|
28
|
-
from nucliadb.search.api.v1.resource.chat import resource_chat_endpoint
|
29
|
-
from nucliadb_utils.exceptions import LimitsExceededError
|
30
|
-
|
31
|
-
pytestmark = pytest.mark.asyncio
|
32
|
-
|
33
|
-
|
34
|
-
class DummyTestRequest(Request):
|
35
|
-
@property
|
36
|
-
def auth(self):
|
37
|
-
return Mock(scopes=["READER"])
|
38
|
-
|
39
|
-
@property
|
40
|
-
def user(self):
|
41
|
-
return Mock(display_name="username")
|
42
|
-
|
43
|
-
|
44
|
-
@pytest.fixture(scope="function")
|
45
|
-
def create_chat_response_mock():
|
46
|
-
with mock.patch(
|
47
|
-
"nucliadb.search.api.v1.resource.chat.create_chat_response",
|
48
|
-
) as mocked:
|
49
|
-
yield mocked
|
50
|
-
|
51
|
-
|
52
|
-
@pytest.mark.parametrize(
|
53
|
-
"predict_error,http_error_response",
|
54
|
-
[
|
55
|
-
(
|
56
|
-
LimitsExceededError(402, "over the quota"),
|
57
|
-
HTTPClientError(status_code=402, detail="over the quota"),
|
58
|
-
),
|
59
|
-
(
|
60
|
-
predict.RephraseError("foobar"),
|
61
|
-
HTTPClientError(
|
62
|
-
status_code=529,
|
63
|
-
detail="Temporary error while rephrasing the query. Please try again later. Error: foobar",
|
64
|
-
),
|
65
|
-
),
|
66
|
-
(
|
67
|
-
predict.RephraseMissingContextError(),
|
68
|
-
HTTPClientError(
|
69
|
-
status_code=412,
|
70
|
-
detail="Unable to rephrase the query with the provided context.",
|
71
|
-
),
|
72
|
-
),
|
73
|
-
],
|
74
|
-
)
|
75
|
-
async def test_resource_chat_endpoint_handles_errors(
|
76
|
-
create_chat_response_mock, predict_error, http_error_response
|
77
|
-
):
|
78
|
-
create_chat_response_mock.side_effect = predict_error
|
79
|
-
request = DummyTestRequest(
|
80
|
-
scope={
|
81
|
-
"type": "http",
|
82
|
-
"http_version": "1.1",
|
83
|
-
"method": "GET",
|
84
|
-
"headers": [],
|
85
|
-
}
|
86
|
-
)
|
87
|
-
response = await resource_chat_endpoint(
|
88
|
-
request=request,
|
89
|
-
kbid="kbid",
|
90
|
-
item=Mock(),
|
91
|
-
x_ndb_client=None,
|
92
|
-
x_nucliadb_user="",
|
93
|
-
x_forwarded_for="",
|
94
|
-
x_synchronous=True,
|
95
|
-
resource_id="rid",
|
96
|
-
)
|
97
|
-
assert response.status_code == http_error_response.status_code
|
98
|
-
assert response.body == http_error_response.body
|