diff --git a/CHANGELOG.md b/CHANGELOG.md index 66fbd52263a..ef26bd0776f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ As a minor extension, we have adopted a slightly different versioning convention - Signer compute what to sign independently of the aggregator. +- Deprecate aggregator `/certificate-pending` route as the signer does not need it anymore. + - Crates versions: | Crate | Version | diff --git a/Cargo.lock b/Cargo.lock index 8b694bd3502..d58310f02fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.5.72" +version = "0.5.73" dependencies = [ "anyhow", "async-trait", @@ -3559,7 +3559,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.62" +version = "0.4.63" dependencies = [ "anyhow", "async-trait", @@ -3630,7 +3630,7 @@ dependencies = [ [[package]] name = "mithril-end-to-end" -version = "0.4.32" +version = "0.4.33" dependencies = [ "anyhow", "async-recursion", @@ -3703,7 +3703,7 @@ dependencies = [ [[package]] name = "mithril-signer" -version = "0.2.190" +version = "0.2.191" dependencies = [ "anyhow", "async-trait", diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 9cb07656cb8..9631a64e071 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.5.72" +version = "0.5.73" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-aggregator/src/message_adapters/to_certificate_pending_message.rs b/mithril-aggregator/src/message_adapters/to_certificate_pending_message.rs index adfe89748b8..b3c42e8b661 100644 --- a/mithril-aggregator/src/message_adapters/to_certificate_pending_message.rs +++ b/mithril-aggregator/src/message_adapters/to_certificate_pending_message.rs @@ -1,3 +1,4 @@ +#![allow(deprecated)] use mithril_common::entities::CardanoDbBeacon; use mithril_common::{ entities::{CertificatePending, SignedEntityType}, diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index 16ceac43137..5c41b8a1269 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.62" +version = "0.4.63" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/src/messages/certificate_pending.rs b/mithril-common/src/messages/certificate_pending.rs index 1d3c6cb6114..c9d217e3bfc 100644 --- a/mithril-common/src/messages/certificate_pending.rs +++ b/mithril-common/src/messages/certificate_pending.rs @@ -1,3 +1,4 @@ +#![allow(deprecated)] use serde::{Deserialize, Serialize}; use crate::entities::{CardanoDbBeacon, Epoch, ProtocolParameters, SignedEntityType}; @@ -5,6 +6,10 @@ use crate::messages::SignerMessagePart; /// Structure to transport [crate::entities::CertificatePending] data. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[deprecated( + since = "0.4.63", + note = "Exists only for backward-compatibility, will be removed in the future" +)] pub struct CertificatePendingMessage { /// Current Epoch pub epoch: Epoch, diff --git a/mithril-common/src/messages/mod.rs b/mithril-common/src/messages/mod.rs index 31a0f8ac1ac..7c0029f41a8 100644 --- a/mithril-common/src/messages/mod.rs +++ b/mithril-common/src/messages/mod.rs @@ -39,6 +39,7 @@ pub use certificate::CertificateMessage; pub use certificate_list::{ CertificateListItemMessage, CertificateListItemMessageMetadata, CertificateListMessage, }; +#[allow(deprecated)] pub use certificate_pending::CertificatePendingMessage; pub use epoch_settings::EpochSettingsMessage; pub use interface::*; diff --git a/mithril-common/src/test_utils/apispec.rs b/mithril-common/src/test_utils/apispec.rs index 67f86265ec4..842ed9f325b 100644 --- a/mithril-common/src/test_utils/apispec.rs +++ b/mithril-common/src/test_utils/apispec.rs @@ -333,7 +333,7 @@ mod tests { use super::*; use crate::entities; - use crate::messages::{CertificatePendingMessage, SignerMessagePart}; + use crate::messages::{AggregatorFeaturesMessage, SignerMessagePart}; use crate::test_utils::{fake_data, TempDir}; fn build_empty_response(status_code: u16) -> Response { @@ -420,9 +420,19 @@ components: #[test] fn test_validate_a_response_without_body() { - APISpec::from_file(&APISpec::get_default_spec_file()) + let file = get_temp_openapi_filename("validate_a_response_without_body", line!()); + let paths = r#" + /empty-route: + get: + responses: + "204": + description: no pending certificate available + "#; + write_minimal_open_api_file("1.0.0", &file, paths, ""); + + APISpec::from_file(file.to_str().unwrap()) .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/empty-route") .validate_request(&Null) .unwrap() .validate_response(&build_empty_response(204)) @@ -433,12 +443,12 @@ components: fn test_validate_ok_when_request_without_body_and_expects_response() { APISpec::from_file(&APISpec::get_default_spec_file()) .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/") .validate_request(&Null) .unwrap() .validate_response(&build_json_response( 200, - CertificatePendingMessage::dummy(), + AggregatorFeaturesMessage::dummy(), )) .unwrap(); } @@ -480,7 +490,7 @@ components: let mut api_spec = APISpec::from_file(&APISpec::get_default_spec_file()); let result = api_spec .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/") .validate_request(&Null) .unwrap() .validate_status(&response, &StatusCode::OK); @@ -505,7 +515,7 @@ components: APISpec::from_file(&APISpec::get_default_spec_file()) .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/") .validate_request(&Null) .unwrap() .validate_status(&response, &StatusCode::INTERNAL_SERVER_ERROR) @@ -532,13 +542,13 @@ components: let mut api_spec = APISpec::from_file(&APISpec::get_default_spec_file()); let result = api_spec .method(Method::OPTIONS.as_str()) - .path("/certificate-pending") + .path("/certificates") .validate_response(&build_response(200, b"abcdefgh")); assert!(result.is_err()); assert_eq!( result.err(), - Some("Unmatched path and method: /certificate-pending OPTIONS".to_string()) + Some("Unmatched path and method: /certificates OPTIONS".to_string()) ); } #[test] @@ -546,7 +556,7 @@ components: let mut api_spec = APISpec::from_file(&APISpec::get_default_spec_file()); let result = api_spec .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/certificates") .validate_response(&build_empty_response(200)); assert!(result.is_err()); @@ -588,7 +598,7 @@ components: let mut api_spec = APISpec::from_file(&APISpec::get_default_spec_file()); let result = api_spec .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/certificates") .validate_request(&Null) .unwrap() .validate_response(&build_response(200, b"not a json")); @@ -602,7 +612,7 @@ components: fn test_validate_returns_errors_when_route_exists_but_does_not_expect_request_body() { assert!(APISpec::from_file(&APISpec::get_default_spec_file()) .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/certificates") .validate_request(&fake_data::beacon()) .is_err()); } @@ -620,7 +630,7 @@ components: let mut api_spec = APISpec::from_file(&APISpec::get_default_spec_file()); let result = api_spec .method(Method::GET.as_str()) - .path("/certificate-pending") + .path("/certificates") .content_type("whatever") .validate_request(&Null) .unwrap() @@ -629,7 +639,7 @@ components: assert!(result.is_err()); assert_eq!( result.err().unwrap().to_string(), - "Expected content type 'whatever' but spec is '{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/CertificatePendingMessage\"}}}'", + "Expected content type 'whatever' but spec is '{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/CertificateListMessage\"}}}'", ); } @@ -707,10 +717,10 @@ components: APISpec::verify_conformity( APISpec::get_all_spec_files(), Method::GET.as_str(), - "/certificate-pending", + "/", "application/json", &Null, - &build_json_response(200, CertificatePendingMessage::dummy()), + &build_json_response(200, AggregatorFeaturesMessage::dummy()), &StatusCode::OK, ) .unwrap() @@ -718,13 +728,13 @@ components: #[test] fn test_verify_conformity_with_non_expected_status_returns_error() { - let response = build_json_response(200, CertificatePendingMessage::dummy()); + let response = build_json_response(200, AggregatorFeaturesMessage::dummy()); let spec_file = APISpec::get_default_spec_file(); let result = APISpec::verify_conformity( vec![spec_file.clone()], Method::GET.as_str(), - "/certificate-pending", + "/", "application/json", &Null, &response, @@ -737,7 +747,7 @@ components: StatusCode::OK.as_u16() ); let error_message = format!( - "OpenAPI invalid response in {spec_file} on route /certificate-pending, reason: {error_reason}\nresponse: {response:#?}" + "OpenAPI invalid response in {spec_file} on route /, reason: {error_reason}\nresponse: {response:#?}" ); assert!(result.is_err()); assert_eq!(result.err().unwrap().to_string(), error_message); @@ -748,10 +758,10 @@ components: let result = APISpec::verify_conformity( vec![], Method::GET.as_str(), - "/certificate-pending", + "/", "application/json", &Null, - &build_json_response(200, CertificatePendingMessage::dummy()), + &build_json_response(200, AggregatorFeaturesMessage::dummy()), &StatusCode::OK, ); diff --git a/mithril-signer/Cargo.toml b/mithril-signer/Cargo.toml index f15bcf5e109..856d03b0200 100644 --- a/mithril-signer/Cargo.toml +++ b/mithril-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-signer" -version = "0.2.190" +version = "0.2.191" description = "A Mithril Signer" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-signer/src/lib.rs b/mithril-signer/src/lib.rs index c5df36df3b3..3cb8dbe58d5 100644 --- a/mithril-signer/src/lib.rs +++ b/mithril-signer/src/lib.rs @@ -18,9 +18,7 @@ pub mod store; pub use configuration::{Configuration, DefaultConfiguration}; pub use entities::SignerEpochSettings; -pub use message_adapters::{ - FromEpochSettingsAdapter, FromPendingCertificateMessageAdapter, ToRegisterSignerMessageAdapter, -}; +pub use message_adapters::{FromEpochSettingsAdapter, ToRegisterSignerMessageAdapter}; pub use metrics::*; pub use runtime::*; diff --git a/mithril-signer/src/message_adapters/from_pending_certificate_message.rs b/mithril-signer/src/message_adapters/from_pending_certificate_message.rs deleted file mode 100644 index a9aecf62fae..00000000000 --- a/mithril-signer/src/message_adapters/from_pending_certificate_message.rs +++ /dev/null @@ -1,44 +0,0 @@ -#![allow(deprecated)] - -use mithril_common::{ - entities::CertificatePending, - messages::{CertificatePendingMessage, TryFromMessageAdapter}, - StdResult, -}; - -/// Adapter to turn [CertificatePendingMessage] instances into [CertificatePending]. -pub struct FromPendingCertificateMessageAdapter; - -impl TryFromMessageAdapter - for FromPendingCertificateMessageAdapter -{ - /// Adapter method - fn try_adapt(message: CertificatePendingMessage) -> StdResult { - let certificate = CertificatePending { - epoch: message.epoch, - signed_entity_type: message.signed_entity_type, - protocol_parameters: message.protocol_parameters, - next_protocol_parameters: message.next_protocol_parameters, - // This field is deprecated and should not be used by the Mithril signer. - signers: vec![], - // This field is deprecated and should not be used by the Mithril signer. - next_signers: vec![], - }; - - Ok(certificate) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn adapt_ok() { - let message = CertificatePendingMessage::dummy(); - let epoch = message.epoch; - let certificate_pending = FromPendingCertificateMessageAdapter::try_adapt(message).unwrap(); - - assert_eq!(epoch, certificate_pending.epoch); - } -} diff --git a/mithril-signer/src/message_adapters/mod.rs b/mithril-signer/src/message_adapters/mod.rs index e504c593ba4..e3abab283dc 100644 --- a/mithril-signer/src/message_adapters/mod.rs +++ b/mithril-signer/src/message_adapters/mod.rs @@ -1,9 +1,7 @@ mod from_epoch_settings; -mod from_pending_certificate_message; mod to_register_signature_message; mod to_register_signer_message; pub use from_epoch_settings::FromEpochSettingsAdapter; -pub use from_pending_certificate_message::FromPendingCertificateMessageAdapter; pub use to_register_signature_message::ToRegisterSignatureMessageAdapter; pub use to_register_signer_message::ToRegisterSignerMessageAdapter; diff --git a/mithril-signer/src/services/aggregator_client.rs b/mithril-signer/src/services/aggregator_client.rs index 631d39158a6..3d88c2b1f75 100644 --- a/mithril-signer/src/services/aggregator_client.rs +++ b/mithril-signer/src/services/aggregator_client.rs @@ -7,20 +7,16 @@ use thiserror::Error; use mithril_common::{ api_version::APIVersionProvider, - entities::{ - CertificatePending, Epoch, ProtocolMessage, SignedEntityType, Signer, SingleSignatures, - }, + entities::{Epoch, ProtocolMessage, SignedEntityType, Signer, SingleSignatures}, messages::{ - AggregatorFeaturesMessage, CertificatePendingMessage, EpochSettingsMessage, - TryFromMessageAdapter, TryToMessageAdapter, + AggregatorFeaturesMessage, EpochSettingsMessage, TryFromMessageAdapter, TryToMessageAdapter, }, StdError, MITHRIL_API_VERSION_HEADER, MITHRIL_SIGNER_VERSION_HEADER, }; use crate::entities::SignerEpochSettings; use crate::message_adapters::{ - FromEpochSettingsAdapter, FromPendingCertificateMessageAdapter, - ToRegisterSignatureMessageAdapter, ToRegisterSignerMessageAdapter, + FromEpochSettingsAdapter, ToRegisterSignatureMessageAdapter, ToRegisterSignerMessageAdapter, }; /// Error structure for the Aggregator Client. @@ -80,11 +76,6 @@ pub trait AggregatorClient: Sync + Send { &self, ) -> Result, AggregatorClientError>; - /// Retrieves a pending certificate from the aggregator - async fn retrieve_pending_certificate( - &self, - ) -> Result, AggregatorClientError>; - /// Registers signer with the aggregator. async fn register_signer( &self, @@ -214,36 +205,6 @@ impl AggregatorClient for AggregatorHTTPClient { } } - async fn retrieve_pending_certificate( - &self, - ) -> Result, AggregatorClientError> { - debug!("Retrieve pending certificate"); - let url = format!("{}/certificate-pending", self.aggregator_endpoint); - let response = self - .prepare_request_builder(self.prepare_http_client()?.get(url.clone())) - .send() - .await; - - match response { - Ok(response) => match response.status() { - StatusCode::OK => match response.json::().await { - Ok(message) => Ok(Some( - FromPendingCertificateMessageAdapter::try_adapt(message) - .map_err(|err| AggregatorClientError::JsonParseFailed(anyhow!(err)))?, - )), - Err(err) => Err(AggregatorClientError::JsonParseFailed(anyhow!(err))), - }, - StatusCode::PRECONDITION_FAILED => Err(self.handle_api_error(&response)), - StatusCode::NO_CONTENT => Ok(None), - _ => Err(AggregatorClientError::RemoteServerTechnical(anyhow!( - "{}", - response.text().await.unwrap_or_default() - ))), - }, - Err(err) => Err(AggregatorClientError::RemoteServerUnreachable(anyhow!(err))), - } - } - async fn register_signer( &self, epoch: Epoch, @@ -344,16 +305,15 @@ impl AggregatorClient for AggregatorHTTPClient { #[cfg(test)] pub(crate) mod dumb { - use super::*; - use mithril_common::test_utils::fake_data; use tokio::sync::RwLock; + use super::*; + /// This aggregator client is intended to be used by test services. /// It actually does not communicate with an aggregator host but mimics this behavior. - /// It is driven by a Tester that controls the CertificatePending it can return and it can return its internal state for testing. + /// It is driven by a Tester that controls the data it can return, and it can return its internal state for testing. pub struct DumbAggregatorClient { epoch_settings: RwLock>, - certificate_pending: RwLock>, last_registered_signer: RwLock>, aggregator_features: RwLock, } @@ -363,7 +323,6 @@ pub(crate) mod dumb { pub fn new() -> Self { Self { epoch_settings: RwLock::new(None), - certificate_pending: RwLock::new(None), last_registered_signer: RwLock::new(None), aggregator_features: RwLock::new(AggregatorFeaturesMessage::dummy()), } @@ -375,18 +334,6 @@ pub(crate) mod dumb { *epoch_settings_writer = epoch_settings; } - /// this method pilots the certificate pending handler - /// calling this method unsets the last registered signer - pub async fn set_certificate_pending( - &self, - certificate_pending: Option, - ) { - let mut cert = self.certificate_pending.write().await; - *cert = certificate_pending; - let mut signer = self.last_registered_signer.write().await; - *signer = None; - } - /// Return the last signer that called with the `register` method. pub async fn get_last_registered_signer(&self) -> Option { self.last_registered_signer.read().await.clone() @@ -405,7 +352,6 @@ pub(crate) mod dumb { fn default() -> Self { Self { epoch_settings: RwLock::new(Some(SignerEpochSettings::dummy())), - certificate_pending: RwLock::new(Some(fake_data::certificate_pending())), last_registered_signer: RwLock::new(None), aggregator_features: RwLock::new(AggregatorFeaturesMessage::dummy()), } @@ -422,14 +368,6 @@ pub(crate) mod dumb { Ok(epoch_settings) } - async fn retrieve_pending_certificate( - &self, - ) -> Result, AggregatorClientError> { - let cert = self.certificate_pending.read().await.clone(); - - Ok(cert) - } - /// Registers signer with the aggregator async fn register_signer( &self, @@ -682,118 +620,6 @@ mod tests { ); } - #[tokio::test] - async fn test_certificate_pending_ok_200() { - let (server, config, api_version_provider) = setup_test(); - let pending_certificate_expected = CertificatePendingMessage::dummy(); - let _snapshots_mock = server.mock(|when, then| { - when.path("/certificate-pending"); - then.status(200) - .body(json!(pending_certificate_expected).to_string()); - }); - let certificate_handler = AggregatorHTTPClient::new( - config.aggregator_endpoint, - config.relay_endpoint, - Arc::new(api_version_provider), - None, - ); - let pending_certificate = certificate_handler.retrieve_pending_certificate().await; - pending_certificate.as_ref().expect("unexpected error"); - - assert_eq!( - FromPendingCertificateMessageAdapter::try_adapt(pending_certificate_expected).unwrap(), - pending_certificate.unwrap().unwrap() - ); - } - - #[tokio::test] - async fn test_certificate_pending_ko_412() { - let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { - when.path("/certificate-pending"); - then.status(412) - .header(MITHRIL_API_VERSION_HEADER, "0.0.999"); - }); - let certificate_handler = AggregatorHTTPClient::new( - config.aggregator_endpoint, - config.relay_endpoint, - Arc::new(api_version_provider), - None, - ); - let error = certificate_handler - .retrieve_pending_certificate() - .await - .unwrap_err(); - - assert!(error.is_api_version_mismatch()); - } - - #[tokio::test] - async fn test_certificate_pending_ok_204() { - let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { - when.path("/certificate-pending"); - then.status(204); - }); - let certificate_handler = AggregatorHTTPClient::new( - config.aggregator_endpoint, - config.relay_endpoint, - Arc::new(api_version_provider), - None, - ); - let pending_certificate = certificate_handler.retrieve_pending_certificate().await; - assert!(pending_certificate.expect("unexpected error").is_none()); - } - - #[tokio::test] - async fn test_certificate_pending_ko_500() { - let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { - when.path("/certificate-pending"); - then.status(500).body("an error occurred"); - }); - let certificate_handler = AggregatorHTTPClient::new( - config.aggregator_endpoint, - config.relay_endpoint, - Arc::new(api_version_provider), - None, - ); - - match certificate_handler - .retrieve_pending_certificate() - .await - .unwrap_err() - { - AggregatorClientError::RemoteServerTechnical(_) => (), - e => panic!("Expected Aggregator::RemoteServerTechnical error, got '{e:?}'."), - }; - } - - #[tokio::test] - async fn test_pending_certificate_timeout() { - let (server, config, api_version_provider) = setup_test(); - let _snapshots_mock = server.mock(|when, then| { - when.path("/certificate-pending"); - then.delay(Duration::from_millis(200)); - }); - let certificate_handler = AggregatorHTTPClient::new( - config.aggregator_endpoint, - config.relay_endpoint, - Arc::new(api_version_provider), - Some(Duration::from_millis(50)), - ); - - let error = certificate_handler - .retrieve_pending_certificate() - .await - .expect_err("retrieve_pending_certificate should fail"); - - assert!( - matches!(error, AggregatorClientError::RemoteServerUnreachable(_)), - "unexpected error type: {error:?}" - ); - } - #[tokio::test] async fn test_register_signer_ok_201() { let epoch = Epoch(1); diff --git a/mithril-signer/tests/test_extensions/certificate_handler.rs b/mithril-signer/tests/test_extensions/certificate_handler.rs index f92962e8f61..862e93d324f 100644 --- a/mithril-signer/tests/test_extensions/certificate_handler.rs +++ b/mithril-signer/tests/test_extensions/certificate_handler.rs @@ -6,9 +6,8 @@ use tokio::sync::RwLock; use mithril_common::{ entities::{ - CardanoTransactionsSigningConfig, CertificatePending, Epoch, ProtocolMessage, - SignedEntityConfig, SignedEntityType, SignedEntityTypeDiscriminants, Signer, - SingleSignatures, TimePoint, + CardanoTransactionsSigningConfig, Epoch, ProtocolMessage, SignedEntityConfig, + SignedEntityType, SignedEntityTypeDiscriminants, Signer, SingleSignatures, TimePoint, }, messages::AggregatorFeaturesMessage, test_utils::fake_data, @@ -24,7 +23,6 @@ pub struct FakeAggregator { signed_entity_config: RwLock, registered_signers: RwLock>>, ticker_service: Arc, - current_certificate_pending_signed_entity: RwLock, withhold_epoch_settings: RwLock, } @@ -37,9 +35,6 @@ impl FakeAggregator { signed_entity_config: RwLock::new(signed_entity_config), registered_signers: RwLock::new(HashMap::new()), ticker_service, - current_certificate_pending_signed_entity: RwLock::new( - SignedEntityTypeDiscriminants::CardanoImmutableFilesFull, - ), withhold_epoch_settings: RwLock::new(true), } } @@ -135,32 +130,6 @@ impl AggregatorClient for FakeAggregator { } } - async fn retrieve_pending_certificate( - &self, - ) -> Result, AggregatorClientError> { - let store = self.registered_signers.read().await; - - if store.is_empty() { - return Ok(None); - } - - let current_signed_entity = *self.current_certificate_pending_signed_entity.read().await; - let signed_entity_config = self.signed_entity_config.read().await; - let time_point = self.get_time_point().await?; - let mut certificate_pending = CertificatePending { - epoch: time_point.epoch, - signed_entity_type: signed_entity_config - .time_point_to_signed_entity(current_signed_entity, &time_point) - .unwrap(), - ..fake_data::certificate_pending() - }; - - certificate_pending.signers = self.get_current_signers(&store).await?; - certificate_pending.next_signers = self.get_next_signers(&store).await?; - - Ok(Some(certificate_pending)) - } - /// Registers signer with the aggregator async fn register_signer( &self, @@ -317,69 +286,6 @@ mod tests { assert_eq!(1, epoch_settings.next_signers.len()); } - #[tokio::test] - async fn retrieve_pending_certificate() { - let (chain_observer, fake_aggregator) = init().await; - let epoch = chain_observer.get_current_epoch().await.unwrap().unwrap(); - let cert = fake_aggregator - .retrieve_pending_certificate() - .await - .expect("retrieving a certificate pending should not raise an error"); - - assert!( - cert.is_none(), - "aggregator client is empty => no pending certificate" - ); - - for signer in fake_data::signers(3) { - fake_aggregator - .register_signer(epoch.offset_to_recording_epoch(), &signer) - .await - .unwrap(); - } - - let cert = fake_aggregator - .retrieve_pending_certificate() - .await - .expect("retrieving a certificate pending should not raise an error") - .expect("we should get a pending certificate"); - - assert_eq!(0, cert.signers.len()); - assert_eq!(0, cert.next_signers.len()); - assert_eq!(1, cert.epoch); - - let epoch = chain_observer.next_epoch().await.unwrap(); - - let cert = fake_aggregator - .retrieve_pending_certificate() - .await - .expect("retrieving a certificate pending should not raise an error") - .expect("we should get a pending certificate"); - - assert_eq!(0, cert.signers.len()); - assert_eq!(3, cert.next_signers.len()); - assert_eq!(2, cert.epoch); - - for signer in fake_data::signers(2) { - fake_aggregator - .register_signer(epoch.offset_to_recording_epoch(), &signer) - .await - .unwrap(); - } - - chain_observer.next_epoch().await; - - let cert = fake_aggregator - .retrieve_pending_certificate() - .await - .expect("retrieving a certificate pending should not raise an error") - .expect("we should get a pending certificate"); - - assert_eq!(3, cert.signers.len()); - assert_eq!(2, cert.next_signers.len()); - assert_eq!(3, cert.epoch); - } - #[tokio::test] async fn retrieve_aggregator_features() { let (_chain_observer, fake_aggregator) = init().await; diff --git a/mithril-test-lab/mithril-end-to-end/Cargo.toml b/mithril-test-lab/mithril-end-to-end/Cargo.toml index ebaa091182a..ad558c6baa2 100644 --- a/mithril-test-lab/mithril-end-to-end/Cargo.toml +++ b/mithril-test-lab/mithril-end-to-end/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-end-to-end" -version = "0.4.32" +version = "0.4.33" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true } diff --git a/mithril-test-lab/mithril-end-to-end/src/stress_test/wait.rs b/mithril-test-lab/mithril-end-to-end/src/stress_test/wait.rs index b387efc8d6a..3bfa130c202 100644 --- a/mithril-test-lab/mithril-end-to-end/src/stress_test/wait.rs +++ b/mithril-test-lab/mithril-end-to-end/src/stress_test/wait.rs @@ -9,8 +9,8 @@ use tokio::time::sleep; use mithril_common::{ entities::{Epoch, SignedEntityType}, messages::{ - CertificateListItemMessage, CertificatePendingMessage, EpochSettingsMessage, - MithrilStakeDistributionListItemMessage, SnapshotListItemMessage, + CertificateListItemMessage, EpochSettingsMessage, MithrilStakeDistributionListItemMessage, + SnapshotListItemMessage, }, StdResult, }; @@ -105,11 +105,14 @@ pub async fn for_epoch_settings_at_epoch( } /// Wait for pending certificate +#[allow(deprecated)] pub async fn for_pending_certificate( aggregator: &Aggregator, timeout: Duration, signed_entity_type: &SignedEntityType, ) -> StdResult<()> { + use mithril_common::messages::CertificatePendingMessage; + let url = &format!("{}/certificate-pending", aggregator.endpoint()); spin_while_waiting!( { diff --git a/openapi.yaml b/openapi.yaml index 18977d53176..fa9ddf0a16d 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -4,7 +4,7 @@ info: # `mithril-common/src/lib.rs` file. If you plan to update it # here to reflect changes in the API, please also update the constant in the # Rust file. - version: 0.1.31 + version: 0.1.32 title: Mithril Aggregator Server description: | The REST API provided by a Mithril Aggregator Node in a Mithril network. @@ -78,6 +78,7 @@ paths: /certificate-pending: get: summary: Get current pending certificate information + deprecated: true description: | Returns the information related to the current pending certificate: * protocol parameters, for current and next epoch (to setup cryptography)