migrate/
session.rs

1use std::time::Duration;
2
3use crate::args::Args;
4use openssl::ssl::{SslContextBuilder, SslMethod, SslVerifyMode};
5use scylla::client::session::Session;
6use scylla::client::session_builder::SessionBuilder;
7
8pub async fn initialize_session(args: &Args) -> Session {
9    let mut builder = SessionBuilder::new()
10        .known_node(&args.host)
11        .use_keyspace(&args.keyspace, false)
12        .connection_timeout(Duration::from_secs(args.timeout));
13
14    if let (Some(user), Some(password)) = (&args.user, &args.password) {
15        builder = builder.user(user, password);
16    }
17
18    if let Some(ca) = &args.ca {
19        let mut context_builder = SslContextBuilder::new(SslMethod::tls())
20            .map_err(|e| {
21                eprintln!("Failed to create SSL context: {}", e);
22                std::process::exit(1);
23            })
24            .unwrap();
25
26        context_builder
27            .set_ca_file(ca)
28            .map_err(|e| {
29                eprintln!("Failed to set CA file: {}", e);
30                std::process::exit(1);
31            })
32            .unwrap();
33
34        context_builder.set_verify(SslVerifyMode::PEER);
35
36        if let Some(key) = &args.cert {
37            context_builder
38                .set_certificate_file(key, openssl::ssl::SslFiletype::PEM)
39                .map_err(|e| {
40                    eprintln!("Failed to set certificate file: {}", e);
41                    std::process::exit(1);
42                })
43                .unwrap();
44
45            let key = args
46                .key
47                .as_ref()
48                .expect("Private key file is required when certificate is provided");
49            context_builder
50                .set_private_key_file(key, openssl::ssl::SslFiletype::PEM)
51                .map_err(|e| {
52                    eprintln!("Failed to set private key file: {}", e);
53                    std::process::exit(1);
54                })
55                .unwrap();
56        }
57
58        builder = builder.tls_context(Some(context_builder.build()));
59    }
60
61    builder
62        .build()
63        .await
64        .map_err(|e| {
65            eprintln!("Failed to create session: {}", e);
66            std::process::exit(1);
67        })
68        .unwrap()
69}