mod private
{
use crate :: *;
use std ::
{
fs,
path :: { Path, PathBuf },
};
use error ::untyped ::Context;
use genfile_core ::
{
TemplateArchive,
WriteMode,
Value,
ParameterDescriptor,
};
#[ derive( Debug ) ]
pub struct DeployTemplate;
impl DeployTemplate
{
#[ must_use ]
#[ allow( clippy ::should_implement_trait, clippy ::too_many_lines ) ]
pub fn default() -> TemplateArchive
{
let mut archive = TemplateArchive ::new( "deploy" );
archive.add_parameter
(
ParameterDescriptor
{
parameter: "gcp_project_id".into(),
is_mandatory: true,
default_value: None,
description: None,
}
);
archive.add_parameter
(
ParameterDescriptor
{
parameter: "gcp_region".into(),
is_mandatory: false,
default_value: None,
description: None,
}
);
archive.add_parameter
(
ParameterDescriptor
{
parameter: "gcp_artifact_repo_name".into(),
is_mandatory: false,
default_value: None,
description: None,
}
);
archive.add_parameter
(
ParameterDescriptor
{
parameter: "docker_image_name".into(),
is_mandatory: false,
default_value: None,
description: None,
}
);
add_deploy_template_files( &mut archive );
archive
}
}
#[ allow( clippy ::too_many_lines ) ]
fn add_deploy_template_files( archive: &mut TemplateArchive )
{
archive.add_text_file
(
PathBuf ::from( "./.deploy_template.toml" ),
include_str!( "../../template/deploy/.deploy_template.toml.hbs" ),
WriteMode ::TomlExtend
);
archive.add_text_file
(
PathBuf ::from( "./Makefile" ),
include_str!( "../../template/deploy/Makefile.hbs" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./key/pack.sh" ),
include_str!( "../../template/deploy/key/pack.sh" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./key/readme.md" ),
include_str!( "../../template/deploy/key/readme.md" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/redeploy.sh" ),
include_str!( "../../template/deploy/deploy/redeploy.sh" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/cloud-init.tpl" ),
include_str!( "../../template/deploy/deploy/cloud-init.tpl.hbs" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/Dockerfile" ),
include_str!( "../../template/deploy/deploy/Dockerfile" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/readme.md" ),
include_str!( "../../template/deploy/deploy/readme.md" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/gar/readme.md" ),
include_str!( "../../template/deploy/deploy/gar/readme.md" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/gar/main.tf" ),
include_str!( "../../template/deploy/deploy/gar/main.tf.hbs" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/gar/outputs.tf" ),
include_str!( "../../template/deploy/deploy/gar/outputs.tf" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/gar/variables.tf" ),
include_str!( "../../template/deploy/deploy/gar/variables.tf" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/gce/readme.md" ),
include_str!( "../../template/deploy/deploy/gce/readme.md" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/gce/main.tf" ),
include_str!( "../../template/deploy/deploy/gce/main.tf.hbs" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/gce/outputs.tf" ),
include_str!( "../../template/deploy/deploy/gce/outputs.tf.hbs" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/gce/variables.tf" ),
include_str!( "../../template/deploy/deploy/gce/variables.tf" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/gcs/main.tf" ),
include_str!( "../../template/deploy/deploy/gcs/main.tf" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/hetzner/main.tf" ),
include_str!( "../../template/deploy/deploy/hetzner/main.tf.hbs" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/hetzner/outputs.tf" ),
include_str!( "../../template/deploy/deploy/hetzner/outputs.tf.hbs" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/hetzner/variables.tf" ),
include_str!( "../../template/deploy/deploy/hetzner/variables.tf" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/aws/main.tf" ),
include_str!( "../../template/deploy/deploy/aws/main.tf" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/aws/outputs.tf" ),
include_str!( "../../template/deploy/deploy/aws/outputs.tf" ),
WriteMode ::Rewrite
);
archive.add_text_file
(
PathBuf ::from( "./deploy/aws/variables.tf" ),
include_str!( "../../template/deploy/deploy/aws/variables.tf" ),
WriteMode ::Rewrite
);
}
fn dir_name_to_formatted( dir_name: &str, separator: &str ) -> String
{
dir_name
.replace( [ ' ', '_' ], separator )
.to_lowercase()
}
fn load_existing_params( archive: &mut TemplateArchive, path: &Path ) -> Option< () >
{
let param_file = path.join( ".deploy_template.toml" );
let data = fs ::read_to_string( param_file ).ok()?;
let document = data.parse :: < toml_edit ::Document >().ok()?;
let template_table = document.get( "deploy" )?;
let param_names: Vec< String > = archive.parameters.descriptors
.iter()
.map( | d | d.parameter.clone() )
.collect();
for param in param_names
{
if let Some( value ) = template_table.get( ¶m )
{
if let Some( str_value ) = value.as_str()
{
if archive.get_value( ¶m ).is_none()
{
archive.set_value( ¶m, Value ::String( str_value.to_string() ) );
}
}
}
}
Some( () )
}
pub fn deploy_renew
(
path: &Path,
mut template: TemplateArchive
)
-> error ::untyped ::Result< () >
{
if load_existing_params( &mut template, path ).is_none()
{
let current_dir = std ::env ::current_dir()?;
let current_dir = current_dir
.components()
.next_back()
.context( "Invalid current directory" )?;
let current_dir = current_dir.as_os_str().to_string_lossy();
let artifact_repo_name = dir_name_to_formatted( ¤t_dir, "-" );
let docker_image_name = dir_name_to_formatted( ¤t_dir, "_" );
if template.get_value( "gcp_artifact_repo_name" ).is_none()
{
template.set_value( "gcp_artifact_repo_name", Value ::String( artifact_repo_name ) );
}
if template.get_value( "docker_image_name" ).is_none()
{
template.set_value( "docker_image_name", Value ::String( docker_image_name ) );
}
if template.get_value( "gcp_region" ).is_none()
{
template.set_value( "gcp_region", Value ::String( "europe-central2".into() ) );
}
}
template.materialize( path ).map_err( | e | error ::untyped ::format_err!( "{e}" ) )?;
Ok( () )
}
}
crate ::mod_interface!
{
orphan use deploy_renew;
orphan use DeployTemplate;
}