Skip to content
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

refactor/nanocld: node repository #731

Merged
merged 1 commit into from
Dec 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion bin/nanocld/migrations/2022-08-04-214925_nodes/up.sql
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
-- Your SQL goes here
CREATE TABLE IF NOT EXISTS "nodes" (
"name" VARCHAR NOT NULL UNIQUE PRIMARY KEY,
"ip_address" VARCHAR NOT NULL UNIQUE
"ip_address" VARCHAR NOT NULL UNIQUE,
"created_at" TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE TABLE IF NOT EXISTS "node_groups" (
Expand Down
70 changes: 3 additions & 67 deletions bin/nanocld/src/models/node.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,7 @@
use std::sync::Arc;

use diesel::prelude::*;
use ntex::rt::JoinHandle;
use serde::{Serialize, Deserialize};

use nanocl_error::io::{IoError, IoResult};

use nanocl_stubs::generic::GenericFilter;

use crate::{utils, schema::nodes};

use super::{Pool, Repository};
use crate::schema::nodes;

/// This structure represent a node in the database.
/// A node is a machine that is connected to nanocl network.
Expand All @@ -25,61 +16,6 @@ pub struct NodeDb {
pub name: String,
/// The ip address of the node
pub ip_address: String,
}

impl Repository for NodeDb {
type Table = nodes::table;
type Item = NodeDb;
type UpdateItem = NodeDb;

fn find_one(
filter: &GenericFilter,
pool: &Pool,
) -> JoinHandle<IoResult<Self::Item>> {
log::trace!("NodeDb::find_one: {filter:?}");
// let r#where = filter.r#where.to_owned().unwrap_or_default();
let query = nodes::dsl::nodes.into_boxed();
let pool = Arc::clone(pool);
ntex::rt::spawn_blocking(move || {
let mut conn = utils::store::get_pool_conn(&pool)?;
let item = query
.get_result::<Self>(&mut conn)
.map_err(Self::map_err_context)?;
Ok::<_, IoError>(item)
})
}

fn find(
filter: &GenericFilter,
pool: &Pool,
) -> JoinHandle<IoResult<Vec<Self::Item>>> {
log::trace!("NodeDb::find: {filter:?}");
// let r#where = filter.r#where.to_owned().unwrap_or_default();
let mut query = nodes::dsl::nodes.into_boxed();
let limit = filter.limit.unwrap_or(100);
query = query.limit(limit as i64);
if let Some(offset) = filter.offset {
query = query.offset(offset as i64);
}
let pool = Arc::clone(pool);
ntex::rt::spawn_blocking(move || {
let mut conn = utils::store::get_pool_conn(&pool)?;
let items = query
.get_results::<Self>(&mut conn)
.map_err(Self::map_err_context)?;
Ok::<_, IoError>(items)
})
}
}

impl NodeDb {
pub(crate) async fn create_if_not_exists(
node: &NodeDb,
pool: &Pool,
) -> IoResult<NodeDb> {
match NodeDb::find_by_pk(&node.name, pool).await? {
Err(_) => NodeDb::create(node.clone(), pool).await?,
Ok(node) => Ok(node),
}
}
/// The created at date
pub created_at: chrono::NaiveDateTime,
}
1 change: 1 addition & 0 deletions bin/nanocld/src/repositories/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
mod node;
mod cargo;
mod process;
mod namespace;
Expand Down
48 changes: 48 additions & 0 deletions bin/nanocld/src/repositories/node.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
use diesel::prelude::*;

use nanocl_error::io::IoResult;

use nanocl_stubs::generic::GenericFilter;

use crate::{
models::{Pool, NodeDb},
schema::nodes,
};

use super::generic::*;

impl RepositoryBase for NodeDb {}

impl RepositoryCreate for NodeDb {}

impl RepositoryDelByPk for NodeDb {}

impl RepositoryRead for NodeDb {
type Output = NodeDb;
type Query = nodes::BoxedQuery<'static, diesel::pg::Pg>;

fn gen_read_query(filter: &GenericFilter, is_multiple: bool) -> Self::Query {
let mut query = nodes::dsl::nodes.into_boxed();
if is_multiple {
query = query.order(nodes::dsl::created_at.desc());
let limit = filter.limit.unwrap_or(100);
query = query.limit(limit as i64);
if let Some(offset) = filter.offset {
query = query.offset(offset as i64);

Check warning on line 31 in bin/nanocld/src/repositories/node.rs

View check run for this annotation

Codecov / codecov/patch

bin/nanocld/src/repositories/node.rs#L31

Added line #L31 was not covered by tests
}
}

Check warning on line 33 in bin/nanocld/src/repositories/node.rs

View check run for this annotation

Codecov / codecov/patch

bin/nanocld/src/repositories/node.rs#L33

Added line #L33 was not covered by tests
query
}
}

impl NodeDb {
pub(crate) async fn create_if_not_exists(
node: &NodeDb,
pool: &Pool,
) -> IoResult<NodeDb> {
match NodeDb::read_by_pk(&node.name, pool).await? {
Err(_) => NodeDb::create_from(node.clone(), pool).await?,

Check warning on line 44 in bin/nanocld/src/repositories/node.rs

View check run for this annotation

Codecov / codecov/patch

bin/nanocld/src/repositories/node.rs#L44

Added line #L44 was not covered by tests
Ok(node) => Ok(node),
}
}
}
1 change: 1 addition & 0 deletions bin/nanocld/src/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ diesel::table! {
nodes (name) {
name -> Varchar,
ip_address -> Varchar,
created_at -> Timestamptz,
}
}

Expand Down
27 changes: 15 additions & 12 deletions bin/nanocld/src/services/node.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
use std::rc::Rc;
use std::cell::RefCell;
use std::time::Instant;
use std::{rc::Rc, cell::RefCell, time::Instant};

use nanocl_stubs::generic::GenericFilter;
use ntex::{rt, ws, web};
use ntex::channel::oneshot;
use ntex::util::ByteString;
use ntex::{Service, fn_service, chain};
use ntex::service::{map_config, fn_shutdown, fn_factory_with_config};
use ntex::{
rt, ws, web, Service, chain, fn_service,
channel::oneshot,
util::ByteString,
service::{map_config, fn_shutdown, fn_factory_with_config},
};
use futures::future::ready;

use nanocl_error::http::HttpResult;

use crate::utils;
use crate::models::{DaemonState, WsConState, NodeDb, Repository};
use nanocl_stubs::generic::GenericFilter;

use crate::{
utils,
repositories::generic::*,
models::{DaemonState, WsConState, NodeDb},
};

/// List nodes
#[cfg_attr(feature = "dev", utoipa::path(
Expand All @@ -28,7 +31,7 @@ use crate::models::{DaemonState, WsConState, NodeDb, Repository};
pub(crate) async fn list_node(
state: web::types::State<DaemonState>,
) -> HttpResult<web::HttpResponse> {
let items = NodeDb::find(&GenericFilter::default(), &state.pool).await??;
let items = NodeDb::read(&GenericFilter::default(), &state.pool).await??;
Ok(web::HttpResponse::Ok().json(&items))
}

Expand Down
1 change: 1 addition & 0 deletions bin/nanocld/src/utils/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ pub async fn register(state: &DaemonState) -> IoResult<()> {
let node = NodeDb {
name: state.config.hostname.clone(),
ip_address: state.config.gateway.clone(),
created_at: chrono::Utc::now().naive_utc(),
};
NodeDb::create_if_not_exists(&node, &state.pool).await?;
Ok(())
Expand Down
Loading