1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use clap::Args;

use ockam::TcpTransport;

use crate::node::default_node_name;
use crate::node::show::print_query_status;
use crate::node::util::spawn_node;
use crate::util::{node_rpc, RpcBuilder};
use crate::{help, node::HELP_DETAIL, CommandGlobalOpts};

/// Start a node
#[derive(Clone, Debug, Args)]
#[command(
    after_long_help = help::template(HELP_DETAIL)
)]
pub struct StartCommand {
    /// Name of the node.
    #[arg(default_value_t = default_node_name())]
    node_name: String,

    #[arg(long, default_value = "false")]
    aws_kms: bool,

    #[arg(long, default_value = "false")]
    force: bool,
}

impl StartCommand {
    pub fn run(self, options: CommandGlobalOpts) {
        node_rpc(run_impl, (options, self))
    }
}

async fn run_impl(
    ctx: ockam::Context,
    (opts, cmd): (CommandGlobalOpts, StartCommand),
) -> crate::Result<()> {
    let node_name = &cmd.node_name;

    let node_state = opts.state.nodes.get(node_name)?;
    // Check if node is already running
    if node_state.is_running() && !cmd.force {
        println!(
            "Restart aborted, node: {} already running",
            node_state.config.name
        );
        return Ok(());
    }
    node_state.kill_process(false)?;
    let node_setup = node_state.setup()?;

    // Restart node
    spawn_node(
        &opts,
        node_setup.verbose, // Previously user-chosen verbosity level
        node_name,          // The selected node name
        &node_setup.default_tcp_listener()?.addr.to_string(), // The selected node api address
        None,               // No project information available
        None,               // No trusted identities
        None,               // "
        None,               // "
        None,
        None, // No launch config available
        None,
    )?;

    // Print node status
    let tcp = TcpTransport::create(&ctx).await?;
    let mut rpc = RpcBuilder::new(&ctx, &opts, node_name).tcp(&tcp)?.build();
    let mut is_default = false;
    if let Ok(state) = opts.state.nodes.default() {
        is_default = &state.config.name == node_name;
    }
    print_query_status(&mut rpc, node_name, true, is_default).await?;

    Ok(())
}