Rust driver connection error

I’m getting this error on trying to ping my DB.

mongodb+srv://hosteldb.e3ayhyn.mongodb.net/?retryWrites=true&w=majority&authSource=%24external&authMechanism=MONGODB-X509&tlsCertificateKeyFile=X509-cert-application.pem
Connected successfully.
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error { kind: ServerSelection { message: "Server selection timeout: No available servers. Topology: { Type: ReplicaSetNoPrimary, Servers: [ { Address: ac-hikpf5h-shard-00-02.e3ayhyn.mongodb.net:27017, Type: Unknown, Error: No such file or directory (os error 2) }, { Address: ac-hikpf5h-shard-00-01.e3ayhyn.mongodb.net:27017, Type: Unknown, Error: No such file or directory (os error 2) }, { Address: ac-hikpf5h-shard-00-00.e3ayhyn.mongodb.net:27017, Type: Unknown, Error: No such file or directory (os error 2) }, ] }" }, labels: {}, wire_version: None, source: None }', src/main.rs:16:70
stack backtrace:
   0:     0x558c9867b9a0 - std::backtrace_rs::backtrace::libunwind::trace::h32eb3e08e874dd27
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
   1:     0x558c9867b9a0 - std::backtrace_rs::backtrace::trace_unsynchronized::haa3f451d27bc11a5
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x558c9867b9a0 - std::sys_common::backtrace::_print_fmt::h5b94a01bb4289bb5
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/sys_common/backtrace.rs:66:5
   3:     0x558c9867b9a0 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::hb070b7fa7e3175df
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/sys_common/backtrace.rs:45:22
   4:     0x558c986a10de - core::fmt::write::hd5207aebbb9a86e9
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/core/src/fmt/mod.rs:1202:17
   5:     0x558c98675a15 - std::io::Write::write_fmt::h3bd699bbd129ab8a
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/io/mod.rs:1679:15
   6:     0x558c9867d1d3 - std::sys_common::backtrace::_print::h7a21be552fdf58da
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/sys_common/backtrace.rs:48:5
   7:     0x558c9867d1d3 - std::sys_common::backtrace::print::ha85c41fe4dd80b13
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/sys_common/backtrace.rs:35:9
   8:     0x558c9867d1d3 - std::panicking::default_hook::{{closure}}::h04cca40023d0eeca
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/panicking.rs:295:22
   9:     0x558c9867cebf - std::panicking::default_hook::haa3ca8c310ed5402
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/panicking.rs:314:9
  10:     0x558c9867d87a - std::panicking::rust_panic_with_hook::h7b190ce1a948faac
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/panicking.rs:698:17
  11:     0x558c9867d777 - std::panicking::begin_panic_handler::{{closure}}::hbafbfdc3e1b97f68
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/panicking.rs:588:13
  12:     0x558c9867be4c - std::sys_common::backtrace::__rust_end_short_backtrace::hda93e5fef243b4c0
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/sys_common/backtrace.rs:138:18
  13:     0x558c9867d492 - rust_begin_unwind
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/panicking.rs:584:5
  14:     0x558c97b3d373 - core::panicking::panic_fmt::h8d17ca1073d9a733
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/core/src/panicking.rs:142:14
  15:     0x558c97b3d4c3 - core::result::unwrap_failed::hfaddf24b248137d3
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/core/src/result.rs:1785:5
  16:     0x558c97b6c8b8 - core::result::Result<T,E>::unwrap::h7cfaf9f63865626d
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/core/src/result.rs:1107:23
  17:     0x558c97b4e432 - rust_consumer::main::hab342cdb996c6973
                               at /workspaces/HostelMan/document-verification/rust-consumer/src/main.rs:16:20
  18:     0x558c97b3d9db - core::ops::function::FnOnce::call_once::ha36fa24bcea7fbf0
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/core/src/ops/function.rs:248:5
  19:     0x558c97b4ea3e - std::sys_common::backtrace::__rust_begin_short_backtrace::hf46ea52f7fc1b996
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/sys_common/backtrace.rs:122:18
  20:     0x558c97b4fed1 - std::rt::lang_start::{{closure}}::h9ec016e26b03fa68
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/rt.rs:166:18
  21:     0x558c986722af - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::hb69be6e0857c6cfb
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/core/src/ops/function.rs:283:13
  22:     0x558c986722af - std::panicking::try::do_call::h396dfc441ee9c786
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/panicking.rs:492:40
  23:     0x558c986722af - std::panicking::try::h6cdda972d28b3a4f
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/panicking.rs:456:19
  24:     0x558c986722af - std::panic::catch_unwind::h376039ec264e8ef9
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/panic.rs:137:14
  25:     0x558c986722af - std::rt::lang_start_internal::{{closure}}::hc94720ca3d4cb727
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/rt.rs:148:48
  26:     0x558c986722af - std::panicking::try::do_call::h2422fb95933fa2d5
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/panicking.rs:492:40
  27:     0x558c986722af - std::panicking::try::h488286b5ec8333ff
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/panicking.rs:456:19
  28:     0x558c986722af - std::panic::catch_unwind::h81636549836d2a25
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/panic.rs:137:14
  29:     0x558c986722af - std::rt::lang_start_internal::h6ba1bb743c1e9df9
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/rt.rs:148:20
  30:     0x558c97b4feaa - std::rt::lang_start::h65289c0e3cdf7e56
                               at /rustc/897e37553bba8b42751c67658967889d11ecd120/library/std/src/rt.rs:165:17
  31:     0x558c97b4ea21 - main
  32:     0x7f20c1cbed0a - __libc_start_main
  33:     0x558c97b3d6aa - _start
  34:                0x0 - <unknown>

Here’s my code:

fn db_init() -> Client {
    // Path to certificate
    let mongo_certificate = env::var("MONGODB_CERTIFICATE").unwrap();

    // MongoDB connection URI
    let uri = "mongodb+srv://hosteldb.e3ayhyn.mongodb.net/?retryWrites=true&w=majority&authSource=%24external&authMechanism=MONGODB-X509&tlsCertificateKeyFile=".to_owned()+ &mongo_certificate;

    println!("{}", uri);

    let client_options = ClientOptions::parse(uri).unwrap();

    // Get a handle to the cluster
    let client = Client::with_options(client_options).unwrap();

    // List the names of the databases in that cluster
    for db_name in client.list_database_names(None, None) {
        println!("{:?}", db_name.len());
    }

    // Ping the server to see if you can connect to the cluster
    client
        .database("University")
        .run_command(doc! {"ping": 1}, None)
        .unwrap();
    println!("Connected successfully.");

    client
}

I have it running in a docker container. Go driver in same setting and on same network works perfectly fine. I don’t understand the issue.

Is the certificate referenced built in to the image or correctly bind mounted in the container ?

I know different drivers evaluate relative paths of certificate files differently. The Go driver evaluates relative paths based on the current working directory of the running binary (usually the current directory of the shell used to run the binary). I’m not sure how the Rust driver evaluates relative paths of certificate files.