-
Notifications
You must be signed in to change notification settings - Fork 42
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'origin/main' into ixi/remove-service-ba…
…re-ip-resolution
- Loading branch information
Showing
85 changed files
with
2,827 additions
and
662 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
[package] | ||
name = "omicron-clickhouse-admin" | ||
version = "0.1.0" | ||
edition = "2021" | ||
license = "MPL-2.0" | ||
|
||
[dependencies] | ||
anyhow.workspace = true | ||
camino.workspace = true | ||
chrono.workspace = true | ||
clap.workspace = true | ||
clickhouse-admin-api.workspace = true | ||
dropshot.workspace = true | ||
http.workspace = true | ||
illumos-utils.workspace = true | ||
omicron-common.workspace = true | ||
omicron-uuid-kinds.workspace = true | ||
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 | ||
tokio-postgres.workspace = true | ||
toml.workspace = true | ||
|
||
omicron-workspace-hack.workspace = true | ||
|
||
[dev-dependencies] | ||
expectorate.workspace = true | ||
nexus-test-utils.workspace = true | ||
omicron-test-utils.workspace = true | ||
openapi-lint.workspace = true | ||
openapiv3.workspace = true | ||
serde_json.workspace = true | ||
subprocess.workspace = true | ||
url.workspace = true | ||
|
||
[lints] | ||
workspace = true |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
[package] | ||
name = "clickhouse-admin-api" | ||
version = "0.1.0" | ||
edition = "2021" | ||
license = "MPL-2.0" | ||
|
||
[lints] | ||
workspace = true | ||
|
||
[dependencies] | ||
dropshot.workspace = true | ||
omicron-common.workspace = true | ||
omicron-uuid-kinds.workspace = true | ||
omicron-workspace-hack.workspace = true | ||
schemars.workspace = true | ||
serde.workspace = true |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
// 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/. | ||
|
||
use dropshot::{HttpError, HttpResponseOk, RequestContext}; | ||
use schemars::JsonSchema; | ||
use serde::{Deserialize, Serialize}; | ||
use std::net::SocketAddrV6; | ||
|
||
#[dropshot::api_description] | ||
pub trait ClickhouseAdminApi { | ||
type Context; | ||
|
||
/// Retrieve the address the ClickHouse server or keeper node is listening on | ||
#[endpoint { | ||
method = GET, | ||
path = "/node/address", | ||
}] | ||
async fn clickhouse_address( | ||
rqctx: RequestContext<Self::Context>, | ||
) -> Result<HttpResponseOk<ClickhouseAddress>, HttpError>; | ||
} | ||
|
||
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, JsonSchema)] | ||
#[serde(rename_all = "snake_case")] | ||
pub struct ClickhouseAddress { | ||
pub clickhouse_address: SocketAddrV6, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
// 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 ClickHouse admin interface | ||
use anyhow::anyhow; | ||
use camino::Utf8PathBuf; | ||
use clap::Parser; | ||
use omicron_clickhouse_admin::{Clickward, Config}; | ||
use omicron_common::cmd::fatal; | ||
use omicron_common::cmd::CmdError; | ||
use std::net::{SocketAddr, SocketAddrV6}; | ||
|
||
#[derive(Debug, Parser)] | ||
#[clap( | ||
name = "clickhouse-admin", | ||
about = "Omicron ClickHouse cluster admin server" | ||
)] | ||
enum Args { | ||
/// Start the ClickHouse admin server | ||
Run { | ||
// TODO: This address is solely for testing now. We should remove it | ||
// once we have more endpoints up and running. | ||
/// Socket address for a running clickhouse server or keeper instance | ||
#[clap(long, short = 'a', action)] | ||
clickhouse_address: SocketAddrV6, | ||
|
||
/// Address on which this server should run | ||
#[clap(long, short = 'H', action)] | ||
http_address: SocketAddrV6, | ||
|
||
/// Path to the server configuration file | ||
#[clap(long, short, action)] | ||
config: 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::Run { clickhouse_address, http_address, config } => { | ||
let mut config = Config::from_file(&config) | ||
.map_err(|err| CmdError::Failure(anyhow!(err)))?; | ||
config.dropshot.bind_address = SocketAddr::V6(http_address); | ||
|
||
let clickward = Clickward::new(clickhouse_address); | ||
|
||
let server = | ||
omicron_clickhouse_admin::start_server(clickward, config) | ||
.await | ||
.map_err(|err| CmdError::Failure(anyhow!(err)))?; | ||
server.await.map_err(|err| { | ||
CmdError::Failure(anyhow!( | ||
"server failed after starting: {err}" | ||
)) | ||
}) | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
// 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/. | ||
|
||
use clickhouse_admin_api::ClickhouseAddress; | ||
use dropshot::HttpError; | ||
use slog_error_chain::{InlineErrorChain, SlogInlineError}; | ||
use std::io; | ||
use std::net::SocketAddrV6; | ||
|
||
#[derive(Debug, thiserror::Error, SlogInlineError)] | ||
pub enum ClickwardError { | ||
#[error("clickward failure")] | ||
Failure { | ||
#[source] | ||
err: io::Error, | ||
}, | ||
} | ||
|
||
impl From<ClickwardError> for HttpError { | ||
fn from(err: ClickwardError) -> Self { | ||
match err { | ||
ClickwardError::Failure { .. } => { | ||
let message = InlineErrorChain::new(&err).to_string(); | ||
HttpError { | ||
status_code: http::StatusCode::INTERNAL_SERVER_ERROR, | ||
error_code: Some(String::from("Internal")), | ||
external_message: message.clone(), | ||
internal_message: message, | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
#[derive(Debug)] | ||
pub struct Clickward { | ||
clickhouse_address: SocketAddrV6, | ||
} | ||
|
||
impl Clickward { | ||
pub fn new(clickhouse_address: SocketAddrV6) -> Self { | ||
Self { clickhouse_address } | ||
} | ||
|
||
pub fn clickhouse_address( | ||
&self, | ||
) -> Result<ClickhouseAddress, ClickwardError> { | ||
Ok(ClickhouseAddress { clickhouse_address: self.clickhouse_address }) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
// 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/. | ||
|
||
use camino::Utf8Path; | ||
use camino::Utf8PathBuf; | ||
use dropshot::ConfigDropshot; | ||
use dropshot::ConfigLogging; | ||
use serde::Deserialize; | ||
use serde::Serialize; | ||
use slog_error_chain::SlogInlineError; | ||
use std::io; | ||
|
||
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] | ||
pub struct Config { | ||
pub dropshot: ConfigDropshot, | ||
pub log: ConfigLogging, | ||
} | ||
impl Config { | ||
/// Load a `Config` from the given TOML file | ||
pub fn from_file(path: &Utf8Path) -> Result<Self, LoadError> { | ||
let contents = std::fs::read_to_string(path) | ||
.map_err(|err| LoadError::Read { path: path.to_owned(), err })?; | ||
toml::de::from_str(&contents) | ||
.map_err(|err| LoadError::Parse { path: path.to_owned(), err }) | ||
} | ||
} | ||
|
||
#[derive(Debug, thiserror::Error, SlogInlineError)] | ||
pub enum LoadError { | ||
#[error("failed to read {path}")] | ||
Read { | ||
path: Utf8PathBuf, | ||
#[source] | ||
err: io::Error, | ||
}, | ||
#[error("failed to parse {path} as TOML")] | ||
Parse { | ||
path: Utf8PathBuf, | ||
#[source] | ||
err: toml::de::Error, | ||
}, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
// 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/. | ||
|
||
use crate::Clickward; | ||
use slog::Logger; | ||
|
||
pub struct ServerContext { | ||
clickward: Clickward, | ||
_log: Logger, | ||
} | ||
|
||
impl ServerContext { | ||
pub fn new(clickward: Clickward, _log: Logger) -> Self { | ||
Self { clickward, _log } | ||
} | ||
|
||
pub fn clickward(&self) -> &Clickward { | ||
&self.clickward | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// 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/. | ||
|
||
use crate::context::ServerContext; | ||
use clickhouse_admin_api::*; | ||
use dropshot::HttpError; | ||
use dropshot::HttpResponseOk; | ||
use dropshot::RequestContext; | ||
use std::sync::Arc; | ||
|
||
type ClickhouseApiDescription = dropshot::ApiDescription<Arc<ServerContext>>; | ||
|
||
pub fn api() -> ClickhouseApiDescription { | ||
clickhouse_admin_api_mod::api_description::<ClickhouseAdminImpl>() | ||
.expect("registered entrypoints") | ||
} | ||
|
||
enum ClickhouseAdminImpl {} | ||
|
||
impl ClickhouseAdminApi for ClickhouseAdminImpl { | ||
type Context = Arc<ServerContext>; | ||
|
||
async fn clickhouse_address( | ||
rqctx: RequestContext<Self::Context>, | ||
) -> Result<HttpResponseOk<ClickhouseAddress>, HttpError> { | ||
let ctx = rqctx.context(); | ||
let output = ctx.clickward().clickhouse_address()?; | ||
Ok(HttpResponseOk(output)) | ||
} | ||
} |
Oops, something went wrong.