zombienet_orchestrator/network/
relaychain.rs

1use 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        // check if the node is valid first
33        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            // take the first node
45            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    // Public API
67    pub fn nodes(&self) -> Vec<&NetworkNode> {
68        self.nodes.iter().collect()
69    }
70
71    /// Get chain name
72    pub fn chain(&self) -> &str {
73        &self.chain
74    }
75}