zombienet_orchestrator/network/
relaychain.rs1use std::path::PathBuf;
2
3use anyhow::anyhow;
4use async_trait::async_trait;
5use serde::{Deserialize, Serialize};
6
7use super::node::NetworkNode;
8use crate::{
9 network::chain_upgrade::ChainUpgrade, shared::types::RuntimeUpgradeOptions,
10 utils::default_as_empty_vec,
11};
12
13#[derive(Debug, Serialize, Deserialize)]
14pub struct Relaychain {
15 pub(crate) chain: String,
16 pub(crate) chain_id: String,
17 pub(crate) chain_spec_path: PathBuf,
18 #[serde(default, deserialize_with = "default_as_empty_vec")]
19 pub(crate) nodes: Vec<NetworkNode>,
20}
21
22#[derive(Debug, Deserialize)]
23pub(crate) struct RawRelaychain {
24 #[serde(flatten)]
25 pub(crate) inner: Relaychain,
26 pub(crate) nodes: serde_json::Value,
27}
28
29#[async_trait]
30impl ChainUpgrade for Relaychain {
31 async fn runtime_upgrade(&self, options: RuntimeUpgradeOptions) -> Result<(), anyhow::Error> {
32 let node = if let Some(node_name) = &options.node_name {
34 if let Some(node) = self
35 .nodes()
36 .into_iter()
37 .find(|node| node.name() == node_name)
38 {
39 node
40 } else {
41 return Err(anyhow!("Node: {node_name} is not part of the set of nodes"));
42 }
43 } else {
44 if let Some(node) = self.nodes().first() {
46 node
47 } else {
48 return Err(anyhow!("chain doesn't have any node!"));
49 }
50 };
51
52 self.perform_runtime_upgrade(node, options).await
53 }
54}
55
56impl Relaychain {
57 pub(crate) fn new(chain: String, chain_id: String, chain_spec_path: PathBuf) -> Self {
58 Self {
59 chain,
60 chain_id,
61 chain_spec_path,
62 nodes: Default::default(),
63 }
64 }
65
66 pub fn nodes(&self) -> Vec<&NetworkNode> {
68 self.nodes.iter().collect()
69 }
70
71 pub fn chain(&self) -> &str {
73 &self.chain
74 }
75}