Files
komodo/bin/migrator/src/legacy/v0/mod.rs
2024-04-17 18:19:52 -07:00

337 lines
7.0 KiB
Rust

use std::collections::HashMap;
use anyhow::{anyhow, Context};
use chrono::{DateTime, LocalResult, SecondsFormat, TimeZone, Utc};
use serde::{Deserialize, Serialize};
pub mod traits;
mod action;
mod alert;
mod build;
mod config;
mod deployment;
mod group;
mod periphery_command;
mod procedure;
mod server;
mod update;
mod user;
pub use action::*;
pub use alert::*;
pub use build::*;
pub use config::*;
pub use deployment::*;
pub use group::*;
pub use periphery_command::*;
pub use procedure::*;
pub use server::*;
pub use update::*;
pub use user::*;
pub type PermissionsMap = HashMap<String, PermissionLevel>;
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct CloneArgs {
pub name: String,
pub repo: Option<String>,
pub branch: Option<String>,
pub on_clone: Option<Command>,
pub on_pull: Option<Command>,
pub github_account: Option<GithubUsername>,
}
#[derive(
Serialize, Deserialize, Debug, Default, Clone, PartialEq, Eq,
)]
pub struct Command {
#[serde(default)]
pub path: String,
#[serde(default)]
pub command: String,
}
#[derive(
Serialize, Deserialize, Debug, Clone, Default, PartialEq,
)]
pub struct EnvironmentVar {
pub variable: String,
pub value: String,
}
impl From<EnvironmentVar>
for monitor_client::entities::EnvironmentVar
{
fn from(value: EnvironmentVar) -> Self {
Self {
variable: value.variable,
value: value.value,
}
}
}
#[derive(Deserialize, Debug)]
pub struct UserCredentials {
pub username: String,
pub password: String,
}
#[derive(
Serialize, Deserialize, Debug, PartialEq, Hash, Eq, Clone, Copy,
)]
#[serde(rename_all = "snake_case")]
pub enum AccountType {
Github,
Docker,
}
#[derive(
Serialize,
Deserialize,
Debug,
Default,
PartialEq,
Hash,
Eq,
Clone,
Copy,
)]
#[serde(rename_all = "snake_case")]
pub enum Operation {
// do nothing
#[default]
None,
// server
CreateServer,
UpdateServer,
DeleteServer,
PruneImagesServer,
PruneContainersServer,
PruneNetworksServer,
RenameServer,
// build
CreateBuild,
UpdateBuild,
DeleteBuild,
BuildBuild,
// deployment
CreateDeployment,
UpdateDeployment,
DeleteDeployment,
DeployContainer,
StopContainer,
StartContainer,
RemoveContainer,
PullDeployment,
RecloneDeployment,
RenameDeployment,
// procedure
CreateProcedure,
UpdateProcedure,
DeleteProcedure,
// command
CreateCommand,
UpdateCommand,
DeleteCommand,
RunCommand,
// group
CreateGroup,
UpdateGroup,
DeleteGroup,
// user
ModifyUserEnabled,
ModifyUserCreateServerPermissions,
ModifyUserCreateBuildPermissions,
ModifyUserPermissions,
// github webhook automation
AutoBuild,
AutoPull,
}
impl From<Operation> for monitor_client::entities::Operation {
fn from(value: Operation) -> Self {
use monitor_client::entities::Operation::*;
match value {
Operation::None => None,
Operation::CreateServer => CreateServer,
Operation::UpdateServer => UpdateServer,
Operation::DeleteServer => DeleteServer,
Operation::PruneImagesServer => PruneImagesServer,
Operation::PruneContainersServer => PruneContainersServer,
Operation::PruneNetworksServer => PruneNetworksServer,
Operation::RenameServer => RenameServer,
Operation::CreateBuild => CreateBuild,
Operation::UpdateBuild => UpdateBuild,
Operation::DeleteBuild => DeleteBuild,
Operation::BuildBuild => RunBuild,
Operation::CreateDeployment => CreateDeployment,
Operation::UpdateDeployment => UpdateDeployment,
Operation::DeleteDeployment => DeleteDeployment,
Operation::DeployContainer => DeployContainer,
Operation::StopContainer => StopContainer,
Operation::StartContainer => StartContainer,
Operation::RemoveContainer => RemoveContainer,
Operation::PullDeployment => None,
Operation::RecloneDeployment => None,
Operation::RenameDeployment => RenameDeployment,
Operation::CreateProcedure => None,
Operation::UpdateProcedure => None,
Operation::DeleteProcedure => None,
Operation::CreateCommand => None,
Operation::UpdateCommand => None,
Operation::DeleteCommand => None,
Operation::RunCommand => None,
Operation::CreateGroup => None,
Operation::UpdateGroup => None,
Operation::DeleteGroup => None,
Operation::ModifyUserEnabled => None,
Operation::ModifyUserCreateServerPermissions => None,
Operation::ModifyUserCreateBuildPermissions => None,
Operation::ModifyUserPermissions => None,
Operation::AutoBuild => RunBuild,
Operation::AutoPull => PullRepo,
}
}
}
#[derive(
Serialize,
Deserialize,
Debug,
Hash,
Clone,
Copy,
PartialEq,
Eq,
PartialOrd,
Ord,
Default,
)]
#[serde(rename_all = "snake_case")]
pub enum PermissionLevel {
#[default]
None,
Read,
Execute,
Update,
}
impl Default for &PermissionLevel {
fn default() -> Self {
&PermissionLevel::None
}
}
impl From<PermissionLevel>
for monitor_client::entities::permission::PermissionLevel
{
fn from(value: PermissionLevel) -> Self {
use monitor_client::entities::permission::PermissionLevel::*;
match value {
PermissionLevel::None => None,
PermissionLevel::Read => Read,
PermissionLevel::Execute => Execute,
PermissionLevel::Update => Write,
}
}
}
#[derive(
Serialize, Deserialize, Debug, PartialEq, Hash, Eq, Clone, Copy,
)]
#[serde(rename_all = "snake_case")]
pub enum PermissionsTarget {
Server,
Deployment,
Build,
Procedure,
Group,
}
#[derive(
Serialize,
Deserialize,
Debug,
PartialEq,
Hash,
Eq,
Clone,
Copy,
Default,
)]
#[serde(rename_all = "snake_case")]
pub enum Timelength {
#[serde(rename = "1-sec")]
OneSecond,
#[serde(rename = "5-sec")]
FiveSeconds,
#[serde(rename = "10-sec")]
TenSeconds,
#[serde(rename = "15-sec")]
FifteenSeconds,
#[serde(rename = "30-sec")]
ThirtySeconds,
#[default]
#[serde(rename = "1-min")]
OneMinute,
#[serde(rename = "2-min")]
TwoMinutes,
#[serde(rename = "5-min")]
FiveMinutes,
#[serde(rename = "10-min")]
TenMinutes,
#[serde(rename = "15-min")]
FifteenMinutes,
#[serde(rename = "30-min")]
ThirtyMinutes,
#[serde(rename = "1-hr")]
OneHour,
#[serde(rename = "2-hr")]
TwoHours,
#[serde(rename = "6-hr")]
SixHours,
#[serde(rename = "8-hr")]
EightHours,
#[serde(rename = "12-hr")]
TwelveHours,
#[serde(rename = "1-day")]
OneDay,
#[serde(rename = "3-day")]
ThreeDay,
#[serde(rename = "1-wk")]
OneWeek,
#[serde(rename = "2-wk")]
TwoWeeks,
#[serde(rename = "30-day")]
ThirtyDays,
}
pub fn unix_from_monitor_ts(ts: &str) -> anyhow::Result<i64> {
Ok(
DateTime::parse_from_rfc3339(ts)
.context("failed to parse rfc3339 timestamp")?
.timestamp_millis(),
)
}
pub fn monitor_ts_from_unix(ts: i64) -> anyhow::Result<String> {
match Utc.timestamp_millis_opt(ts) {
LocalResult::Single(dt) => {
Ok(dt.to_rfc3339_opts(SecondsFormat::Millis, false))
}
LocalResult::None => {
Err(anyhow!("out of bounds timestamp passed"))
}
_ => unreachable!(),
}
}