From a8d76a3bc52947fbcca3f8e097a21b9072994e8c Mon Sep 17 00:00:00 2001 From: yahortsaryk Date: Fri, 13 Oct 2023 14:47:23 +0200 Subject: [PATCH] feat: endpoint for removing a node --- pallets/ddc-nodes/src/cdn_node.rs | 11 ++++++++- pallets/ddc-nodes/src/lib.rs | 35 ++++++++++++++++++++++++++- pallets/ddc-nodes/src/node.rs | 19 ++++++++++++++- pallets/ddc-nodes/src/storage_node.rs | 11 ++++++++- 4 files changed, 72 insertions(+), 4 deletions(-) diff --git a/pallets/ddc-nodes/src/cdn_node.rs b/pallets/ddc-nodes/src/cdn_node.rs index 395f4e770..6407f34e0 100644 --- a/pallets/ddc-nodes/src/cdn_node.rs +++ b/pallets/ddc-nodes/src/cdn_node.rs @@ -1,5 +1,7 @@ use crate::{ - node::{Node, NodeError, NodeParams, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType}, + node::{ + Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType, + }, ClusterId, }; use codec::{Decode, Encode}; @@ -44,6 +46,13 @@ impl NodeTrait for CDNNode { fn get_props<'a>(&'a self) -> NodePropsRef<'a> { NodePropsRef::CDNPropsRef(&self.props) } + fn set_props<'a>(&mut self, props: NodeProps) -> Result<(), NodeError> { + self.props = match props { + NodeProps::CDNProps(props) => props, + _ => return Err(NodeError::InvalidCDNNodeProps), + }; + Ok(()) + } fn get_cluster_id(&self) -> &Option { &self.cluster_id } diff --git a/pallets/ddc-nodes/src/lib.rs b/pallets/ddc-nodes/src/lib.rs index 781a5403f..f4565caff 100644 --- a/pallets/ddc-nodes/src/lib.rs +++ b/pallets/ddc-nodes/src/lib.rs @@ -48,6 +48,7 @@ pub mod pallet { #[pallet::generate_deposit(pub(crate) fn deposit_event)] pub enum Event { NodeCreated { node_type: u8, node_pub_key: NodePubKey }, + NodeRemoved { node_type: u8, node_pub_key: NodePubKey }, } #[pallet::error] @@ -56,6 +57,8 @@ pub mod pallet { NodeDoesNotExist, InvalidNodeParams, NodeParamsExceedsLimit, + OnlyNodeProvider, + NodeIsAssignedToCluster, } #[pallet::storage] @@ -82,8 +85,24 @@ pub mod pallet { let node_pub_key = node.get_pub_key().to_owned(); Self::create(node).map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; Self::deposit_event(Event::::NodeCreated { + node_pub_key, node_type: node_type.into(), + }); + Ok(()) + } + + #[pallet::weight(10_000)] + pub fn remove_node(origin: OriginFor, node_pub_key: NodePubKey) -> DispatchResult { + let provider_id = ensure_signed(origin)?; + let node = Self::get(node_pub_key.clone()) + .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + ensure!(node.get_provider_id() == &provider_id, Error::::OnlyNodeProvider); + ensure!(node.get_cluster_id().is_none(), Error::::NodeIsAssignedToCluster); + Self::remove(node_pub_key.clone()) + .map_err(|e| Into::>::into(NodeRepositoryError::from(e)))?; + Self::deposit_event(Event::::NodeCreated { node_pub_key, + node_type: node.get_type().into(), }); Ok(()) } @@ -91,8 +110,9 @@ pub mod pallet { pub trait NodeRepository { fn create(node: Node) -> Result<(), NodeRepositoryError>; - fn get(pub_key: NodePubKey) -> Result, NodeRepositoryError>; + fn get(node_pub_key: NodePubKey) -> Result, NodeRepositoryError>; fn update(node: Node) -> Result<(), NodeRepositoryError>; + fn remove(node_pub_key: NodePubKey) -> Result<(), NodeRepositoryError>; } pub enum NodeRepositoryError { @@ -163,5 +183,18 @@ pub mod pallet { } Ok(()) } + + fn remove(node_pub_key: NodePubKey) -> Result<(), NodeRepositoryError> { + match node_pub_key { + NodePubKey::StoragePubKey(pub_key) => { + StorageNodes::::remove(pub_key); + Ok(()) + }, + NodePubKey::CDNPubKey(pub_key) => { + CDNNodes::::remove(pub_key); + Ok(()) + }, + } + } } } diff --git a/pallets/ddc-nodes/src/node.rs b/pallets/ddc-nodes/src/node.rs index 6b32cb2c4..fc1b530f4 100644 --- a/pallets/ddc-nodes/src/node.rs +++ b/pallets/ddc-nodes/src/node.rs @@ -20,6 +20,12 @@ pub enum NodeParams { CDNParams(CDNNodeParams), } +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] +pub enum NodeProps { + StorageProps(StorageNodeProps), + CDNProps(CDNNodeProps), +} + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo, PartialEq)] pub enum NodePubKey { StoragePubKey(StorageNodePubKey), @@ -53,6 +59,7 @@ pub trait NodeTrait { fn get_pub_key<'a>(&'a self) -> NodePubKeyRef<'a>; fn get_provider_id(&self) -> &ProviderId; fn get_props<'a>(&'a self) -> NodePropsRef<'a>; + fn set_props<'a>(&mut self, props: NodeProps) -> Result<(), NodeError>; fn get_cluster_id(&self) -> &Option; fn set_cluster_id(&mut self, cluster_id: ClusterId); fn get_type(&self) -> NodeType; @@ -78,6 +85,12 @@ impl NodeTrait for Node { Node::CDN(node) => node.get_props(), } } + fn set_props(&mut self, props: NodeProps) -> Result<(), NodeError> { + match self { + Node::Storage(node) => node.set_props(props), + Node::CDN(node) => node.set_props(props), + } + } fn get_cluster_id(&self) -> &Option { match &self { Node::Storage(node) => node.get_cluster_id(), @@ -135,6 +148,8 @@ pub enum NodeError { InvalidCDNNodeParams, StorageNodeParamsExceedsLimit, CDNNodeParamsExceedsLimit, + InvalidCDNNodeProps, + InvalidStorageNodeProps, } impl From for Error { @@ -143,7 +158,9 @@ impl From for Error { NodeError::InvalidStorageNodeParams => Error::::InvalidNodeParams, NodeError::InvalidCDNNodeParams => Error::::InvalidNodeParams, NodeError::StorageNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, - NodeError::CDNNodeParamsExceedsLimit => Error::::NodeParamsExceedsLimit, + NodeError::CDNNodeParamsExceedsLimit => Error::::InvalidNodeParams, + NodeError::InvalidStorageNodeProps => Error::::InvalidNodeParams, + NodeError::InvalidCDNNodeProps => Error::::InvalidNodeParams, } } } diff --git a/pallets/ddc-nodes/src/storage_node.rs b/pallets/ddc-nodes/src/storage_node.rs index e641d138e..e22d95ccf 100644 --- a/pallets/ddc-nodes/src/storage_node.rs +++ b/pallets/ddc-nodes/src/storage_node.rs @@ -1,5 +1,7 @@ use crate::{ - node::{Node, NodeError, NodeParams, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType}, + node::{ + Node, NodeError, NodeParams, NodeProps, NodePropsRef, NodePubKeyRef, NodeTrait, NodeType, + }, ClusterId, }; use codec::{Decode, Encode}; @@ -44,6 +46,13 @@ impl NodeTrait for StorageNode { fn get_props<'a>(&'a self) -> NodePropsRef<'a> { NodePropsRef::StoragePropsRef(&self.props) } + fn set_props<'a>(&mut self, props: NodeProps) -> Result<(), NodeError> { + self.props = match props { + NodeProps::StorageProps(props) => props, + _ => return Err(NodeError::InvalidStorageNodeProps), + }; + Ok(()) + } fn get_cluster_id(&self) -> &Option { &self.cluster_id }