-
Notifications
You must be signed in to change notification settings - Fork 24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Mobile config] Add v2 endpoints to GatewayInfoV2. Change min_refreshed_at
to min_updated_at
#910
Changes from 4 commits
9f2382d
23f7857
78c519f
4f4cc9b
c2343a8
c3f30d5
119ad63
df16f90
7088f65
4c96883
36205bf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,11 +1,12 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use crate::{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gateway_info::{self, DeviceType, GatewayInfo}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gateway_info::{self, db::get_updated_radios, DeviceType, GatewayInfo}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
key_cache::KeyCache, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
telemetry, verify_public_key, GrpcResult, GrpcStreamResult, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use chrono::{DateTime, TimeZone, Utc}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use chrono::{TimeZone, Utc}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use file_store::traits::{MsgVerify, TimestampEncode}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use futures::{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
future, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
stream::{Stream, StreamExt, TryStreamExt}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
TryFutureExt, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -23,16 +24,23 @@ use tonic::{Request, Response, Status}; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pub struct GatewayService { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
key_cache: KeyCache, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mobile_config_db_pool: Pool<Postgres>, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
metadata_pool: Pool<Postgres>, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
signing_key: Arc<Keypair>, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
impl GatewayService { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pub fn new(key_cache: KeyCache, metadata_pool: Pool<Postgres>, signing_key: Keypair) -> Self { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pub fn new( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
key_cache: KeyCache, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
metadata_pool: Pool<Postgres>, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
signing_key: Keypair, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mobile_config_db_pool: Pool<Postgres>, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) -> Self { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Self { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
key_cache, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
metadata_pool, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
signing_key: Arc::new(signing_key), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mobile_config_db_pool, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -170,8 +178,7 @@ impl mobile_config::Gateway for GatewayService { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tokio::spawn(async move { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let stream = | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gateway_info::db::all_info_stream(&pool, &device_types, DateTime::UNIX_EPOCH); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let stream = gateway_info::db::all_info_stream(&pool, &device_types); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
stream_multi_gateways_info(stream, tx.clone(), signing_key.clone(), batch_size).await | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -191,27 +198,39 @@ impl mobile_config::Gateway for GatewayService { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.verify_request_signature(&signer, &request)?; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let pool = self.metadata_pool.clone(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let mc_pool = self.mobile_config_db_pool.clone(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the original |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let signing_key = self.signing_key.clone(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let batch_size = request.batch_size; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let (tx, rx) = tokio::sync::mpsc::channel(100); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let device_types: Vec<DeviceType> = request.device_types().map(|v| v.into()).collect(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let min_refreshed_at = Utc | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.timestamp_opt(request.min_refreshed_at as i64, 0) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.single() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.ok_or(Status::invalid_argument( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Invalid min_refreshed_at argument", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
))?; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tracing::debug!( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"fetching all gateways' info (v2). Device types: {:?} ", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
device_types | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tokio::spawn(async move { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let stream = gateway_info::db::all_info_stream(&pool, &device_types, min_refreshed_at); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
stream_multi_gateways_info(stream, tx.clone(), signing_key.clone(), batch_size).await | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let stream = gateway_info::db::all_info_stream(&pool, &device_types); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if request.min_updated_at > 0 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let min_updated_at = Utc | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.timestamp_opt(request.min_updated_at as i64, 0) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.single() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.ok_or(Status::invalid_argument( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Invalid min_refreshed_at argument", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
))?; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let updated_redios = get_updated_radios(&mc_pool, min_updated_at).await?; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let stream = stream | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.filter(|v| future::ready(updated_redios.contains(&v.address))) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.boxed(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
stream_multi_gateways_info(stream, tx.clone(), signing_key.clone(), batch_size) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.await | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
stream_multi_gateways_info(stream, tx.clone(), signing_key.clone(), batch_size) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.await | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
i don't know that this really makes a difference; i wanted to get it down to a single invocation of the stream but i don't think we can fully clean that up unless we added a no-op filter on the branch that doesn't check updated at so feel free to ignore here There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've tried to do it in a similar way, but I'm facing incompatible types or borrow checker errors. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ok(Response::new(GrpcStreamResult::new(rx))) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this probably necessitates importing
StreamExt
or similar but avoids the extra allocationsThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
helium-crypto-rs provides a sqlx mapping for
PublicKeyBinary
https://github.com/helium/helium-crypto-rs/blob/main/src/public_key_binary.rs#L115There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @michaeldjeffrey thanks for information. The helium-crypto-rs provides a sqlx mapping for PublicKeyBinary which stored in database as
string
. In our case pubkey is stored as abytea
type. So when I try to use helium-crypto-rsmapping like below
I've got an error:
mismatched types; Rust type `helium_crypto::public_key_binary::PublicKeyBinary` (as SQL type `text`) is not compatible with SQL type BYTEA
To make it work we need to extend
decode
function inhelium-crypto-rs
https://github.com/helium/helium-crypto-rs/blob/main/src/public_key_binary.rs#L150 to make it support bytea. I think this is not in the scope of this PR and I'm not sure that it is worth since I have no information how often we store PublicKeyBinary in bytea type.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No doubt. That's a good @madninja question. Anyways, carry on 👯