-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* E2E: add (or expand) `config`/`init`/`add`/`rename` command tests (#878) * KamuCliApiServerHarnessOptions::with_kamu_config(): introduce * E2E: cover "kamu config" command * E2E, test_init_in_an_existing_workspace(): add * E2E, test_config_set_value(): respect potential CI agent podman configuration * Updated yanked crate: futures-channel * E2E, test_config_get_with_default(): respect potential CI agent podman configuration * kamu-cli-e2e-common: extract "player-scores" & "leaderboard" datasets into statics * assert_cmd: add patch * E2E, test_add_dataset_from_stdin(): add * E2E, test_add_dataset_from_stdin(): add * AddCommand::validate_args(): fix "name" arg processing * E2E, test_add_dataset_with_name(): mix add commands * E2E, test_add_dataset_with_replace(): add * Interact: fix if is_tty * CHANGELOG.md: update * E2E, test_delete_dataset(): add * E2E, test_delete_dataset_recursive(): add * E2E, test_delete_dataset_all(): add * E2E, test_rename_dataset(): add * assert_cmd: use patch (now from the kamu-data org) * kamu-cli-puppet: remove unused dep * Extracted to the separate PR * E2E: add (or expand) `ingest`/`inspect`/`log`/`new`/`reset`/`search`/etc command tests (#883) * E2E, ingest_data_to_player_scores_from_stdio(): add * clippy fixes * E2E, test_ingest_from_stdin(): also check data via the tail command * E2E, ingest_data_to_player_scores_from_stdio(): check data for all ingest steps * E2E, test_ingest_recursive(): add... a part of the test * E2E, test_ingest_with_source_name(): add * E2E, test_inspect_lineage(): add * IngestCommand: add a todo * DATASET_ROOT_PLAYER_SCORES_INGEST_DATA_NDJSON_CHUNK_{1,2,3}: stabilize tests * Rename: LineageCommand -> InspectLineageCommand * E2E: stabilize ingest command tests * KamuCliPuppetExt::list_blocks(): add * E2E, test_inspect_query(): add * E2E, test_inspect_schema(): add * kamu-cli, Login: fix a doc string typo * E2E, test_log(): add * E2E, test_new_{root,derivative}(): add * E2E, test_reset(): add * cli-reference.md: update * test_repo_alias_command -> test_repo_command * E2E, KamuApiServerClientExt::ingest_data(): add * E2E, test_search_multi_user(): add * E2E, test_search_by_name(): add * E2E, test_search_by_repo(): add * E2E, test_sql_command(): add * E2E, test_gc(): add * E2E, test_system_info(): add * E2E, test_system_diagnose(): add * CI: test fixes * assert_ingest_data_to_player_scores_from_stdio(): stabilize rows order * assert_ingest_data_to_player_scores_from_stdio(): stabilize rows order [2] * test_sql_command(): use the default name * assert_ingest_data_to_player_scores_from_stdio(): stabilize rows order [3] * CHANGELOG.md: update * CI: windows build fixes * E2E, test_tail(): add * assert_ingest_data_to_player_scores_from_stdio(): stabilize rows order [4] * assert_ingest_data_to_player_scores_from_stdio(): stabilize rows order [5] * pretty_assertions::assert_eq!(): expected first, actual after * Remove extra files * E2E: cover "kamu login" / "kamu logout" commands * `Push, pull, compact, verify` commands e2e tests (#893) * Add query commitments example * Release (patch) `0.204.5`: fix `--yes / -y` flag: fixed when working from a TTY (#881) * Interact: fix if is_tty * CHANGELOG.md: update * Release (patch): 0.204.5 * Updated yanked crate (futures-util to 0.3.31) * CI: Fixes `kamu-base-with-data-mt` image builds (#885) * Images, kamu-base-with-data-mt: add "kamu" to predefined users * Images, kamu-base-with-data-mt: init-workspace.py use .kamuconfig * CHANGELOG.md: update * Add push pull tests * Add s3 tests * Remove unused code * Test transform engine error * Revert check * Add container extra groups * Add verify and compact commands * Fix grammar * Fix review commets * Revert "Merge branch 'master' into chore/push-and-pul-command-e2e-tests" This reverts commit a4ec39c, reversing changes made to 1130fa5. * Clean code * Fix review comments. Iter 2 * Revert ToDo comment --------- Co-authored-by: Sergii Mikhtoniuk <[email protected]> Co-authored-by: Dima Pristupa <[email protected]> * E2E: add Outbox processing middleware (#901) * E2E, e2e_middleware_fn(): implement * kamu-adapter-http: hide E2E things behind the "e2e" feature gate * query_handler_post_v2(): fix a typo * kamu-cli: integrate the E2E middleware * CHANGELOG.md: update * Updates after rebasing * CHANGELOG.md: add missed commands * CHANGELOG.md: add a note about a "kamu add" fix * KamuCliPuppetExt::ingest_data(): simplify * E2E: activate new tests for SQLite * E2E: activate new tests for PostgreSQL * E2E: remove "kamu config" tests for SQLite & PostgreSQL * E2E: test_smart_pull_derivative(): use the tail command + stabilization (#903) * E2E: test_smart_pull_derivative(): use the tail command * E2E: run postgres tests one by one * E2E: test_smart_pull_derivative(): stabilize order * E2E: wait_for_flows_to_finish(): increase takes count * E2E, test_ingest_command: stabilize order without the "match_time" changing * E2E, test_log_command: stabilize order without the "match_time" changing * E2E, test_sql_command: stabilize order without the "match_time" changing * E2E, test_tail_command: stabilize order without the "match_time" changing * E2E, test_dataset_trigger_flow(): stabilize order without the "match_time" changing * E2E, test_smart_transfer_protocol: stabilize order without the "match_time" changing * KamuCliPuppetExt: absorb helper methods (#906) * E2E, test_rest_api_request_dataset_tail(): use a const instead of a hardcoded value * E2E, test_verify_command: use a consts instead of hardcoded values * E2E: KamuApiServerClient::get_node_url(): absorb * CI: mark postgres as flaky but run with 8 threads * Tests: add flaky "risingwave" group * E2E, test_dataset_trigger_flow(): add "risingwave" test-group * CI: go not specify threads for postgres * E2E, KamuCliPuppetExt::assert_player_scores_dataset_data(): extract * E2E, KamuCliPuppetExt::assert_success_command_execution(): absorb * E2E, KamuCliPuppetExt::assert_failure_command_execution(): absorb * E2E, assert_ingest_data_to_player_scores_from_stdio(): use assert_success_command_execution_with_input() * KamuCliPuppetExt::assert_player_scores_dataset_data(): use assert_success_command_execution() * E2E, test_config_command: use new methods * E2E, test_inspect_command: use new methods * E2E, test_search_command: use new methods * E2E, test_sql_command: use new methods * E2E, test_tail_command: use new methods * E2E, test_system_api_server_gql_query: use new methods * E2E, test_add_command: use new methods * KamuCliPuppetExt: use iter for maybe_expected_stderr * E2E, test_compact_command: use new methods * E2E, test_delete_command: use new methods * E2E, test_ingest_command: use new methods * E2E, test_init_command: use new methods * E2E, test_login_command: use new methods * E2E, test_new_command: use new methods * E2E, test_rename_command: use new methods * E2E, test_reset_command: use new methods * E2E, test_smart_transfer_protocol: use new methods * E2E, test_system_gc_command: use new methods * E2E, test_verify_command: use new methods * E2E, test_workspace_svc: use new methods * KamuCliPuppetExt::assert_failure_command_execution_with_input(): implement --------- Co-authored-by: Roman Boiko <[email protected]> Co-authored-by: Sergii Mikhtoniuk <[email protected]>
- Loading branch information
1 parent
b84630a
commit 1ba2367
Showing
131 changed files
with
6,434 additions
and
285 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
// Copyright Kamu Data, Inc. and contributors. All rights reserved. | ||
// | ||
// Use of this software is governed by the Business Source License | ||
// included in the LICENSE file. | ||
// | ||
// As of the Change Date specified in that file, in accordance with | ||
// the Business Source License, use of this software will be governed | ||
// by the Apache License, Version 2.0. | ||
|
||
use axum::body::{Body, Bytes}; | ||
use axum::extract::Request; | ||
use axum::middleware::Next; | ||
use axum::response::Response; | ||
use http::Method; | ||
use http_common::ApiError; | ||
use serde::Deserialize; | ||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
|
||
/// Middleware that invokes Outbox messages processing for mutable requests | ||
pub async fn e2e_middleware_fn(request: Request, next: Next) -> Result<Response, ApiError> { | ||
let base_catalog = request | ||
.extensions() | ||
.get::<dill::Catalog>() | ||
.cloned() | ||
.expect("Catalog not found in http server extensions"); | ||
|
||
let (is_mutable_request, request) = analyze_request_for_mutability(request).await?; | ||
let response = next.run(request).await; | ||
|
||
if is_mutable_request && response.status().is_success() { | ||
let outbox_executor = base_catalog | ||
.get_one::<messaging_outbox::OutboxExecutor>() | ||
.unwrap(); | ||
|
||
outbox_executor.run_while_has_tasks().await?; | ||
} | ||
|
||
Ok(response) | ||
} | ||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
|
||
async fn analyze_request_for_mutability(request: Request) -> Result<(bool, Request), ApiError> { | ||
{ | ||
let is_not_modifying_requests = request.method() != Method::POST; | ||
|
||
if is_not_modifying_requests { | ||
return Ok((false, request)); | ||
} | ||
} | ||
{ | ||
let is_rest_api_post_request = request.uri().path() != "/graphql"; | ||
|
||
if is_rest_api_post_request { | ||
return Ok((true, request)); | ||
} | ||
} | ||
{ | ||
// In the case of GQL, we check whether the query is mutable or not | ||
let (request_parts, request_body) = request.into_parts(); | ||
let buffered_request_body = buffer_request_body(request_body).await?; | ||
|
||
let is_mutating_gql = if let Ok(body) = std::str::from_utf8(&buffered_request_body) { | ||
let gql_request = serde_json::from_str::<SimplifiedGqlRequest>(body) | ||
.map_err(ApiError::bad_request)?; | ||
|
||
gql_request.query.starts_with("mutation") | ||
} else { | ||
false | ||
}; | ||
|
||
let request = Request::from_parts(request_parts, Body::from(buffered_request_body)); | ||
|
||
Ok((is_mutating_gql, request)) | ||
} | ||
} | ||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
|
||
async fn buffer_request_body<B>(request_body: B) -> Result<Bytes, ApiError> | ||
where | ||
B: axum::body::HttpBody<Data = Bytes>, | ||
B::Error: std::error::Error + Send + Sync + 'static, | ||
{ | ||
use http_body_util::BodyExt; | ||
|
||
let body_bytes = match request_body.collect().await { | ||
Ok(collected) => collected.to_bytes(), | ||
Err(e) => { | ||
return Err(ApiError::bad_request(e)); | ||
} | ||
}; | ||
|
||
Ok(body_bytes) | ||
} | ||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||
|
||
#[derive(Debug, Deserialize)] | ||
struct SimplifiedGqlRequest { | ||
query: String, | ||
} | ||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.