From f468f8788842c5652f33726bf44b138c8154ed99 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Wed, 28 Jun 2023 11:10:28 +0200 Subject: [PATCH 01/29] remove rinkeby as defualt payment platform --- core/payment/src/api/allocations.rs | 3 +-- core/payment/src/lib.rs | 2 -- core/payment/src/models/agreement.rs | 3 +-- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/core/payment/src/api/allocations.rs b/core/payment/src/api/allocations.rs index c23064298a..70c254aec4 100644 --- a/core/payment/src/api/allocations.rs +++ b/core/payment/src/api/allocations.rs @@ -23,7 +23,6 @@ use crate::accounts::{init_account, Account}; use crate::dao::*; use crate::error::{DbError, Error}; use crate::utils::response; -use crate::DEFAULT_PAYMENT_PLATFORM; pub fn register_endpoints(scope: Scope) -> Scope { scope @@ -49,7 +48,7 @@ async fn create_allocation( let payment_platform = allocation .payment_platform .clone() - .unwrap_or_else(|| DEFAULT_PAYMENT_PLATFORM.to_string()); + .expect("payment platform not provided"); let address = allocation .address .clone() diff --git a/core/payment/src/lib.rs b/core/payment/src/lib.rs index e89262455e..1f116c209f 100644 --- a/core/payment/src/lib.rs +++ b/core/payment/src/lib.rs @@ -28,8 +28,6 @@ pub mod migrations { struct _Dummy; } -pub const DEFAULT_PAYMENT_PLATFORM: &str = "erc20-rinkeby-tglm"; - pub use ya_core_model::payment::local::DEFAULT_PAYMENT_DRIVER; lazy_static::lazy_static! { diff --git a/core/payment/src/models/agreement.rs b/core/payment/src/models/agreement.rs index ace1faa2d2..a570c0555e 100644 --- a/core/payment/src/models/agreement.rs +++ b/core/payment/src/models/agreement.rs @@ -1,5 +1,4 @@ use crate::schema::pay_agreement; -use crate::DEFAULT_PAYMENT_PLATFORM; use serde_json::Value; use ya_agreement_utils::agreement::{expand, TypedPointer}; use ya_client_model::market::Agreement; @@ -39,7 +38,7 @@ impl WriteObj { let payment_platform = demand_properties .pointer("/golem/com/payment/chosen-platform") .as_typed(Value::as_str) - .unwrap_or(DEFAULT_PAYMENT_PLATFORM) + .expect("/golem/com/payment/chosen-platform not provided") .to_owned(); let payee_addr = offer_properties .pointer(format!("/golem/com/payment/platform/{}/address", payment_platform).as_str()) From 0b60956c25afd6dd5b548e7ea54f85600c4ca09f Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:45:40 +0200 Subject: [PATCH 02/29] better expect message --- core/payment/src/models/agreement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/payment/src/models/agreement.rs b/core/payment/src/models/agreement.rs index a570c0555e..426e49f250 100644 --- a/core/payment/src/models/agreement.rs +++ b/core/payment/src/models/agreement.rs @@ -38,7 +38,7 @@ impl WriteObj { let payment_platform = demand_properties .pointer("/golem/com/payment/chosen-platform") .as_typed(Value::as_str) - .expect("/golem/com/payment/chosen-platform not provided") + .expect("Offer property golem.com.payment.chosen-platform does not exist") .to_owned(); let payee_addr = offer_properties .pointer(format!("/golem/com/payment/platform/{}/address", payment_platform).as_str()) From 9f25480ec7e25d9a3c30569df6fdfc4e5b2b70a9 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:24:15 +0200 Subject: [PATCH 03/29] add unit tests --- core/payment/src/models/agreement.rs | 58 ++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/core/payment/src/models/agreement.rs b/core/payment/src/models/agreement.rs index 426e49f250..c2c7f6ead7 100644 --- a/core/payment/src/models/agreement.rs +++ b/core/payment/src/models/agreement.rs @@ -69,3 +69,61 @@ impl WriteObj { } pub type ReadObj = WriteObj; + +#[cfg(test)] +mod tests { + use std::ops::Add; + use chrono::{Duration, Utc}; + use serde_json::json; + use ya_client_model::market::{Agreement, Demand, Offer}; + use ya_client_model::market::agreement::State; + use ya_persistence::types::Role; + use crate::models::agreement::WriteObj; + + fn mock_agreement_with_demand_properties(properties: serde_json::Value) -> Agreement { + let demand = Demand::new( + properties, + "()".to_string(), + "demand_id".to_string(), + Default::default(), + Default::default() + ); + + let offer = Offer::new( + json!({}), + "()".to_string(), + "offer_id".to_string(), + Default::default(), + Default::default() + ); + + Agreement::new( + "agreement_id".to_string(), + demand, + offer, + Utc::now().add(Duration::days(1)), + State::Proposal, + Utc::now(), + ) + } + + #[test] + #[should_panic(expected = "Offer property golem.com.payment.chosen-platform does not exist")] + fn cannot_create_agreement_without_chosen_platform() { + let agreement = mock_agreement_with_demand_properties(json!({})); + let role: Role = Role::Provider; + + WriteObj::new(agreement, role); + } + + #[test] + fn create_agreement_with_valid_chosen_platform() { + let agreement = mock_agreement_with_demand_properties(json!({ + "golem.com.payment.chosen-platform": "test-network" + })); + let role: Role = Role::Provider; + + let result = WriteObj::new(agreement, role); + assert_eq!(result.payment_platform, "test-network"); + } +} \ No newline at end of file From 23194ed89b16da60632cbba0b094fdc72790b7b3 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Fri, 30 Jun 2023 17:19:18 +0200 Subject: [PATCH 04/29] formatting --- core/payment/src/models/agreement.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/payment/src/models/agreement.rs b/core/payment/src/models/agreement.rs index c2c7f6ead7..0dd1167b57 100644 --- a/core/payment/src/models/agreement.rs +++ b/core/payment/src/models/agreement.rs @@ -72,13 +72,13 @@ pub type ReadObj = WriteObj; #[cfg(test)] mod tests { - use std::ops::Add; + use crate::models::agreement::WriteObj; use chrono::{Duration, Utc}; use serde_json::json; - use ya_client_model::market::{Agreement, Demand, Offer}; + use std::ops::Add; use ya_client_model::market::agreement::State; + use ya_client_model::market::{Agreement, Demand, Offer}; use ya_persistence::types::Role; - use crate::models::agreement::WriteObj; fn mock_agreement_with_demand_properties(properties: serde_json::Value) -> Agreement { let demand = Demand::new( @@ -86,7 +86,7 @@ mod tests { "()".to_string(), "demand_id".to_string(), Default::default(), - Default::default() + Default::default(), ); let offer = Offer::new( @@ -94,7 +94,7 @@ mod tests { "()".to_string(), "offer_id".to_string(), Default::default(), - Default::default() + Default::default(), ); Agreement::new( @@ -119,11 +119,11 @@ mod tests { #[test] fn create_agreement_with_valid_chosen_platform() { let agreement = mock_agreement_with_demand_properties(json!({ - "golem.com.payment.chosen-platform": "test-network" - })); + "golem.com.payment.chosen-platform": "test-network" + })); let role: Role = Role::Provider; let result = WriteObj::new(agreement, role); assert_eq!(result.payment_platform, "test-network"); } -} \ No newline at end of file +} From ca0426f23ced4e4a5a428158c24c9a539091f274 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Tue, 4 Jul 2023 10:35:54 +0200 Subject: [PATCH 05/29] try updated goth --- goth_tests/pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index 9e094dbb4f..28553ffc3f 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -21,9 +21,9 @@ python = "^3.8.0" pytest = "^6.2" pytest-asyncio = "^0.20.2" pytest-rerunfailures = "^10.3" -goth = "^0.15.0" +# goth = "^0.15.0" # to use development goth version uncomment below -# goth = { git = "https://github.com/golemfactory/goth.git", rev = "d2951a62e2a7cf0712f7f4a66c4a080777841611" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "55a87a7c44b6d6af3c3856243169d301b00d7f56" } [tool.poetry.dev-dependencies] black = "^20.8b1" From 9d036419c4fff33916faa8696fda864ce2330f5c Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Tue, 4 Jul 2023 12:42:21 +0200 Subject: [PATCH 06/29] fix error message --- core/payment/src/models/agreement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/payment/src/models/agreement.rs b/core/payment/src/models/agreement.rs index 0dd1167b57..9091e563fb 100644 --- a/core/payment/src/models/agreement.rs +++ b/core/payment/src/models/agreement.rs @@ -38,7 +38,7 @@ impl WriteObj { let payment_platform = demand_properties .pointer("/golem/com/payment/chosen-platform") .as_typed(Value::as_str) - .expect("Offer property golem.com.payment.chosen-platform does not exist") + .expect("Demand property golem.com.payment.chosen-platform does not exist") .to_owned(); let payee_addr = offer_properties .pointer(format!("/golem/com/payment/platform/{}/address", payment_platform).as_str()) From c524a08e4a2a1e498208201d8fdf4ec199d025f2 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Tue, 4 Jul 2023 17:20:47 +0200 Subject: [PATCH 07/29] demand validation --- .../negotiator/builtin/demand_validation.rs | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 agent/provider/src/market/negotiator/builtin/demand_validation.rs diff --git a/agent/provider/src/market/negotiator/builtin/demand_validation.rs b/agent/provider/src/market/negotiator/builtin/demand_validation.rs new file mode 100644 index 0000000000..f1f45bbda6 --- /dev/null +++ b/agent/provider/src/market/negotiator/builtin/demand_validation.rs @@ -0,0 +1,63 @@ +use ya_agreement_utils::OfferDefinition; + +use crate::market::negotiator::factory::{ValidationNegotiatorConfig}; +use crate::market::negotiator::{ + AgreementResult, NegotiationResult, NegotiatorComponent, ProposalView, +}; + +/// Negotiator that verifies that all required fields are present in proposal. +pub struct DemandValidation { + required_fields: Vec, +} + +impl DemandValidation { + pub fn new(config: &ValidationNegotiatorConfig) -> DemandValidation { + DemandValidation { + required_fields: config.required_fields.iter().map(|x| x.to_string()).collect(), + } + } +} + +impl NegotiatorComponent for DemandValidation { + fn negotiate_step( + &mut self, + demand: &ProposalView, + offer: ProposalView, + ) -> anyhow::Result { + let missing_fields = self.required_fields.iter().cloned().filter(|x| !demand.pointer(x).is_some()).collect::>(); + if missing_fields.len()==0 { + Ok(NegotiationResult::Ready { offer }) + } else { + log::info!( + "'ValidationNegotiator' negotiator: Reject proposal [{}] due to missing fields: {}", + demand.id, + missing_fields.join(",") + ); + Ok(NegotiationResult::Reject { + message: format!( + "Missing fields: {}", missing_fields.join(",") + ), + is_final: false, + }) + } + } + + fn fill_template( + &mut self, + offer_template: OfferDefinition, + ) -> anyhow::Result { + Ok(offer_template) + } + + fn on_agreement_terminated( + &mut self, + _agreement_id: &str, + _result: &AgreementResult, + ) -> anyhow::Result<()> { + Ok(()) + } + + fn on_agreement_approved(&mut self, _agreement_id: &str) -> anyhow::Result<()> { + Ok(()) + } +} From 0636672387c26c663255131db3a5206587b55a4f Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Tue, 4 Jul 2023 17:24:56 +0200 Subject: [PATCH 08/29] demand validation --- agent/provider/src/market/negotiator/builtin.rs | 1 + agent/provider/src/market/negotiator/composite.rs | 5 +++++ agent/provider/src/market/negotiator/factory.rs | 10 ++++++++++ 3 files changed, 16 insertions(+) diff --git a/agent/provider/src/market/negotiator/builtin.rs b/agent/provider/src/market/negotiator/builtin.rs index 94bbc43de3..0161d55ee5 100644 --- a/agent/provider/src/market/negotiator/builtin.rs +++ b/agent/provider/src/market/negotiator/builtin.rs @@ -3,6 +3,7 @@ pub mod manifest; pub mod max_agreements; pub mod note_interval; pub mod payment_timeout; +pub mod demand_validation; pub use expiration::LimitExpiration; pub use manifest::ManifestSignature; diff --git a/agent/provider/src/market/negotiator/composite.rs b/agent/provider/src/market/negotiator/composite.rs index abaca3df12..872e3f5621 100644 --- a/agent/provider/src/market/negotiator/composite.rs +++ b/agent/provider/src/market/negotiator/composite.rs @@ -18,6 +18,7 @@ use crate::market::negotiator::common::{ }; use crate::market::negotiator::factory::CompositeNegotiatorConfig; use crate::market::negotiator::{NegotiatorComponent, ProposalView}; +use crate::market::negotiator::builtin::demand_validation::DemandValidation; use crate::market::ProviderMarket; use crate::provider_agent::AgentNegotiatorsConfig; @@ -33,6 +34,10 @@ impl CompositeNegotiator { agent_negotiators_cfg: AgentNegotiatorsConfig, ) -> anyhow::Result { let components = NegotiatorsPack::default() + .add_component( + "Validation", + Box::new(DemandValidation::new(&config.validation_config)) + ) .add_component( "LimitAgreements", Box::new(MaxAgreements::new(&config.limit_agreements_config)), diff --git a/agent/provider/src/market/negotiator/factory.rs b/agent/provider/src/market/negotiator/factory.rs index 1ef6bca669..8a7de7740e 100644 --- a/agent/provider/src/market/negotiator/factory.rs +++ b/agent/provider/src/market/negotiator/factory.rs @@ -11,6 +11,14 @@ use crate::market::negotiator::{AcceptAllNegotiator, CompositeNegotiator}; use crate::market::ProviderMarket; use crate::provider_agent::AgentNegotiatorsConfig; +/// Configuration for Validation Negotiator. +#[derive(StructOpt, Clone, Debug)] +pub struct ValidationNegotiatorConfig { + // #[structopt(long, default_values_t = vec!["golem.com.payment.chosen-platform"])] + #[structopt(long, default_value = "golem.com.payment.chosen-platform")] + pub required_fields: Vec, +} + /// Configuration for LimitAgreements Negotiator. #[derive(StructOpt, Clone, Debug)] pub struct LimitAgreementsNegotiatorConfig { @@ -58,6 +66,8 @@ pub struct PaymentTimeoutConfig { /// Configuration for LimitAgreements Negotiator. #[derive(StructOpt, Clone, Debug)] pub struct CompositeNegotiatorConfig { + #[structopt(flatten)] + pub validation_config: ValidationNegotiatorConfig, #[structopt(flatten)] pub limit_agreements_config: LimitAgreementsNegotiatorConfig, #[structopt(flatten)] From d172ba7f201ec85e9c8920cf8f38d928a89c3325 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Tue, 4 Jul 2023 17:34:12 +0200 Subject: [PATCH 09/29] fmt --- .../provider/src/market/negotiator/builtin.rs | 2 +- .../negotiator/builtin/demand_validation.rs | 21 ++++++++++++------- .../src/market/negotiator/composite.rs | 4 ++-- .../provider/src/market/negotiator/factory.rs | 1 - 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/agent/provider/src/market/negotiator/builtin.rs b/agent/provider/src/market/negotiator/builtin.rs index 0161d55ee5..4487e15f98 100644 --- a/agent/provider/src/market/negotiator/builtin.rs +++ b/agent/provider/src/market/negotiator/builtin.rs @@ -1,9 +1,9 @@ +pub mod demand_validation; pub mod expiration; pub mod manifest; pub mod max_agreements; pub mod note_interval; pub mod payment_timeout; -pub mod demand_validation; pub use expiration::LimitExpiration; pub use manifest::ManifestSignature; diff --git a/agent/provider/src/market/negotiator/builtin/demand_validation.rs b/agent/provider/src/market/negotiator/builtin/demand_validation.rs index f1f45bbda6..ff9a47cf90 100644 --- a/agent/provider/src/market/negotiator/builtin/demand_validation.rs +++ b/agent/provider/src/market/negotiator/builtin/demand_validation.rs @@ -1,6 +1,6 @@ use ya_agreement_utils::OfferDefinition; -use crate::market::negotiator::factory::{ValidationNegotiatorConfig}; +use crate::market::negotiator::factory::ValidationNegotiatorConfig; use crate::market::negotiator::{ AgreementResult, NegotiationResult, NegotiatorComponent, ProposalView, }; @@ -13,7 +13,11 @@ pub struct DemandValidation { impl DemandValidation { pub fn new(config: &ValidationNegotiatorConfig) -> DemandValidation { DemandValidation { - required_fields: config.required_fields.iter().map(|x| x.to_string()).collect(), + required_fields: config + .required_fields + .iter() + .map(|x| x.to_string()) + .collect(), } } } @@ -24,8 +28,13 @@ impl NegotiatorComponent for DemandValidation { demand: &ProposalView, offer: ProposalView, ) -> anyhow::Result { - let missing_fields = self.required_fields.iter().cloned().filter(|x| !demand.pointer(x).is_some()).collect::>(); - if missing_fields.len()==0 { + let missing_fields = self + .required_fields + .iter() + .cloned() + .filter(|x| !demand.pointer(x).is_some()) + .collect::>(); + if missing_fields.len() == 0 { Ok(NegotiationResult::Ready { offer }) } else { log::info!( @@ -34,9 +43,7 @@ impl NegotiatorComponent for DemandValidation { missing_fields.join(",") ); Ok(NegotiationResult::Reject { - message: format!( - "Missing fields: {}", missing_fields.join(",") - ), + message: format!("Missing fields: {}", missing_fields.join(",")), is_final: false, }) } diff --git a/agent/provider/src/market/negotiator/composite.rs b/agent/provider/src/market/negotiator/composite.rs index 872e3f5621..92a3583cca 100644 --- a/agent/provider/src/market/negotiator/composite.rs +++ b/agent/provider/src/market/negotiator/composite.rs @@ -13,12 +13,12 @@ use super::builtin::{ }; use super::common::{offer_definition_to_offer, AgreementResponse, Negotiator, ProposalResponse}; use super::{NegotiationResult, NegotiatorsPack}; +use crate::market::negotiator::builtin::demand_validation::DemandValidation; use crate::market::negotiator::common::{ reason_with_extra, AgreementFinalized, CreateOffer, ReactToAgreement, ReactToProposal, }; use crate::market::negotiator::factory::CompositeNegotiatorConfig; use crate::market::negotiator::{NegotiatorComponent, ProposalView}; -use crate::market::negotiator::builtin::demand_validation::DemandValidation; use crate::market::ProviderMarket; use crate::provider_agent::AgentNegotiatorsConfig; @@ -36,7 +36,7 @@ impl CompositeNegotiator { let components = NegotiatorsPack::default() .add_component( "Validation", - Box::new(DemandValidation::new(&config.validation_config)) + Box::new(DemandValidation::new(&config.validation_config)), ) .add_component( "LimitAgreements", diff --git a/agent/provider/src/market/negotiator/factory.rs b/agent/provider/src/market/negotiator/factory.rs index 8a7de7740e..6c53f9d8be 100644 --- a/agent/provider/src/market/negotiator/factory.rs +++ b/agent/provider/src/market/negotiator/factory.rs @@ -14,7 +14,6 @@ use crate::provider_agent::AgentNegotiatorsConfig; /// Configuration for Validation Negotiator. #[derive(StructOpt, Clone, Debug)] pub struct ValidationNegotiatorConfig { - // #[structopt(long, default_values_t = vec!["golem.com.payment.chosen-platform"])] #[structopt(long, default_value = "golem.com.payment.chosen-platform")] pub required_fields: Vec, } From 237f90da3fff1dbcd482e5d63b8841a9a943b439 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Tue, 4 Jul 2023 17:37:21 +0200 Subject: [PATCH 10/29] naming --- .../src/market/negotiator/builtin/demand_validation.rs | 6 +++--- agent/provider/src/market/negotiator/factory.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/agent/provider/src/market/negotiator/builtin/demand_validation.rs b/agent/provider/src/market/negotiator/builtin/demand_validation.rs index ff9a47cf90..c6eeabede3 100644 --- a/agent/provider/src/market/negotiator/builtin/demand_validation.rs +++ b/agent/provider/src/market/negotiator/builtin/demand_validation.rs @@ -1,6 +1,6 @@ use ya_agreement_utils::OfferDefinition; -use crate::market::negotiator::factory::ValidationNegotiatorConfig; +use crate::market::negotiator::factory::DemandValidationNegotiatorConfig; use crate::market::negotiator::{ AgreementResult, NegotiationResult, NegotiatorComponent, ProposalView, }; @@ -11,7 +11,7 @@ pub struct DemandValidation { } impl DemandValidation { - pub fn new(config: &ValidationNegotiatorConfig) -> DemandValidation { + pub fn new(config: &DemandValidationNegotiatorConfig) -> DemandValidation { DemandValidation { required_fields: config .required_fields @@ -38,7 +38,7 @@ impl NegotiatorComponent for DemandValidation { Ok(NegotiationResult::Ready { offer }) } else { log::info!( - "'ValidationNegotiator' negotiator: Reject proposal [{}] due to missing fields: {}", + "'DemandValidation' negotiator: Reject proposal [{}] due to missing fields: {}", demand.id, missing_fields.join(",") ); diff --git a/agent/provider/src/market/negotiator/factory.rs b/agent/provider/src/market/negotiator/factory.rs index 6c53f9d8be..a951201a5a 100644 --- a/agent/provider/src/market/negotiator/factory.rs +++ b/agent/provider/src/market/negotiator/factory.rs @@ -13,7 +13,7 @@ use crate::provider_agent::AgentNegotiatorsConfig; /// Configuration for Validation Negotiator. #[derive(StructOpt, Clone, Debug)] -pub struct ValidationNegotiatorConfig { +pub struct DemandValidationNegotiatorConfig { #[structopt(long, default_value = "golem.com.payment.chosen-platform")] pub required_fields: Vec, } @@ -66,7 +66,7 @@ pub struct PaymentTimeoutConfig { #[derive(StructOpt, Clone, Debug)] pub struct CompositeNegotiatorConfig { #[structopt(flatten)] - pub validation_config: ValidationNegotiatorConfig, + pub validation_config: DemandValidationNegotiatorConfig, #[structopt(flatten)] pub limit_agreements_config: LimitAgreementsNegotiatorConfig, #[structopt(flatten)] From 421586654d1ed07f06507c33b247188072d66bbb Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Tue, 4 Jul 2023 17:54:31 +0200 Subject: [PATCH 11/29] linted --- .../src/market/negotiator/builtin/demand_validation.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/provider/src/market/negotiator/builtin/demand_validation.rs b/agent/provider/src/market/negotiator/builtin/demand_validation.rs index c6eeabede3..bca733804f 100644 --- a/agent/provider/src/market/negotiator/builtin/demand_validation.rs +++ b/agent/provider/src/market/negotiator/builtin/demand_validation.rs @@ -32,9 +32,9 @@ impl NegotiatorComponent for DemandValidation { .required_fields .iter() .cloned() - .filter(|x| !demand.pointer(x).is_some()) + .filter(|x| demand.pointer(x).is_none()) .collect::>(); - if missing_fields.len() == 0 { + if missing_fields.is_empty() { Ok(NegotiationResult::Ready { offer }) } else { log::info!( From 57786ac140b4eef6fe1912b3e7332da0ed008eeb Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Wed, 5 Jul 2023 10:00:08 +0200 Subject: [PATCH 12/29] fix tests and typos --- agent/provider/src/market/negotiator/factory.rs | 2 +- core/payment/src/models/agreement.rs | 2 +- goth_tests/pyproject.toml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/agent/provider/src/market/negotiator/factory.rs b/agent/provider/src/market/negotiator/factory.rs index a951201a5a..d9d7ffa721 100644 --- a/agent/provider/src/market/negotiator/factory.rs +++ b/agent/provider/src/market/negotiator/factory.rs @@ -11,7 +11,7 @@ use crate::market::negotiator::{AcceptAllNegotiator, CompositeNegotiator}; use crate::market::ProviderMarket; use crate::provider_agent::AgentNegotiatorsConfig; -/// Configuration for Validation Negotiator. +/// Configuration for Demand Validation Negotiator. #[derive(StructOpt, Clone, Debug)] pub struct DemandValidationNegotiatorConfig { #[structopt(long, default_value = "golem.com.payment.chosen-platform")] diff --git a/core/payment/src/models/agreement.rs b/core/payment/src/models/agreement.rs index 9091e563fb..39759ed0e3 100644 --- a/core/payment/src/models/agreement.rs +++ b/core/payment/src/models/agreement.rs @@ -108,7 +108,7 @@ mod tests { } #[test] - #[should_panic(expected = "Offer property golem.com.payment.chosen-platform does not exist")] + #[should_panic(expected = "Demand property golem.com.payment.chosen-platform does not exist")] fn cannot_create_agreement_without_chosen_platform() { let agreement = mock_agreement_with_demand_properties(json!({})); let role: Role = Role::Provider; diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index 167ad52043..897ba64f88 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -21,10 +21,10 @@ python = "^3.8.0" pytest = "^6.2" pytest-asyncio = "^0.20.2" pytest-rerunfailures = "^10.3" -# goth = "^0.15.0" pytest-split = "^0.8.1" +goth = "^0.15.0" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "55a87a7c44b6d6af3c3856243169d301b00d7f56" } +# goth = { git = "https://github.com/golemfactory/goth.git", rev =gi "d2951a62e2a7cf0712f7f4a66c4a080777841611" } [tool.poetry.dev-dependencies] black = "^20.8b1" From 4f8c6bc741e95ad80f6ec4349bb1b1798400639b Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Wed, 5 Jul 2023 12:58:53 +0200 Subject: [PATCH 13/29] unit tests --- .../negotiator/builtin/demand_validation.rs | 111 ++++++++++++++++++ .../provider/src/market/negotiator/factory.rs | 2 +- 2 files changed, 112 insertions(+), 1 deletion(-) diff --git a/agent/provider/src/market/negotiator/builtin/demand_validation.rs b/agent/provider/src/market/negotiator/builtin/demand_validation.rs index bca733804f..84dae9e473 100644 --- a/agent/provider/src/market/negotiator/builtin/demand_validation.rs +++ b/agent/provider/src/market/negotiator/builtin/demand_validation.rs @@ -68,3 +68,114 @@ impl NegotiatorComponent for DemandValidation { Ok(()) } } + +#[cfg(test)] +mod test_demand_validation_negotiator { + use super::*; + use chrono::Utc; + use serde_json::json; + use ya_agreement_utils::agreement::expand; + use ya_agreement_utils::{InfNodeInfo, NodeInfo, OfferTemplate, ServiceInfo}; + use ya_client_model::market::proposal::State; + + fn config() -> DemandValidationNegotiatorConfig { + DemandValidationNegotiatorConfig { + required_fields: vec![ + "/golem/com/freebies".to_string(), + "/golem/com/payment/address".to_string(), + ], + } + } + + fn properties_to_proposal(value: serde_json::Value) -> ProposalView { + ProposalView { + content: OfferTemplate { + properties: expand(value), + constraints: "()".to_string(), + }, + id: "proposalId".to_string(), + issuer: Default::default(), + state: State::Initial, + timestamp: Utc::now(), + } + } + + fn example_offer() -> OfferDefinition { + OfferDefinition { + node_info: NodeInfo::with_name("nodeInfoName"), + srv_info: ServiceInfo::new(InfNodeInfo::default(), serde_json::Value::Null), + com_info: Default::default(), + offer: OfferTemplate::default(), + } + } + + trait ToProposal { + fn to_proposal(self) -> ProposalView; + } + + impl ToProposal for OfferDefinition { + fn to_proposal(self) -> ProposalView { + let template = self.into_template(); + ProposalView { + content: OfferTemplate { + properties: expand(template.properties), + constraints: template.constraints, + }, + id: "proposalId".to_string(), + issuer: Default::default(), + state: State::Initial, + timestamp: Utc::now(), + } + } + } + + /// Negotiator accepts demand if all of the required fields exist + #[test] + fn test_required_fields_exist() { + let config = config(); + let mut negotiator = DemandValidation::new(&config); + + let offer_proposal = negotiator + .fill_template(example_offer()) + .unwrap() + .to_proposal(); + + let demand = properties_to_proposal(json!({ + "golem.com.freebies": "mug", + "golem.com.payment.address": "0x123", + })); + + let expected_result = NegotiationResult::Ready { + offer: offer_proposal.clone(), + }; + assert_eq!( + negotiator.negotiate_step(&demand, offer_proposal).unwrap(), + expected_result + ); + } + + /// Negotiator rejects demand if some of the required fields are missing + #[test] + fn test_required_fields_missing() { + let config = config(); + let mut negotiator = DemandValidation::new(&config); + + let offer_proposal = negotiator + .fill_template(example_offer()) + .unwrap() + .to_proposal(); + + let demand = properties_to_proposal(json!({ + "golem.com.freebies": "mug", + })); + + let expected_result = NegotiationResult::Reject { + message: "Missing fields: /golem/com/payment/address".to_string(), + is_final: false, + }; + assert_eq!( + negotiator.negotiate_step(&demand, offer_proposal).unwrap(), + expected_result + ); + } +} diff --git a/agent/provider/src/market/negotiator/factory.rs b/agent/provider/src/market/negotiator/factory.rs index d9d7ffa721..9a900877ed 100644 --- a/agent/provider/src/market/negotiator/factory.rs +++ b/agent/provider/src/market/negotiator/factory.rs @@ -14,7 +14,7 @@ use crate::provider_agent::AgentNegotiatorsConfig; /// Configuration for Demand Validation Negotiator. #[derive(StructOpt, Clone, Debug)] pub struct DemandValidationNegotiatorConfig { - #[structopt(long, default_value = "golem.com.payment.chosen-platform")] + #[structopt(long, default_value = "/golem/com/payment/chosen-platform")] pub required_fields: Vec, } From 9a558f0cceb1bc8b7fcc95041fbfcb939e7fa8aa Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Wed, 5 Jul 2023 13:30:56 +0200 Subject: [PATCH 14/29] test with modified goth --- goth_tests/pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index 897ba64f88..abfac8b778 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -22,9 +22,9 @@ pytest = "^6.2" pytest-asyncio = "^0.20.2" pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" -goth = "^0.15.0" +# goth = "^0.15.0" # to use development goth version uncomment below -# goth = { git = "https://github.com/golemfactory/goth.git", rev =gi "d2951a62e2a7cf0712f7f4a66c4a080777841611" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "55a87a7c44b6d6af3c3856243169d301b00d7f56" } [tool.poetry.dev-dependencies] black = "^20.8b1" From c6adf0347db4b7ba4a8e9c83f4b4c3156b1dce90 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Wed, 5 Jul 2023 16:16:19 +0200 Subject: [PATCH 15/29] logging tests --- goth_tests/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index abfac8b778..278c5b6940 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -24,7 +24,7 @@ pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" # goth = "^0.15.0" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "55a87a7c44b6d6af3c3856243169d301b00d7f56" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "3b04af14ff1c5d760a64a252cce8d3ad4e362a30" } [tool.poetry.dev-dependencies] black = "^20.8b1" From 3a4c05e3270c5ac138e2299de4fae8e9a8f25ab6 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Wed, 5 Jul 2023 17:01:55 +0200 Subject: [PATCH 16/29] fix goth tests --- goth_tests/helpers/negotiation.py | 1 + goth_tests/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/goth_tests/helpers/negotiation.py b/goth_tests/helpers/negotiation.py index dc464a7c39..6730c9a35c 100644 --- a/goth_tests/helpers/negotiation.py +++ b/goth_tests/helpers/negotiation.py @@ -36,6 +36,7 @@ def props_from_template(self, task_package: Optional[str]) -> "DemandBuilder": "golem.srv.comp.expiration": int( (datetime.now() + timedelta(minutes=10)).timestamp() * 1000 ), + "golem.com.payment.chosen-platform": self._requestor.payment_config.platform_string, } if task_package is not None: diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index 278c5b6940..5c88e02b5e 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -24,7 +24,7 @@ pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" # goth = "^0.15.0" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "3b04af14ff1c5d760a64a252cce8d3ad4e362a30" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "1bb0a8e730d1dbb029a6a14a7de286e6c1d438dc" } [tool.poetry.dev-dependencies] black = "^20.8b1" From 14255dc122c2ddc9adf7217f1ff3e7d205b8e912 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Thu, 6 Jul 2023 12:29:03 +0200 Subject: [PATCH 17/29] clean up tests --- .../negotiator/builtin/demand_validation.rs | 55 +++---------------- 1 file changed, 9 insertions(+), 46 deletions(-) diff --git a/agent/provider/src/market/negotiator/builtin/demand_validation.rs b/agent/provider/src/market/negotiator/builtin/demand_validation.rs index 84dae9e473..a35b1b86dc 100644 --- a/agent/provider/src/market/negotiator/builtin/demand_validation.rs +++ b/agent/provider/src/market/negotiator/builtin/demand_validation.rs @@ -70,12 +70,12 @@ impl NegotiatorComponent for DemandValidation { } #[cfg(test)] -mod test_demand_validation_negotiator { +mod tests { use super::*; use chrono::Utc; use serde_json::json; use ya_agreement_utils::agreement::expand; - use ya_agreement_utils::{InfNodeInfo, NodeInfo, OfferTemplate, ServiceInfo}; + use ya_agreement_utils::{OfferTemplate}; use ya_client_model::market::proposal::State; fn config() -> DemandValidationNegotiatorConfig { @@ -87,10 +87,10 @@ mod test_demand_validation_negotiator { } } - fn properties_to_proposal(value: serde_json::Value) -> ProposalView { + fn properties_to_proposal(properties: serde_json::Value) -> ProposalView { ProposalView { content: OfferTemplate { - properties: expand(value), + properties: expand(properties), constraints: "()".to_string(), }, id: "proposalId".to_string(), @@ -100,56 +100,23 @@ mod test_demand_validation_negotiator { } } - fn example_offer() -> OfferDefinition { - OfferDefinition { - node_info: NodeInfo::with_name("nodeInfoName"), - srv_info: ServiceInfo::new(InfNodeInfo::default(), serde_json::Value::Null), - com_info: Default::default(), - offer: OfferTemplate::default(), - } - } - - trait ToProposal { - fn to_proposal(self) -> ProposalView; - } - - impl ToProposal for OfferDefinition { - fn to_proposal(self) -> ProposalView { - let template = self.into_template(); - ProposalView { - content: OfferTemplate { - properties: expand(template.properties), - constraints: template.constraints, - }, - id: "proposalId".to_string(), - issuer: Default::default(), - state: State::Initial, - timestamp: Utc::now(), - } - } - } - /// Negotiator accepts demand if all of the required fields exist #[test] fn test_required_fields_exist() { let config = config(); let mut negotiator = DemandValidation::new(&config); - let offer_proposal = negotiator - .fill_template(example_offer()) - .unwrap() - .to_proposal(); - + let offer = properties_to_proposal(json!({})); let demand = properties_to_proposal(json!({ "golem.com.freebies": "mug", "golem.com.payment.address": "0x123", })); let expected_result = NegotiationResult::Ready { - offer: offer_proposal.clone(), + offer: offer.clone(), }; assert_eq!( - negotiator.negotiate_step(&demand, offer_proposal).unwrap(), + negotiator.negotiate_step(&demand, offer).unwrap(), expected_result ); } @@ -160,11 +127,7 @@ mod test_demand_validation_negotiator { let config = config(); let mut negotiator = DemandValidation::new(&config); - let offer_proposal = negotiator - .fill_template(example_offer()) - .unwrap() - .to_proposal(); - + let offer = properties_to_proposal(json!({})); let demand = properties_to_proposal(json!({ "golem.com.freebies": "mug", })); @@ -174,7 +137,7 @@ mod test_demand_validation_negotiator { is_final: false, }; assert_eq!( - negotiator.negotiate_step(&demand, offer_proposal).unwrap(), + negotiator.negotiate_step(&demand, offer).unwrap(), expected_result ); } From e835a7c7cddf63869033f59cfb8bf268103de62f Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Thu, 6 Jul 2023 12:35:48 +0200 Subject: [PATCH 18/29] format --- .../provider/src/market/negotiator/builtin/demand_validation.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/provider/src/market/negotiator/builtin/demand_validation.rs b/agent/provider/src/market/negotiator/builtin/demand_validation.rs index a35b1b86dc..fda2f1e994 100644 --- a/agent/provider/src/market/negotiator/builtin/demand_validation.rs +++ b/agent/provider/src/market/negotiator/builtin/demand_validation.rs @@ -75,7 +75,7 @@ mod tests { use chrono::Utc; use serde_json::json; use ya_agreement_utils::agreement::expand; - use ya_agreement_utils::{OfferTemplate}; + use ya_agreement_utils::OfferTemplate; use ya_client_model::market::proposal::State; fn config() -> DemandValidationNegotiatorConfig { From 780eaca09b36df685b228218fc9dc3719602fec1 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Thu, 6 Jul 2023 13:10:34 +0200 Subject: [PATCH 19/29] revert dependency on changes in goth --- goth_tests/pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index 5c88e02b5e..c7f18f0604 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -22,9 +22,9 @@ pytest = "^6.2" pytest-asyncio = "^0.20.2" pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" -# goth = "^0.15.0" +goth = "^0.15.0" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "1bb0a8e730d1dbb029a6a14a7de286e6c1d438dc" } +# goth = { git = "https://github.com/golemfactory/goth.git", rev = "d2951a62e2a7cf0712f7f4a66c4a080777841611" } [tool.poetry.dev-dependencies] black = "^20.8b1" From 4c71686a936f30b62d2b358606054601fbc080e0 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Thu, 6 Jul 2023 15:19:34 +0200 Subject: [PATCH 20/29] code review fixes --- .../market/negotiator/builtin/demand_validation.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/agent/provider/src/market/negotiator/builtin/demand_validation.rs b/agent/provider/src/market/negotiator/builtin/demand_validation.rs index fda2f1e994..6a68e0f797 100644 --- a/agent/provider/src/market/negotiator/builtin/demand_validation.rs +++ b/agent/provider/src/market/negotiator/builtin/demand_validation.rs @@ -12,13 +12,8 @@ pub struct DemandValidation { impl DemandValidation { pub fn new(config: &DemandValidationNegotiatorConfig) -> DemandValidation { - DemandValidation { - required_fields: config - .required_fields - .iter() - .map(|x| x.to_string()) - .collect(), - } + let required_fields = config.required_fields.clone(); + Self { required_fields } } } @@ -31,8 +26,8 @@ impl NegotiatorComponent for DemandValidation { let missing_fields = self .required_fields .iter() - .cloned() .filter(|x| demand.pointer(x).is_none()) + .cloned() .collect::>(); if missing_fields.is_empty() { Ok(NegotiationResult::Ready { offer }) From 3acbcdf1f74e1cec69e5423a465bfd5000534804 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Thu, 6 Jul 2023 17:43:13 +0200 Subject: [PATCH 21/29] if an unexpected error occurs then treat it us DbError --- core/payment/src/dao/agreement.rs | 2 +- core/payment/src/models/agreement.rs | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/core/payment/src/dao/agreement.rs b/core/payment/src/dao/agreement.rs index 404e4aafef..3c3172ad33 100644 --- a/core/payment/src/dao/agreement.rs +++ b/core/payment/src/dao/agreement.rs @@ -198,7 +198,7 @@ impl<'a> AgreementDao<'a> { return Ok(()); } - let agreement = WriteObj::new(agreement, role); + let agreement = WriteObj::new(agreement, role)?; diesel::insert_into(dsl::pay_agreement) .values(agreement) .execute(conn)?; diff --git a/core/payment/src/models/agreement.rs b/core/payment/src/models/agreement.rs index 39759ed0e3..bd71f4ebcb 100644 --- a/core/payment/src/models/agreement.rs +++ b/core/payment/src/models/agreement.rs @@ -1,3 +1,4 @@ +use crate::error::DbError; use crate::schema::pay_agreement; use serde_json::Value; use ya_agreement_utils::agreement::{expand, TypedPointer}; @@ -24,7 +25,7 @@ pub struct WriteObj { } impl WriteObj { - pub fn new(agreement: Agreement, role: Role) -> Self { + pub fn new(agreement: Agreement, role: Role) -> Result { let provider_id = *agreement.provider_id(); let requestor_id = *agreement.requestor_id(); let (owner_id, peer_id) = match &role { @@ -38,8 +39,8 @@ impl WriteObj { let payment_platform = demand_properties .pointer("/golem/com/payment/chosen-platform") .as_typed(Value::as_str) - .expect("Demand property golem.com.payment.chosen-platform does not exist") - .to_owned(); + .map(ToOwned::to_owned) + .map_err(|_| DbError::Query("Missing golem.com.payment.chosen-platform".to_string()))?; let payee_addr = offer_properties .pointer(format!("/golem/com/payment/platform/{}/address", payment_platform).as_str()) .as_typed(Value::as_str) @@ -51,7 +52,7 @@ impl WriteObj { .map(ToOwned::to_owned) .unwrap_or_else(|_| requestor_id.to_string().to_lowercase()); - Self { + Ok(Self { id: agreement.agreement_id, owner_id, role, @@ -64,7 +65,7 @@ impl WriteObj { total_amount_scheduled: Default::default(), total_amount_paid: Default::default(), app_session_id: agreement.app_session_id, - } + }) } } @@ -108,12 +109,12 @@ mod tests { } #[test] - #[should_panic(expected = "Demand property golem.com.payment.chosen-platform does not exist")] fn cannot_create_agreement_without_chosen_platform() { let agreement = mock_agreement_with_demand_properties(json!({})); let role: Role = Role::Provider; - WriteObj::new(agreement, role); + let result = WriteObj::new(agreement, role); + assert!(result.is_err()); } #[test] @@ -124,6 +125,6 @@ mod tests { let role: Role = Role::Provider; let result = WriteObj::new(agreement, role); - assert_eq!(result.payment_platform, "test-network"); + assert_eq!(result.unwrap().payment_platform, "test-network"); } } From 2ce0bd18fd4ac9a3628c05cf09fe65632715465c Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Thu, 6 Jul 2023 17:53:05 +0200 Subject: [PATCH 22/29] don't panic on missing payment-platform in create_allocation --- core/payment/src/api/allocations.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/payment/src/api/allocations.rs b/core/payment/src/api/allocations.rs index 70c254aec4..876251d9dc 100644 --- a/core/payment/src/api/allocations.rs +++ b/core/payment/src/api/allocations.rs @@ -45,10 +45,11 @@ async fn create_allocation( // TODO: Handle deposits & timeouts let allocation = body.into_inner(); let node_id = id.identity; - let payment_platform = allocation - .payment_platform - .clone() - .expect("payment platform not provided"); + let payment_platform = match &allocation.payment_platform { + Some(platform) => platform.clone(), + None => return response::bad_request(&"payment platform must be provided"), + }; + let address = allocation .address .clone() From 7b1c55883f6ce769a3ba62bf535c2861308b6fc7 Mon Sep 17 00:00:00 2001 From: staszek-krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Fri, 7 Jul 2023 09:26:50 +0200 Subject: [PATCH 23/29] Update core/payment/src/models/agreement.rs Co-authored-by: pwalski <4924911+pwalski@users.noreply.github.com> --- core/payment/src/models/agreement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/payment/src/models/agreement.rs b/core/payment/src/models/agreement.rs index bd71f4ebcb..eaa97289f9 100644 --- a/core/payment/src/models/agreement.rs +++ b/core/payment/src/models/agreement.rs @@ -124,7 +124,7 @@ mod tests { })); let role: Role = Role::Provider; - let result = WriteObj::new(agreement, role); + let result = WriteObj::try_new(agreement, role); assert_eq!(result.unwrap().payment_platform, "test-network"); } } From 7115ebe431699e2e17762128676b623fa0add357 Mon Sep 17 00:00:00 2001 From: staszek-krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Fri, 7 Jul 2023 09:26:59 +0200 Subject: [PATCH 24/29] Update core/payment/src/models/agreement.rs Co-authored-by: pwalski <4924911+pwalski@users.noreply.github.com> --- core/payment/src/models/agreement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/payment/src/models/agreement.rs b/core/payment/src/models/agreement.rs index eaa97289f9..cc7b922a45 100644 --- a/core/payment/src/models/agreement.rs +++ b/core/payment/src/models/agreement.rs @@ -113,7 +113,7 @@ mod tests { let agreement = mock_agreement_with_demand_properties(json!({})); let role: Role = Role::Provider; - let result = WriteObj::new(agreement, role); + let result = WriteObj::try_new(agreement, role); assert!(result.is_err()); } From 156bd4092b5aa5b5f11c41a2572d8ccff7bc1e5b Mon Sep 17 00:00:00 2001 From: staszek-krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Fri, 7 Jul 2023 09:27:19 +0200 Subject: [PATCH 25/29] Update core/payment/src/dao/agreement.rs Co-authored-by: pwalski <4924911+pwalski@users.noreply.github.com> --- core/payment/src/dao/agreement.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/payment/src/dao/agreement.rs b/core/payment/src/dao/agreement.rs index 3c3172ad33..7538937910 100644 --- a/core/payment/src/dao/agreement.rs +++ b/core/payment/src/dao/agreement.rs @@ -198,7 +198,8 @@ impl<'a> AgreementDao<'a> { return Ok(()); } - let agreement = WriteObj::new(agreement, role)?; + let agreement = WriteObj::try_new(agreement, role) + .map_err(|err| DbError::Query(err))?; diesel::insert_into(dsl::pay_agreement) .values(agreement) .execute(conn)?; From c5d557c114b7eab90393da8160d0293926b7405e Mon Sep 17 00:00:00 2001 From: staszek-krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Fri, 7 Jul 2023 09:27:55 +0200 Subject: [PATCH 26/29] Update core/payment/src/models/agreement.rs Co-authored-by: pwalski <4924911+pwalski@users.noreply.github.com> --- core/payment/src/models/agreement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/payment/src/models/agreement.rs b/core/payment/src/models/agreement.rs index cc7b922a45..28ef2ccc49 100644 --- a/core/payment/src/models/agreement.rs +++ b/core/payment/src/models/agreement.rs @@ -25,7 +25,7 @@ pub struct WriteObj { } impl WriteObj { - pub fn new(agreement: Agreement, role: Role) -> Result { + pub fn try_new(agreement: Agreement, role: Role) -> Result { let provider_id = *agreement.provider_id(); let requestor_id = *agreement.requestor_id(); let (owner_id, peer_id) = match &role { From baf8ba57c59b54c720a15f2257bd68c20bcb7a5a Mon Sep 17 00:00:00 2001 From: staszek-krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Fri, 7 Jul 2023 09:28:01 +0200 Subject: [PATCH 27/29] Update core/payment/src/models/agreement.rs Co-authored-by: pwalski <4924911+pwalski@users.noreply.github.com> --- core/payment/src/models/agreement.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/payment/src/models/agreement.rs b/core/payment/src/models/agreement.rs index 28ef2ccc49..a40f8847d4 100644 --- a/core/payment/src/models/agreement.rs +++ b/core/payment/src/models/agreement.rs @@ -40,7 +40,7 @@ impl WriteObj { .pointer("/golem/com/payment/chosen-platform") .as_typed(Value::as_str) .map(ToOwned::to_owned) - .map_err(|_| DbError::Query("Missing golem.com.payment.chosen-platform".to_string()))?; + .map_err(|_| "Missing golem.com.payment.chosen-platform".into())?; let payee_addr = offer_properties .pointer(format!("/golem/com/payment/platform/{}/address", payment_platform).as_str()) .as_typed(Value::as_str) From 18b9e375f80b2e2f3ebd90386c847384944d3f7f Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Fri, 7 Jul 2023 09:40:48 +0200 Subject: [PATCH 28/29] clippy and other fixes --- core/payment/src/dao/agreement.rs | 4 ++-- core/payment/src/models/agreement.rs | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/core/payment/src/dao/agreement.rs b/core/payment/src/dao/agreement.rs index 7538937910..03ebbf63f5 100644 --- a/core/payment/src/dao/agreement.rs +++ b/core/payment/src/dao/agreement.rs @@ -198,8 +198,8 @@ impl<'a> AgreementDao<'a> { return Ok(()); } - let agreement = WriteObj::try_new(agreement, role) - .map_err(|err| DbError::Query(err))?; + let agreement = + WriteObj::try_new(agreement, role).map_err(DbError::Query)?; diesel::insert_into(dsl::pay_agreement) .values(agreement) .execute(conn)?; diff --git a/core/payment/src/models/agreement.rs b/core/payment/src/models/agreement.rs index a40f8847d4..010b5beaec 100644 --- a/core/payment/src/models/agreement.rs +++ b/core/payment/src/models/agreement.rs @@ -1,4 +1,3 @@ -use crate::error::DbError; use crate::schema::pay_agreement; use serde_json::Value; use ya_agreement_utils::agreement::{expand, TypedPointer}; @@ -40,7 +39,7 @@ impl WriteObj { .pointer("/golem/com/payment/chosen-platform") .as_typed(Value::as_str) .map(ToOwned::to_owned) - .map_err(|_| "Missing golem.com.payment.chosen-platform".into())?; + .map_err(|_| "Missing golem.com.payment.chosen-platform".to_string())?; let payee_addr = offer_properties .pointer(format!("/golem/com/payment/platform/{}/address", payment_platform).as_str()) .as_typed(Value::as_str) From 05b78e786b7a603f1401633a76a0590ad91dc878 Mon Sep 17 00:00:00 2001 From: Staszek Krotki <16387248+staszek-krotki@users.noreply.github.com> Date: Fri, 7 Jul 2023 09:54:06 +0200 Subject: [PATCH 29/29] fmt --- core/payment/src/dao/agreement.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/payment/src/dao/agreement.rs b/core/payment/src/dao/agreement.rs index 03ebbf63f5..bea9b1c50c 100644 --- a/core/payment/src/dao/agreement.rs +++ b/core/payment/src/dao/agreement.rs @@ -198,8 +198,7 @@ impl<'a> AgreementDao<'a> { return Ok(()); } - let agreement = - WriteObj::try_new(agreement, role).map_err(DbError::Query)?; + let agreement = WriteObj::try_new(agreement, role).map_err(DbError::Query)?; diesel::insert_into(dsl::pay_agreement) .values(agreement) .execute(conn)?;