Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions crates/stackable-operator/src/builder/pod/container.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::fmt;
use std::{borrow::Borrow, fmt};

use indexmap::IndexMap;
use k8s_openapi::api::core::v1::{
Expand Down Expand Up @@ -175,8 +175,14 @@ impl ContainerBuilder {
self
}

pub fn add_env_vars(&mut self, env_vars: Vec<EnvVar>) -> &mut Self {
self.env.get_or_insert_with(Vec::new).extend(env_vars);
pub fn add_env_vars<I>(&mut self, env_vars: I) -> &mut Self
where
I: IntoIterator,
I::Item: std::borrow::Borrow<EnvVar>,
{
self.env
.get_or_insert_with(Vec::new)
.extend(env_vars.into_iter().map(|e| e.borrow().clone()));
self
}

Expand Down
20 changes: 20 additions & 0 deletions crates/stackable-operator/src/builder/pod/env.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
use k8s_openapi::api::core::v1::{EnvVar, EnvVarSource, SecretKeySelector};

pub fn env_var_from_secret(
env_var_name: impl Into<String>,
secret_name: impl Into<String>,
secret_key: impl Into<String>,
) -> EnvVar {
EnvVar {
name: env_var_name.into(),
value_from: Some(EnvVarSource {
secret_key_ref: Some(SecretKeySelector {
name: secret_name.into(),
key: secret_key.into(),
..Default::default()
}),
..Default::default()
}),
..Default::default()
}
}
1 change: 1 addition & 0 deletions crates/stackable-operator/src/builder/pod/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ use crate::{
};

pub mod container;
pub mod env;
pub mod probe;
pub mod resources;
pub mod security;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ impl GitSyncResources {
one_time,
container_log_config,
)])
.add_env_vars(env_vars.into())
.add_env_vars(env_vars)
.add_volume_mounts(volume_mounts.to_vec())
.context(AddVolumeMountSnafu)?
.resources(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ impl GitSyncResources {
one_time,
container_log_config,
)])
.add_env_vars(env_vars.into())
.add_env_vars(env_vars)
.add_volume_mounts(volume_mounts.to_vec())
.context(AddVolumeMountSnafu)?
.resources(
Expand Down
47 changes: 47 additions & 0 deletions crates/stackable-operator/src/databases/databases/derby.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use snafu::{ResultExt, Snafu};

use crate::databases::{
TemplatingMechanism,
drivers::jdbc::{JDBCDatabaseConnection, JDBCDatabaseConnectionDetails},
};

#[derive(Debug, Snafu)]
pub enum Error {
#[snafu(display("failed to parse connection URL"))]
ParseConnectionUrl { source: url::ParseError },
}

/// TODO docs
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DerbyConnection {
/// TODO docs, especially on default
pub location: Option<String>,
}

impl JDBCDatabaseConnection for DerbyConnection {
fn jdbc_connection_details_with_templating(
&self,
unique_database_name: &str,
_templating_mechanism: &TemplatingMechanism,
) -> Result<JDBCDatabaseConnectionDetails, crate::databases::Error> {
let location = self
.location
.clone()
.unwrap_or_else(|| format!("/tmp/derby/{unique_database_name}/derby.db"));
let connection_uri = format!("jdbc:derby:{location};create=true",);
let connection_uri = connection_uri.parse().context(ParseConnectionUrlSnafu)?;

Ok(JDBCDatabaseConnectionDetails {
// Sadly the Derby driver class name is a bit complicated, e.g. for HMS up to 4.1.x we used
// "org.apache.derby.jdbc.EmbeddedDriver",
// for HMS 4.2.x we used "org.apache.derby.iapi.jdbc.AutoloadedDriver".
driver: "org.apache.derby.jdbc.EmbeddedDriver".to_owned(),
connection_uri,
username_env: None,
password_env: None,
})
}
}
4 changes: 4 additions & 0 deletions crates/stackable-operator/src/databases/databases/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pub mod derby;
pub mod mysql;
pub mod postgresql;
pub mod redis;
79 changes: 79 additions & 0 deletions crates/stackable-operator/src/databases/databases/mysql.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
use std::collections::BTreeMap;

use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use snafu::{ResultExt, Snafu};

use crate::{
commons::networking::HostName,
databases::{
TemplatingMechanism,
drivers::jdbc::{JDBCDatabaseConnection, JDBCDatabaseConnectionDetails},
helpers::{connection_parameters_as_url_query_parameters, username_and_password_envs},
},
};

#[derive(Debug, Snafu)]
pub enum Error {
#[snafu(display("failed to parse connection URL"))]
ParseConnectionUrl { source: url::ParseError },
}

/// TODO docs
#[derive(Clone, Debug, Deserialize, JsonSchema, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MysqlConnection {
/// TODO docs
pub host: HostName,

/// TODO docs
#[serde(default = "MysqlConnection::default_port")]
pub port: u16,

/// TODO docs
pub database: String,

/// TODO docs
pub credentials_secret: String,

/// TODO docs
#[serde(default)]
pub parameters: BTreeMap<String, String>,
}

impl MysqlConnection {
fn default_port() -> u16 {
3306
}
}

impl JDBCDatabaseConnection for MysqlConnection {
fn jdbc_connection_details_with_templating(
&self,
unique_database_name: &str,
_templating_mechanism: &TemplatingMechanism,
) -> Result<JDBCDatabaseConnectionDetails, crate::databases::Error> {
let Self {
host,
port,
database,
credentials_secret,
parameters,
} = self;
let (username_env, password_env) =
username_and_password_envs(unique_database_name, credentials_secret);

let connection_uri = format!(
"jdbc:mysql://{host}:{port}/{database}{parameters}",
parameters = connection_parameters_as_url_query_parameters(parameters)
);
let connection_uri = connection_uri.parse().context(ParseConnectionUrlSnafu)?;

Ok(JDBCDatabaseConnectionDetails {
driver: "com.mysql.jdbc.Driver".to_owned(),
connection_uri,
username_env: Some(username_env),
password_env: Some(password_env),
})
}
}
Loading