Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add cockroach-admin dropshot server #5822

Merged
merged 11 commits into from
May 29, 2024
30 changes: 30 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ members = [
"clients/oximeter-client",
"clients/sled-agent-client",
"clients/wicketd-client",
"cockroach-admin",
"common",
"dev-tools/crdb-seed",
"dev-tools/omdb",
Expand Down Expand Up @@ -96,6 +97,7 @@ default-members = [
"clients/oximeter-client",
"clients/sled-agent-client",
"clients/wicketd-client",
"cockroach-admin",
"common",
"dev-tools/crdb-seed",
"dev-tools/omdb",
Expand Down Expand Up @@ -338,6 +340,7 @@ nexus-test-utils = { path = "nexus/test-utils" }
nexus-types = { path = "nexus/types" }
num-integer = "0.1.46"
num = { version = "0.4.3", default-features = false, features = [ "libm" ] }
omicron-cockroach-admin = { path = "cockroach-admin" }
omicron-common = { path = "common" }
omicron-gateway = { path = "gateway" }
omicron-nexus = { path = "nexus" }
Expand Down Expand Up @@ -483,6 +486,7 @@ typed-rng = { path = "typed-rng" }
unicode-width = "0.1.11"
update-common = { path = "update-common" }
update-engine = { path = "update-engine" }
url = "2.5.0"
usdt = "0.5.0"
uuid = { version = "1.8.0", features = ["serde", "v4"] }
uzers = "0.11"
Expand Down
40 changes: 40 additions & 0 deletions cockroach-admin/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
[package]
name = "omicron-cockroach-admin"
version = "0.1.0"
edition = "2021"
license = "MPL-2.0"

[build-dependencies]
omicron-rpaths.workspace = true

[dependencies]
anyhow.workspace = true
camino.workspace = true
chrono.workspace = true
clap.workspace = true
csv.workspace = true
dropshot.workspace = true
http.workspace = true
illumos-utils.workspace = true
omicron-common.workspace = true
# See omicron-rpaths for more about the "pq-sys" dependency.
pq-sys = "*"
Comment on lines +20 to +21
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a little surprised we need this + the build.rs script. I thought we would have needed this to get access to a copy of postgres - this is normally necessary for Diesel, but is it also necessary to invoke the CLI?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's required by the unit tests that want to spin up cockroach. I could maybe change this to a dev-dependency, but then I have to tweak the build script to also only set rpaths when building for tests? Seems fine-ish, although we have that

// NOTE: This file MUST be kept in sync with the other build.rs files in this
// repository.

bit in the copy-paste build.rs that wouldn't be valid anymore.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ahhhh, gotcha, because the unit test scaffolding is making calls with diesel? no objection to this as-is, just was curious

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess so - I didn't really look into it when I saw the rpath failure in CI.

schemars.workspace = true
slog.workspace = true
slog-async.workspace = true
slog-dtrace.workspace = true
slog-error-chain.workspace = true
serde.workspace = true
thiserror.workspace = true
tokio.workspace = true
toml.workspace = true

omicron-workspace-hack.workspace = true

[dev-dependencies]
nexus-test-utils.workspace = true
omicron-test-utils.workspace = true
url.workspace = true

[lints]
workspace = true
10 changes: 10 additions & 0 deletions cockroach-admin/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.

// See omicron-rpaths for documentation.
// NOTE: This file MUST be kept in sync with the other build.rs files in this
// repository.
fn main() {
omicron_rpaths::configure_default_omicron_rpaths();
}
79 changes: 79 additions & 0 deletions cockroach-admin/src/bin/cockroach-admin.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.

//! Executable program to run the Omicron CockroachDb admin interface (not to be
//! confused with CockroachDb's built-in HTTP API)

use anyhow::anyhow;
use camino::Utf8PathBuf;
use clap::Parser;
use omicron_cockroach_admin::CockroachCli;
use omicron_cockroach_admin::Config;
use omicron_common::cmd::fatal;
use omicron_common::cmd::CmdError;
use std::net::SocketAddr;
use std::net::SocketAddrV6;

#[derive(Debug, Parser)]
#[clap(name = "cockroach-admin", about = "Omicron CRDB cluster admin server")]
enum Args {
/// Print the OpenAPI Spec document and exit
Openapi,

/// Start the CRDB admin server
Run {
/// Path to the `cockroach` CLI
#[clap(long, action)]
path_to_cockroach_binary: Utf8PathBuf,

/// Socket address for a running cockroach server instance
#[clap(long, action)]
cockroach_address: SocketAddrV6,

/// Address on which this server should run
#[clap(long, action)]
http_address: SocketAddrV6,

/// Path to the server config file
#[clap(long, action)]
config_file_path: Utf8PathBuf,
},
}

#[tokio::main]
async fn main() {
if let Err(err) = main_impl().await {
fatal(err);
}
}

async fn main_impl() -> Result<(), CmdError> {
let args = Args::parse();

match args {
Args::Openapi => omicron_cockroach_admin::run_openapi()
.map_err(|e| CmdError::Failure(anyhow!(e))),
Args::Run {
path_to_cockroach_binary,
cockroach_address,
http_address,
config_file_path,
} => {
let cockroach_cli =
CockroachCli::new(path_to_cockroach_binary, cockroach_address);
let mut config = Config::from_file(&config_file_path)
.map_err(|err| CmdError::Failure(anyhow!(err)))?;
config.dropshot.bind_address = SocketAddr::V6(http_address);
let server =
omicron_cockroach_admin::start_server(cockroach_cli, config)
.await
.map_err(|err| CmdError::Failure(anyhow!(err)))?;
server.await.map_err(|err| {
CmdError::Failure(anyhow!(
"server failed after starting: {err}"
))
})
}
}
}
Loading
Loading