remove attempt at parsing json out of config

This commit is contained in:
mbecker20
2024-08-10 14:27:58 -07:00
parent c7717fbfdf
commit e1b9367ee3
7 changed files with 12 additions and 167 deletions
+4 -18
View File
@@ -16,7 +16,7 @@ use crate::{
interpolate_variables_secrets_into_environment, periphery_client,
stack::{
execute::execute_compose, get_stack_and_server,
json::get_config_jsons, services::extract_services_into_res,
services::extract_services_into_res,
},
update::update_update,
},
@@ -91,11 +91,7 @@ impl Resolve<DeployStack, (User, Update)> for State {
update.logs.extend(logs);
let update_info = async {
let (latest_services, json, json_errors) = if !file_contents
.is_empty()
{
let (jsons, json_errors) =
get_config_jsons(&file_contents).await;
let latest_services = if !file_contents.is_empty() {
let mut services = Vec::new();
for contents in &file_contents {
if let Err(e) = extract_services_into_res(
@@ -109,10 +105,10 @@ impl Resolve<DeployStack, (User, Update)> for State {
);
}
}
(services, jsons, json_errors)
services
} else {
// maybe better to do something else here for services.
(stack.info.latest_services.clone(), Vec::new(), Vec::new())
stack.info.latest_services.clone()
};
let project_name = stack.project_name(true);
@@ -120,16 +116,12 @@ impl Resolve<DeployStack, (User, Update)> for State {
let (
deployed_services,
deployed_contents,
deployed_json,
deployed_json_errors,
deployed_hash,
deployed_message,
) = if deployed {
(
Some(latest_services.clone()),
Some(file_contents.clone()),
Some(json.clone()),
Some(json_errors.clone()),
commit_hash.clone(),
commit_message.clone(),
)
@@ -137,8 +129,6 @@ impl Resolve<DeployStack, (User, Update)> for State {
(
stack.info.deployed_services,
stack.info.deployed_contents,
stack.info.deployed_json,
stack.info.deployed_json_errors,
stack.info.deployed_hash,
stack.info.deployed_message,
)
@@ -151,11 +141,7 @@ impl Resolve<DeployStack, (User, Update)> for State {
deployed_contents,
deployed_hash,
deployed_message,
deployed_json,
deployed_json_errors,
latest_services,
latest_json: json,
latest_json_errors: json_errors,
remote_contents: stack
.config
.file_contents
+8 -27
View File
@@ -6,7 +6,7 @@ use monitor_client::{
config::core::CoreConfig,
monitor_timestamp,
permission::PermissionLevel,
stack::{ComposeContents, PartialStackConfig, Stack, StackInfo},
stack::{PartialStackConfig, Stack, StackInfo},
update::Update,
user::User,
NoData, Operation,
@@ -25,7 +25,7 @@ use crate::{
config::core_config,
helpers::{
stack::{
json::get_config_jsons, remote::get_remote_compose_contents,
remote::get_remote_compose_contents,
services::extract_services_into_res,
},
update::{add_update, make_update},
@@ -176,7 +176,11 @@ impl Resolve<RenameStack, User> for State {
}
impl Resolve<RefreshStackCache, User> for State {
#[instrument(name = "RefreshStackCache", level = "debug", skip(self, user))]
#[instrument(
name = "RefreshStackCache",
level = "debug",
skip(self, user)
)]
async fn resolve(
&self,
RefreshStackCache { stack }: RefreshStackCache,
@@ -202,8 +206,6 @@ impl Resolve<RefreshStackCache, User> for State {
let (
latest_services,
latest_json,
latest_json_errors,
remote_contents,
remote_errors,
latest_hash,
@@ -237,13 +239,8 @@ impl Resolve<RefreshStackCache, User> for State {
}
}
let (jsons, json_errors) =
get_config_jsons(&remote_contents).await;
(
services,
jsons,
json_errors,
Some(remote_contents),
Some(remote_errors),
latest_hash,
@@ -263,19 +260,7 @@ impl Resolve<RefreshStackCache, User> for State {
);
services.extend(stack.info.latest_services);
};
let (json, json_errors) =
get_config_jsons(&[ComposeContents {
path: stack
.config
.file_paths
.first()
.map(String::as_str)
.unwrap_or("compose.yaml")
.to_string(),
contents: stack.config.file_contents,
}])
.await;
(services, json, json_errors, None, None, None, None)
(services, None, None, None, None)
};
let info = StackInfo {
@@ -285,11 +270,7 @@ impl Resolve<RefreshStackCache, User> for State {
deployed_contents: stack.info.deployed_contents,
deployed_hash: stack.info.deployed_hash,
deployed_message: stack.info.deployed_message,
deployed_json: stack.info.deployed_json,
deployed_json_errors: stack.info.deployed_json_errors,
latest_services,
latest_json,
latest_json_errors,
remote_contents,
remote_errors,
latest_hash,
-80
View File
@@ -1,80 +0,0 @@
use anyhow::Context;
use formatting::format_serror;
use monitor_client::entities::stack::ComposeContents;
use run_command::async_run_command;
use tokio::fs;
use crate::{config::core_config, helpers::random_string};
// Returns (Jsons, Errors)
pub async fn get_config_jsons(
contents: &[ComposeContents],
) -> (Vec<ComposeContents>, Vec<ComposeContents>) {
let mut oks = Vec::new();
let mut errs = Vec::new();
for contents in contents {
match get_config_json(&contents.contents).await {
(Some(json), _) => oks.push(ComposeContents {
path: contents.path.to_string(),
contents: json,
}),
(_, Some(err)) => errs.push(ComposeContents {
path: contents.path.to_string(),
contents: err,
}),
_ => unreachable!(),
}
}
(oks, errs)
}
pub async fn get_config_json(
compose_contents: &str,
) -> (Option<String>, Option<String>) {
match get_config_json_inner(compose_contents).await {
Ok(res) => (Some(res), None),
Err(e) => (
None,
Some(format_serror(
&e.context("failed to get config json").into(),
)),
),
}
}
async fn get_config_json_inner(
compose_contents: &str,
) -> anyhow::Result<String> {
// create a new folder to prevent collisions
let dir = core_config().repo_directory.join(random_string(10));
fs::create_dir_all(&dir)
.await
.context("failed to create compose file directory")?;
let file = dir.join("compose.yaml");
fs::write(&file, compose_contents).await.with_context(|| {
format!("failed to write compose contents to file file: {file:?}")
})?;
let res = async_run_command(&format!(
"cd {} && docker-compose config --format json",
dir.display()
))
.await;
// Don't fail the function call here, just log on this maintenance related information.
fs::remove_dir_all(&dir)
.await
.with_context(|| {
format!("failed to clean up compose directory: {dir:?}")
})
.inspect_err(|e| error!("{e:#}"))
.ok();
if res.success() {
Ok(res.stdout)
} else {
Err(anyhow::Error::msg(res.stderr))
}
}
-1
View File
@@ -22,7 +22,6 @@ use crate::{
use super::query::get_server_with_status;
pub mod execute;
pub mod json;
pub mod remote;
pub mod services;
-12
View File
@@ -138,24 +138,12 @@ pub struct StackInfo {
pub deployed_hash: Option<String>,
/// Deployed commit message, or null. Only for repo based stacks
pub deployed_message: Option<String>,
/// Cached json representation of the deployed compose file contents
/// Obtained by calling `docker compose config`. Will be of the deployed config if it exists.
pub deployed_json: Option<Vec<ComposeContents>>,
/// If there was an error in calling `docker compose config`, the message will be here with the associated file path.
pub deployed_json_errors: Option<Vec<ComposeContents>>,
/// The deployed compose file contents. This is updated whenever Monitor successfully deploys the stack.
pub deployed_contents: Option<Vec<ComposeContents>>,
/// The deployed service names.
/// This is updated whenever it is empty, or deployed contents is updated.
pub deployed_services: Option<Vec<StackServiceNames>>,
/// Cached json representation of the compose file contents.
/// Obtained by calling `docker compose config`. Will be of the latest config, not the deployed config.
#[serde(default)]
pub latest_json: Vec<ComposeContents>,
/// If there was an error in calling `docker compose config` on the latest contents, the message will be here
#[serde(default)]
pub latest_json_errors: Vec<ComposeContents>,
/// The latest service names.
/// This is updated whenever the stack cache refreshes, using the latest file contents (either db defined or remote).
#[serde(default)]
-14
View File
@@ -1566,13 +1566,6 @@ export interface StackInfo {
deployed_hash?: string;
/** Deployed commit message, or null. Only for repo based stacks */
deployed_message?: string;
/**
* Cached json representation of the deployed compose file contents
* Obtained by calling `docker compose config`. Will be of the deployed config if it exists.
*/
deployed_json?: ComposeContents[];
/** If there was an error in calling `docker compose config`, the message will be here with the associated file path. */
deployed_json_errors?: ComposeContents[];
/** The deployed compose file contents. This is updated whenever Monitor successfully deploys the stack. */
deployed_contents?: ComposeContents[];
/**
@@ -1580,13 +1573,6 @@ export interface StackInfo {
* This is updated whenever it is empty, or deployed contents is updated.
*/
deployed_services?: StackServiceNames[];
/**
* Cached json representation of the compose file contents.
* Obtained by calling `docker compose config`. Will be of the latest config, not the deployed config.
*/
latest_json?: ComposeContents[];
/** If there was an error in calling `docker compose config` on the latest contents, the message will be here */
latest_json_errors?: ComposeContents[];
/**
* The latest service names.
* This is updated whenever the stack cache refreshes, using the latest file contents (either db defined or remote).
@@ -25,7 +25,6 @@ export const StackInfo = ({
{stack?.info?.deployed_contents?.map((content) => (
<pre className="flex flex-col gap-2">
path: {content.path}
<pre>{content.contents}</pre>
</pre>
))}
@@ -72,20 +71,6 @@ export const StackInfo = ({
</CardHeader>
</Card>
)}
{stack?.info?.latest_json_errors &&
stack?.info?.latest_json_errors.length > 0 && (
<Card>
<CardHeader>
parsing errors:{" "}
{stack?.info?.latest_json_errors?.map((content) => (
<pre className="flex flex-col gap-2">
path: {content.path}
<pre>{content.contents}</pre>
</pre>
))}
</CardHeader>
</Card>
)}
</Section>
);
};