From 64233b0ccbd05c60d9719cfbe05897fa89283640 Mon Sep 17 00:00:00 2001 From: Dominik Werder Date: Fri, 16 Dec 2022 17:56:14 +0100 Subject: [PATCH] Rename channelBackend to backend --- dbconn/src/channelconfig.rs | 23 ++++++--- httpret/src/channelconfig.rs | 67 +++++++++++++++----------- httpret/src/pulsemap.rs | 5 +- httpret/static/documentation/api4.html | 8 +-- netpod/src/netpod.rs | 20 +++++--- 5 files changed, 72 insertions(+), 51 deletions(-) diff --git a/dbconn/src/channelconfig.rs b/dbconn/src/channelconfig.rs index ab38f7a..32e1875 100644 --- a/dbconn/src/channelconfig.rs +++ b/dbconn/src/channelconfig.rs @@ -6,6 +6,7 @@ use crate::ErrConv; pub struct ChConf { pub series: u64, + pub name: String, pub scalar_type: ScalarType, pub shape: Shape, } @@ -29,6 +30,7 @@ pub async fn chconf_from_database(channel: &Channel, ncc: &NodeConfigCached) -> let ret = if channel.name() == "inmem-d0-i32" { let ret = ChConf { series: 1, + name: channel.name().into(), scalar_type: ScalarType::I32, shape: Shape::Scalar, }; @@ -45,6 +47,7 @@ pub async fn chconf_from_database(channel: &Channel, ncc: &NodeConfigCached) -> let ret = if channel.name() == "scalar-i32-be" { let ret = ChConf { series: 1, + name: channel.name().into(), scalar_type: ScalarType::I32, shape: Shape::Scalar, }; @@ -52,6 +55,7 @@ pub async fn chconf_from_database(channel: &Channel, ncc: &NodeConfigCached) -> } else if channel.name() == "wave-f64-be-n21" { let ret = ChConf { series: 2, + name: channel.name().into(), scalar_type: ScalarType::F64, shape: Shape::Wave(21), }; @@ -59,6 +63,7 @@ pub async fn chconf_from_database(channel: &Channel, ncc: &NodeConfigCached) -> } else if channel.name() == "const-regular-scalar-i32-be" { let ret = ChConf { series: 3, + name: channel.name().into(), scalar_type: ScalarType::I32, shape: Shape::Scalar, }; @@ -75,7 +80,7 @@ pub async fn chconf_from_database(channel: &Channel, ncc: &NodeConfigCached) -> if let Some(series) = channel.series() { let res = pgclient .query( - "select scalar_type, shape_dims from series_by_channel where series = $1", + "select channel, scalar_type, shape_dims from series_by_channel where series = $1", &[&(series as i64)], ) .await @@ -86,11 +91,13 @@ pub async fn chconf_from_database(channel: &Channel, ncc: &NodeConfigCached) -> Err(e) } else { let row = res.first().unwrap(); - let scalar_type = ScalarType::from_dtype_index(row.get::<_, i32>(0) as u8)?; + let name: String = row.get(0); + let scalar_type = ScalarType::from_dtype_index(row.get::<_, i32>(1) as u8)?; // TODO can I get a slice from psql driver? - let shape = Shape::from_scylla_shape_dims(&row.get::<_, Vec>(1))?; + let shape = Shape::from_scylla_shape_dims(&row.get::<_, Vec>(2))?; let ret = ChConf { series, + name, scalar_type, shape, }; @@ -99,7 +106,7 @@ pub async fn chconf_from_database(channel: &Channel, ncc: &NodeConfigCached) -> } else { let res = pgclient .query( - "select series, scalar_type, shape_dims from series_by_channel where facility = $1 and channel = $2", + "select channel, series, scalar_type, shape_dims from series_by_channel where facility = $1 and channel = $2", &[&channel.backend(), &channel.name()], ) .await @@ -114,12 +121,14 @@ pub async fn chconf_from_database(channel: &Channel, ncc: &NodeConfigCached) -> Err(e) } else { let row = res.first().unwrap(); - let series = row.get::<_, i64>(0) as u64; - let scalar_type = ScalarType::from_dtype_index(row.get::<_, i32>(1) as u8)?; + let name: String = row.get(0); + let series = row.get::<_, i64>(1) as u64; + let scalar_type = ScalarType::from_dtype_index(row.get::<_, i32>(2) as u8)?; // TODO can I get a slice from psql driver? - let shape = Shape::from_scylla_shape_dims(&row.get::<_, Vec>(2))?; + let shape = Shape::from_scylla_shape_dims(&row.get::<_, Vec>(3))?; let ret = ChConf { series, + name, scalar_type, shape, }; diff --git a/httpret/src/channelconfig.rs b/httpret/src/channelconfig.rs index 7b3836b..9e75536 100644 --- a/httpret/src/channelconfig.rs +++ b/httpret/src/channelconfig.rs @@ -37,6 +37,7 @@ pub async fn chconf_from_prebinned(q: &PreBinnedQuery, _ncc: &NodeConfigCached) .channel() .series() .expect("PreBinnedQuery is expected to contain the series id"), + name: q.channel().name().into(), scalar_type: q.scalar_type().clone(), shape: q.shape().clone(), }; @@ -65,8 +66,8 @@ impl ChannelConfigHandler { .headers() .get(http::header::ACCEPT) .map_or(accept_def, |k| k.to_str().unwrap_or(accept_def)); - if accept == APP_JSON || accept == ACCEPT_ALL { - match channel_config(req, &node_config).await { + if accept.contains(APP_JSON) || accept.contains(ACCEPT_ALL) { + match self.channel_config(req, &node_config).await { Ok(k) => Ok(k), Err(e) => { warn!("ChannelConfigHandler::handle: got error from channel_config: {e:?}"); @@ -80,6 +81,40 @@ impl ChannelConfigHandler { Ok(response(StatusCode::METHOD_NOT_ALLOWED).body(Body::empty())?) } } + + async fn channel_config( + &self, + req: Request, + node_config: &NodeConfigCached, + ) -> Result, Error> { + info!("channel_config"); + let url = Url::parse(&format!("dummy:{}", req.uri()))?; + let q = ChannelConfigQuery::from_url(&url)?; + info!("channel_config for q {q:?}"); + let conf = if let Some(_scyco) = &node_config.node_config.cluster.scylla { + let c = dbconn::channelconfig::chconf_from_database(&q.channel, node_config).await?; + ChannelConfigResponse { + channel: Channel { + series: Some(c.series), + backend: q.channel.backend().into(), + name: c.name, + }, + scalar_type: c.scalar_type, + byte_order: None, + shape: c.shape, + } + } else if let Some(_) = &node_config.node.channel_archiver { + return Err(Error::with_msg_no_trace("no archiver")); + } else if let Some(_) = &node_config.node.archiver_appliance { + return Err(Error::with_msg_no_trace("no archapp")); + } else { + parse::channelconfig::channel_config(&q, &node_config.node).await? + }; + let ret = response(StatusCode::OK) + .header(http::header::CONTENT_TYPE, APP_JSON) + .body(Body::from(serde_json::to_string(&conf)?))?; + Ok(ret) + } } trait ErrConv { @@ -122,32 +157,6 @@ impl ErrConv for Result { } } -async fn channel_config(req: Request, node_config: &NodeConfigCached) -> Result, Error> { - info!("channel_config"); - let url = Url::parse(&format!("dummy:{}", req.uri()))?; - let q = ChannelConfigQuery::from_url(&url)?; - info!("channel_config for q {q:?}"); - let conf = if let Some(_scyco) = &node_config.node_config.cluster.scylla { - let c = dbconn::channelconfig::chconf_from_database(&q.channel, node_config).await?; - ChannelConfigResponse { - channel: q.channel, - scalar_type: c.scalar_type, - byte_order: None, - shape: c.shape, - } - } else if let Some(_) = &node_config.node.channel_archiver { - return Err(Error::with_msg_no_trace("no archiver")); - } else if let Some(_) = &node_config.node.archiver_appliance { - return Err(Error::with_msg_no_trace("no archapp")); - } else { - parse::channelconfig::channel_config(&q, &node_config.node).await? - }; - let ret = response(StatusCode::OK) - .header(http::header::CONTENT_TYPE, APP_JSON) - .body(Body::from(serde_json::to_string(&conf)?))?; - Ok(ret) -} - #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ConfigsHisto { scalar_types: Vec<(ScalarType, Vec<(Shape, u32)>)>, @@ -513,7 +522,7 @@ impl ScyllaChannelsActive { #[derive(Clone, Debug, Deserialize)] pub struct IocForChannelQuery { - #[serde(rename = "channelBackend")] + #[serde(rename = "backend")] backend: String, #[serde(rename = "channelName")] name: String, diff --git a/httpret/src/pulsemap.rs b/httpret/src/pulsemap.rs index 74a264c..5890f44 100644 --- a/httpret/src/pulsemap.rs +++ b/httpret/src/pulsemap.rs @@ -487,10 +487,7 @@ impl FromUrl for MapPulseQuery { .rev(); let pulsestr = pit.next().ok_or(Error::with_msg_no_trace("no pulse in url path"))?; let backend = pit.next().unwrap_or("sf-databuffer").into(); - //.ok_or(Error::with_msg_no_trace("no backend in url path"))? - //.into(); - // TODO !!! - // Clients MUST specify the backend + // TODO legacy: use a default backend if not specified. let backend = if backend == "pulse" { String::from("sf-databuffer") } else { diff --git a/httpret/static/documentation/api4.html b/httpret/static/documentation/api4.html index 01dbb80..1bcaa72 100644 --- a/httpret/static/documentation/api4.html +++ b/httpret/static/documentation/api4.html @@ -179,7 +179,7 @@ curl -H 'Accept: application/json' 'https://data-api.psi.ch/api/4/map/pulse/sf-d

URL: https://data-api.psi.ch/api/4/events

Query parameters:

    -
  • channelBackend (e.g. "sf-databuffer")
  • +
  • backend (e.g. "sf-databuffer")
  • channelName (e.g. "S10CB02-RBOC-DCP10:FOR-AMPLT-AVG")
  • begDate (e.g. "2021-05-26T07:10:00.000Z")
  • endDate (e.g. "2021-05-26T07:16:00.000Z")
  • @@ -192,7 +192,7 @@ curl -H 'Accept: application/json' 'https://data-api.psi.ch/api/4/map/pulse/sf-d

    CURL example:

    -curl -H 'Accept: application/json' 'https://data-api.psi.ch/api/4/events?channelBackend=sf-databuffer
    +curl -H 'Accept: application/json' 'https://data-api.psi.ch/api/4/events?backend=sf-databuffer
       &channelName=S10CB02-RBOC-DCP10:FOR-AMPLT-AVG&begDate=2021-05-26T07:10:00.000Z&endDate=2021-05-26T07:16:00.000Z'
     
    @@ -235,7 +235,7 @@ curl -H 'Accept: application/json' 'https://data-api.psi.ch/api/4/events?channel

    URL: https://data-api.psi.ch/api/4/binned

    Query parameters:

      -
    • channelBackend (e.g. "sf-databuffer")
    • +
    • backend (e.g. "sf-databuffer")
    • channelName (e.g. "SLAAR-LSCP4-LAS6891:CH7:1")
    • begDate (e.g. "2021-05-26T07:10:00.000Z")
    • endDate (e.g. "2021-05-26T07:16:00.000Z")
    • @@ -257,7 +257,7 @@ curl -H 'Accept: application/json' 'https://data-api.psi.ch/api/4/events?channel

      CURL example:

      -curl -H 'Accept: application/json' 'https://data-api.psi.ch/api/4/binned?channelBackend=sf-databuffer
      +curl -H 'Accept: application/json' 'https://data-api.psi.ch/api/4/binned?backend=sf-databuffer
         &channelName=SLAAR-LSCP4-LAS6891:CH7:1&begDate=2021-05-25T00:00:00.000Z&endDate=2021-05-26T00:00:00.000Z&binCount=3'
       
      diff --git a/netpod/src/netpod.rs b/netpod/src/netpod.rs index 9d3a3fa..c678756 100644 --- a/netpod/src/netpod.rs +++ b/netpod/src/netpod.rs @@ -596,8 +596,8 @@ impl FromUrl for Channel { fn from_pairs(pairs: &BTreeMap) -> Result { let ret = Channel { backend: pairs - .get("channelBackend") - .ok_or(Error::with_public_msg("missing channelBackend"))? + .get("backend") + .ok_or(Error::with_public_msg("missing backend"))? .into(), name: pairs .get("channelName") @@ -614,10 +614,10 @@ impl FromUrl for Channel { impl AppendToUrl for Channel { fn append_to_url(&self, url: &mut Url) { let mut g = url.query_pairs_mut(); - g.append_pair("channelBackend", &self.backend); + g.append_pair("backend", &self.backend); g.append_pair("channelName", &self.name); if let Some(series) = self.series { - g.append_pair("seriesId", &format!("{series}")); + g.append_pair("seriesId", &series.to_string()); } } } @@ -2032,8 +2032,14 @@ impl FromUrl for ChannelConfigQuery { } fn from_pairs(pairs: &BTreeMap) -> Result { - let beg_date = pairs.get("begDate").ok_or(Error::with_public_msg("missing begDate"))?; - let end_date = pairs.get("endDate").ok_or(Error::with_public_msg("missing endDate"))?; + let beg_date = pairs + .get("begDate") + .map(String::from) + .unwrap_or_else(|| String::from("2000-01-01T00:00:00Z")); + let end_date = pairs + .get("endDate") + .map(String::from) + .unwrap_or_else(|| String::from("3000-01-01T00:00:00Z")); let expand = pairs.get("expand").map(|s| s == "true").unwrap_or(false); let ret = Self { channel: Channel::from_pairs(&pairs)?, @@ -2072,7 +2078,7 @@ pub struct ChannelConfigResponse { pub channel: Channel, #[serde(rename = "scalarType")] pub scalar_type: ScalarType, - #[serde(rename = "byteOrder")] + #[serde(rename = "byteOrder", default, skip_serializing_if = "Option::is_none")] pub byte_order: Option, #[serde(rename = "shape")] pub shape: Shape,