Skip to content

Commit

Permalink
feat: endpoint for removing a node
Browse files Browse the repository at this point in the history
  • Loading branch information
yahortsaryk committed Oct 13, 2023
1 parent 7c65f2e commit a8d76a3
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 4 deletions.
11 changes: 10 additions & 1 deletion pallets/ddc-nodes/src/cdn_node.rs
Original file line number Diff line number Diff line change
@@ -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};
Expand Down Expand Up @@ -44,6 +46,13 @@ impl<ProviderId> NodeTrait<ProviderId> for CDNNode<ProviderId> {
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<ClusterId> {
&self.cluster_id
}
Expand Down
35 changes: 34 additions & 1 deletion pallets/ddc-nodes/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ pub mod pallet {
#[pallet::generate_deposit(pub(crate) fn deposit_event)]
pub enum Event<T: Config> {
NodeCreated { node_type: u8, node_pub_key: NodePubKey },
NodeRemoved { node_type: u8, node_pub_key: NodePubKey },
}

#[pallet::error]
Expand All @@ -56,6 +57,8 @@ pub mod pallet {
NodeDoesNotExist,
InvalidNodeParams,
NodeParamsExceedsLimit,
OnlyNodeProvider,
NodeIsAssignedToCluster,
}

#[pallet::storage]
Expand All @@ -82,17 +85,34 @@ pub mod pallet {
let node_pub_key = node.get_pub_key().to_owned();
Self::create(node).map_err(|e| Into::<Error<T>>::into(NodeRepositoryError::from(e)))?;
Self::deposit_event(Event::<T>::NodeCreated {
node_pub_key,
node_type: node_type.into(),
});
Ok(())
}

#[pallet::weight(10_000)]
pub fn remove_node(origin: OriginFor<T>, node_pub_key: NodePubKey) -> DispatchResult {
let provider_id = ensure_signed(origin)?;
let node = Self::get(node_pub_key.clone())
.map_err(|e| Into::<Error<T>>::into(NodeRepositoryError::from(e)))?;
ensure!(node.get_provider_id() == &provider_id, Error::<T>::OnlyNodeProvider);
ensure!(node.get_cluster_id().is_none(), Error::<T>::NodeIsAssignedToCluster);
Self::remove(node_pub_key.clone())
.map_err(|e| Into::<Error<T>>::into(NodeRepositoryError::from(e)))?;
Self::deposit_event(Event::<T>::NodeCreated {
node_pub_key,
node_type: node.get_type().into(),
});
Ok(())
}
}

pub trait NodeRepository<T: frame_system::Config> {
fn create(node: Node<T::AccountId>) -> Result<(), NodeRepositoryError>;
fn get(pub_key: NodePubKey) -> Result<Node<T::AccountId>, NodeRepositoryError>;
fn get(node_pub_key: NodePubKey) -> Result<Node<T::AccountId>, NodeRepositoryError>;
fn update(node: Node<T::AccountId>) -> Result<(), NodeRepositoryError>;
fn remove(node_pub_key: NodePubKey) -> Result<(), NodeRepositoryError>;
}

pub enum NodeRepositoryError {
Expand Down Expand Up @@ -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::<T>::remove(pub_key);
Ok(())
},
NodePubKey::CDNPubKey(pub_key) => {
CDNNodes::<T>::remove(pub_key);
Ok(())
},
}
}
}
}
19 changes: 18 additions & 1 deletion pallets/ddc-nodes/src/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -53,6 +59,7 @@ pub trait NodeTrait<ProviderId> {
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<ClusterId>;
fn set_cluster_id(&mut self, cluster_id: ClusterId);
fn get_type(&self) -> NodeType;
Expand All @@ -78,6 +85,12 @@ impl<ProviderId> NodeTrait<ProviderId> for Node<ProviderId> {
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<ClusterId> {
match &self {
Node::Storage(node) => node.get_cluster_id(),
Expand Down Expand Up @@ -135,6 +148,8 @@ pub enum NodeError {
InvalidCDNNodeParams,
StorageNodeParamsExceedsLimit,
CDNNodeParamsExceedsLimit,
InvalidCDNNodeProps,
InvalidStorageNodeProps,
}

impl<T> From<NodeError> for Error<T> {
Expand All @@ -143,7 +158,9 @@ impl<T> From<NodeError> for Error<T> {
NodeError::InvalidStorageNodeParams => Error::<T>::InvalidNodeParams,
NodeError::InvalidCDNNodeParams => Error::<T>::InvalidNodeParams,
NodeError::StorageNodeParamsExceedsLimit => Error::<T>::NodeParamsExceedsLimit,
NodeError::CDNNodeParamsExceedsLimit => Error::<T>::NodeParamsExceedsLimit,
NodeError::CDNNodeParamsExceedsLimit => Error::<T>::InvalidNodeParams,
NodeError::InvalidStorageNodeProps => Error::<T>::InvalidNodeParams,
NodeError::InvalidCDNNodeProps => Error::<T>::InvalidNodeParams,
}
}
}
11 changes: 10 additions & 1 deletion pallets/ddc-nodes/src/storage_node.rs
Original file line number Diff line number Diff line change
@@ -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};
Expand Down Expand Up @@ -44,6 +46,13 @@ impl<ProviderId> NodeTrait<ProviderId> for StorageNode<ProviderId> {
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<ClusterId> {
&self.cluster_id
}
Expand Down

0 comments on commit a8d76a3

Please sign in to comment.