This commit is contained in:
Romain GERARD
2022-03-25 14:50:27 +01:00
parent fc584141e6
commit 603c5c3ff6
56 changed files with 1067 additions and 311 deletions

View File

@@ -1,5 +1,5 @@
edition = "2018"
max_width = 120
fn_call_width = 100
attr_fn_like_width = 100
fn_call_width = 80
attr_fn_like_width = 80
use_field_init_shorthand = true

View File

@@ -131,7 +131,11 @@ impl LocalDocker {
// Going to inject only env var that are used by the dockerfile
// so extracting it and modifying the image tag and env variables
let dockerfile_content = fs::read(dockerfile_complete_path).map_err(|err| {
BuildError::IoError(build.image.application_id.clone(), "reading dockerfile content".to_string(), err)
BuildError::IoError(
build.image.application_id.clone(),
"reading dockerfile content".to_string(),
err,
)
})?;
let dockerfile_args = match extract_dockerfile_args(dockerfile_content) {
Ok(dockerfile_args) => dockerfile_args,
@@ -324,7 +328,11 @@ impl LocalDocker {
format!("build/{}", build.image.name.as_str()),
)
.map_err(|err| {
BuildError::IoError(build.image.application_id.clone(), "when creating build workspace".to_string(), err)
BuildError::IoError(
build.image.application_id.clone(),
"when creating build workspace".to_string(),
err,
)
})
}
}
@@ -358,15 +366,20 @@ impl BuildPlatform for LocalDocker {
// LOGGING
let repository_root_path = PathBuf::from(self.get_repository_build_root_path(build)?);
let msg = format!("📥 Cloning repository: {} to {:?}", build.git_repository.url, repository_root_path);
let msg = format!(
"📥 Cloning repository: {} to {:?}",
build.git_repository.url, repository_root_path
);
listeners_helper.deployment_in_progress(ProgressInfo::new(
ProgressScope::Application { id: app_id.clone() },
ProgressLevel::Info,
Some(msg.clone()),
self.context.execution_id(),
));
self.logger
.log(LogLevel::Info, EngineEvent::Info(event_details, EventMessage::new_from_safe(msg)));
self.logger.log(
LogLevel::Info,
EngineEvent::Info(event_details, EventMessage::new_from_safe(msg)),
);
// LOGGING
// Create callback that will be called by git to provide credentials per user
@@ -382,7 +395,10 @@ impl BuildPlatform for LocalDocker {
}
if let Some(Credentials { login, password }) = &build.git_repository.credentials {
creds.push((CredentialType::USER_PASS_PLAINTEXT, Cred::userpass_plaintext(login, password).unwrap()));
creds.push((
CredentialType::USER_PASS_PLAINTEXT,
Cred::userpass_plaintext(login, password).unwrap(),
));
}
creds
@@ -448,8 +464,10 @@ impl BuildPlatform for LocalDocker {
// If the dockerfile does not exist, abort
if !dockerfile_absolute_path.is_file() {
let msg =
format!("Specified dockerfile path {:?} does not exist within the repository", &dockerfile_path);
let msg = format!(
"Specified dockerfile path {:?} does not exist within the repository",
&dockerfile_path
);
return Err(BuildError::InvalidConfig(app_id, msg));
}

View File

@@ -138,7 +138,12 @@ impl Image {
&self.repository_name
}
pub fn full_image_name_with_tag(&self) -> String {
format!("{}/{}:{}", self.registry_url.host_str().unwrap_or_default(), self.name, self.tag)
format!(
"{}/{}:{}",
self.registry_url.host_str().unwrap_or_default(),
self.name,
self.tag
)
}
pub fn full_image_name(&self) -> String {

View File

@@ -67,7 +67,10 @@ pub fn aws_helm_charts(
Ok(x) => x,
Err(e) => {
let message_safe = "Can't deploy helm chart as Qovery terraform config file has not been rendered by Terraform. Are you running it in dry run mode?";
return Err(CommandError::new(format!("{}, error: {:?}", message_safe, e), Some(message_safe.to_string())));
return Err(CommandError::new(
format!("{}, error: {:?}", message_safe, e),
Some(message_safe.to_string()),
));
}
};
let chart_prefix = chart_prefix_path.unwrap_or("./");
@@ -77,7 +80,10 @@ pub fn aws_helm_charts(
Ok(config) => config,
Err(e) => {
let message_safe = format!("Error while parsing terraform config file {}", qovery_terraform_config_file);
return Err(CommandError::new(format!("{}, error: {:?}", message_safe, e), Some(message_safe)));
return Err(CommandError::new(
format!("{}, error: {:?}", message_safe, e),
Some(message_safe),
));
}
};
@@ -1348,7 +1354,10 @@ impl AwsVpcCniChart {
"Error while getting daemonset info for chart {}, won't deploy CNI chart.",
&self.chart_info.name
);
Err(CommandError::new(format!("{}, error: {:?}", message_safe, e), Some(message_safe)))
Err(CommandError::new(
format!("{}, error: {:?}", message_safe, e),
Some(message_safe),
))
}
}
}

View File

@@ -391,7 +391,10 @@ impl EKS {
// Qovery features
context.insert("log_history_enabled", &self.context.is_feature_enabled(&Features::LogsHistory));
context.insert("metrics_history_enabled", &self.context.is_feature_enabled(&Features::MetricsHistory));
context.insert(
"metrics_history_enabled",
&self.context.is_feature_enabled(&Features::MetricsHistory),
);
// DNS configuration
let managed_dns_list = vec![self.dns_provider.name()];
@@ -406,8 +409,14 @@ impl EKS {
context.insert("managed_dns_domains_helm_format", &managed_dns_domains_helm_format);
context.insert("managed_dns_domains_root_helm_format", &managed_dns_domains_root_helm_format);
context.insert("managed_dns_domains_terraform_format", &managed_dns_domains_terraform_format);
context.insert("managed_dns_domains_root_terraform_format", &managed_dns_domains_root_terraform_format);
context.insert("managed_dns_resolvers_terraform_format", &managed_dns_resolvers_terraform_format);
context.insert(
"managed_dns_domains_root_terraform_format",
&managed_dns_domains_root_terraform_format,
);
context.insert(
"managed_dns_resolvers_terraform_format",
&managed_dns_resolvers_terraform_format,
);
match self.dns_provider.kind() {
dns_provider::Kind::Cloudflare => {
@@ -478,8 +487,10 @@ impl EKS {
.secret_access_key
.as_str(),
);
context
.insert("aws_region_tfstates_account", self.cloud_provider().terraform_state_credentials().region.as_str());
context.insert(
"aws_region_tfstates_account",
self.cloud_provider().terraform_state_credentials().region.as_str(),
);
context.insert("aws_region", &self.region());
context.insert("aws_terraform_backend_bucket", "qovery-terrafom-tfstates");
@@ -784,9 +795,10 @@ impl EKS {
);
match kubectl_exec_get_events(kubeconfig_path, None, environment_variables) {
Ok(ok_line) => self
.logger()
.log(LogLevel::Info, EngineEvent::Deploying(event_details, EventMessage::new(ok_line, None))),
Ok(ok_line) => self.logger().log(
LogLevel::Info,
EngineEvent::Deploying(event_details, EventMessage::new(ok_line, None)),
),
Err(err) => self.logger().log(
LogLevel::Error,
EngineEvent::Deploying(
@@ -984,8 +996,10 @@ impl EKS {
Ok(_) => {
let message = format!("Kubernetes cluster {} successfully paused", self.name());
self.send_to_customer(&message, &listeners_helper);
self.logger()
.log(LogLevel::Info, EngineEvent::Pausing(event_details, EventMessage::new_from_safe(message)));
self.logger().log(
LogLevel::Info,
EngineEvent::Pausing(event_details, EventMessage::new_from_safe(message)),
);
Ok(())
}
Err(e) => Err(EngineError::new_terraform_error_while_executing_pipeline(event_details, e)),
@@ -1072,11 +1086,16 @@ impl EKS {
// should apply before destroy to be sure destroy will compute on all resources
// don't exit on failure, it can happen if we resume a destroy process
let message =
format!("Ensuring everything is up to date before deleting cluster {}/{}", self.name(), self.id());
let message = format!(
"Ensuring everything is up to date before deleting cluster {}/{}",
self.name(),
self.id()
);
self.send_to_customer(&message, &listeners_helper);
self.logger()
.log(LogLevel::Info, EngineEvent::Deleting(event_details.clone(), EventMessage::new_from_safe(message)));
self.logger().log(
LogLevel::Info,
EngineEvent::Deleting(event_details.clone(), EventMessage::new_from_safe(message)),
);
self.logger().log(
LogLevel::Info,
@@ -1161,8 +1180,10 @@ impl EKS {
}
}
Err(e) => {
let message_safe =
format!("Error while getting all namespaces for Kubernetes cluster {}", self.name_with_id(),);
let message_safe = format!(
"Error while getting all namespaces for Kubernetes cluster {}",
self.name_with_id(),
);
self.logger().log(
LogLevel::Error,
EngineEvent::Deleting(
@@ -1185,9 +1206,11 @@ impl EKS {
);
// delete custom metrics api to avoid stale namespaces on deletion
let helm =
Helm::new(&kubernetes_config_file_path, &self.cloud_provider.credentials_environment_variables())
.map_err(|e| to_engine_error(&event_details, e))?;
let helm = Helm::new(
&kubernetes_config_file_path,
&self.cloud_provider.credentials_environment_variables(),
)
.map_err(|e| to_engine_error(&event_details, e))?;
let chart = ChartInfo::new_from_release_name("metrics-server", "kube-system");
helm.uninstall(&chart, &[])
.map_err(|e| to_engine_error(&event_details, e))?;
@@ -1325,8 +1348,10 @@ impl EKS {
let message = format!("Deleting Kubernetes cluster {}/{}", self.name(), self.id());
self.send_to_customer(&message, &listeners_helper);
self.logger()
.log(LogLevel::Info, EngineEvent::Deleting(event_details.clone(), EventMessage::new_from_safe(message)));
self.logger().log(
LogLevel::Info,
EngineEvent::Deleting(event_details.clone(), EventMessage::new_from_safe(message)),
);
self.logger().log(
LogLevel::Info,
@@ -1356,9 +1381,10 @@ impl EKS {
);
Ok(())
}
Err(Operation { error, .. }) => {
Err(EngineError::new_terraform_error_while_executing_destroy_pipeline(event_details, error))
}
Err(Operation { error, .. }) => Err(EngineError::new_terraform_error_while_executing_destroy_pipeline(
event_details,
error,
)),
Err(retry::Error::Internal(msg)) => Err(EngineError::new_terraform_error_while_executing_destroy_pipeline(
event_details,
CommandError::new(msg, None),
@@ -1473,7 +1499,12 @@ impl Kubernetes for EKS {
let listeners_helper = ListenersHelper::new(&self.listeners);
self.send_to_customer(
format!("Start preparing EKS upgrade process {} cluster with id {}", self.name(), self.id()).as_str(),
format!(
"Start preparing EKS upgrade process {} cluster with id {}",
self.name(),
self.id()
)
.as_str(),
&listeners_helper,
);
self.logger().log(
@@ -1631,7 +1662,10 @@ impl Kubernetes for EKS {
// disable cluster autoscaler to avoid interfering with AWS upgrade procedure
context.insert("enable_cluster_autoscaler", &false);
context.insert("eks_workers_version", format!("{}", &kubernetes_upgrade_status.requested_version).as_str());
context.insert(
"eks_workers_version",
format!("{}", &kubernetes_upgrade_status.requested_version).as_str(),
);
if let Err(e) = crate::template::generate_and_copy_all_files_into_dir(
self.template_directory.as_str(),
@@ -1661,7 +1695,10 @@ impl Kubernetes for EKS {
));
}
self.send_to_customer(format!("Upgrading Kubernetes {} worker nodes", self.name()).as_str(), &listeners_helper);
self.send_to_customer(
format!("Upgrading Kubernetes {} worker nodes", self.name()).as_str(),
&listeners_helper,
);
self.logger().log(
LogLevel::Info,
EngineEvent::Deploying(

View File

@@ -79,7 +79,10 @@ impl Role {
Ok(_) => Ok(true),
Err(e) => {
let safe_message = format!("Unable to know if `{}` exist on AWS Account", &self.role_name);
return Err(CommandError::new(format!("{}, error: {:?}", safe_message, e), Some(safe_message)));
return Err(CommandError::new(
format!("{}, error: {:?}", safe_message, e),
Some(safe_message),
));
}
};
}

View File

@@ -429,7 +429,10 @@ mod tests {
let current_zone = AwsZones::from_string(sanitized_zone.to_lowercase());
assert_eq!(current_zone.unwrap(), zone);
}
assert_eq!(AwsZones::from_string("eu-west-3x".to_string()), Err(RegionAndZoneErrors::ZoneNotSupported));
assert_eq!(
AwsZones::from_string("eu-west-3x".to_string()),
Err(RegionAndZoneErrors::ZoneNotSupported)
);
}
#[test]

View File

@@ -66,7 +66,12 @@ impl MongoDo {
}
fn matching_correct_version(&self, event_details: EventDetails) -> Result<ServiceVersionCheckResult, EngineError> {
check_service_version(get_self_hosted_mongodb_version(self.version()), self, event_details, self.logger())
check_service_version(
get_self_hosted_mongodb_version(self.version()),
self,
event_details,
self.logger(),
)
}
fn cloud_provider_name(&self) -> &str {

View File

@@ -66,7 +66,12 @@ impl MySQLDo {
}
fn matching_correct_version(&self, event_details: EventDetails) -> Result<ServiceVersionCheckResult, EngineError> {
check_service_version(get_self_hosted_mysql_version(self.version()), self, event_details, self.logger())
check_service_version(
get_self_hosted_mysql_version(self.version()),
self,
event_details,
self.logger(),
)
}
fn cloud_provider_name(&self) -> &str {

View File

@@ -66,7 +66,12 @@ impl PostgresDo {
}
fn matching_correct_version(&self, event_details: EventDetails) -> Result<ServiceVersionCheckResult, EngineError> {
check_service_version(get_self_hosted_postgres_version(self.version()), self, event_details, self.logger())
check_service_version(
get_self_hosted_postgres_version(self.version()),
self,
event_details,
self.logger(),
)
}
fn cloud_provider_name(&self) -> &str {

View File

@@ -66,7 +66,12 @@ impl RedisDo {
}
fn matching_correct_version(&self, event_details: EventDetails) -> Result<ServiceVersionCheckResult, EngineError> {
check_service_version(get_self_hosted_redis_version(self.version()), self, event_details, self.logger())
check_service_version(
get_self_hosted_redis_version(self.version()),
self,
event_details,
self.logger(),
)
}
fn cloud_provider_name(&self) -> &str {

View File

@@ -37,8 +37,10 @@ pub fn do_get_from_api(token: &str, api_type: DoApiType, url_api: String) -> Res
match response.status() {
StatusCode::OK => Ok(response.text().expect("Cannot get response text")),
StatusCode::UNAUTHORIZED => {
let message_safe =
format!("Could not get {} information, ensure your DigitalOcean token is valid.", api_type);
let message_safe = format!(
"Could not get {} information, ensure your DigitalOcean token is valid.",
api_type
);
return Err(CommandError::new(
format!("{}, response: {:?}", message_safe, response),
Some(message_safe),

View File

@@ -26,7 +26,10 @@ pub fn get_doks_info_from_name(
}
Err(e) => {
let safe_message = "Error while trying to deserialize json received from Digital Ocean DOKS API";
return Err(CommandError::new(format!("{}, error: {}", safe_message, e), Some(safe_message.to_string())));
return Err(CommandError::new(
format!("{}, error: {}", safe_message, e),
Some(safe_message.to_string()),
));
}
}
}
@@ -47,7 +50,10 @@ fn get_doks_versions_from_api_output(json_content: &str) -> Result<Vec<Kubernete
Ok(options) => Ok(options.options.versions),
Err(e) => {
let safe_message = "Error while trying to deserialize json received from Digital Ocean DOKS API";
return Err(CommandError::new(format!("{}, error: {}", safe_message, e), Some(safe_message.to_string())));
return Err(CommandError::new(
format!("{}, error: {}", safe_message, e),
Some(safe_message.to_string()),
));
}
}
}

View File

@@ -121,7 +121,10 @@ pub fn do_helm_charts(
Ok(x) => x,
Err(e) => {
let message_safe = "Can't deploy helm chart as Qovery terraform config file has not been rendered by Terraform. Are you running it in dry run mode?";
return Err(CommandError::new(format!("{}, error: {:?}", message_safe, e), Some(message_safe.to_string())));
return Err(CommandError::new(
format!("{}, error: {:?}", message_safe, e),
Some(message_safe.to_string()),
));
}
};
let chart_prefix = chart_prefix_path.unwrap_or("./");
@@ -131,7 +134,10 @@ pub fn do_helm_charts(
Ok(config) => config,
Err(e) => {
let message_safe = format!("Error while parsing terraform config file {}", qovery_terraform_config_file);
return Err(CommandError::new(format!("{}, error: {:?}", message_safe, e), Some(message_safe)));
return Err(CommandError::new(
format!("{}, error: {:?}", message_safe, e),
Some(message_safe),
));
}
};

View File

@@ -248,8 +248,14 @@ impl DOKS {
context.insert("managed_dns_domains_helm_format", &managed_dns_domains_helm_format);
context.insert("managed_dns_domains_root_helm_format", &managed_dns_domains_root_helm_format);
context.insert("managed_dns_domains_terraform_format", &managed_dns_domains_terraform_format);
context.insert("managed_dns_domains_root_terraform_format", &managed_dns_domains_root_terraform_format);
context.insert("managed_dns_resolvers_terraform_format", &managed_dns_resolvers_terraform_format);
context.insert(
"managed_dns_domains_root_terraform_format",
&managed_dns_domains_root_terraform_format,
);
context.insert(
"managed_dns_resolvers_terraform_format",
&managed_dns_resolvers_terraform_format,
);
match self.dns_provider.kind() {
dns_provider::Kind::Cloudflare => {
context.insert("external_dns_provider", self.dns_provider.provider_name());
@@ -290,7 +296,10 @@ impl DOKS {
// Qovery features
context.insert("log_history_enabled", &self.context.is_feature_enabled(&Features::LogsHistory));
context.insert("metrics_history_enabled", &self.context.is_feature_enabled(&Features::MetricsHistory));
context.insert(
"metrics_history_enabled",
&self.context.is_feature_enabled(&Features::MetricsHistory),
);
if self.context.resource_expiration_in_seconds().is_some() {
context.insert("resource_expiration_in_seconds", &self.context.resource_expiration_in_seconds())
}
@@ -320,8 +329,10 @@ impl DOKS {
.as_str(),
);
context
.insert("aws_region_tfstates_account", self.cloud_provider().terraform_state_credentials().region.as_str());
context.insert(
"aws_region_tfstates_account",
self.cloud_provider().terraform_state_credentials().region.as_str(),
);
context.insert("nginx_enable_horizontal_autoscaler", "true");
context.insert("nginx_minimum_replicas", "2");
@@ -427,7 +438,9 @@ impl DOKS {
// TODO(benjaminch): `qovery-` to be added into Rust name directly everywhere
match get_doks_info_from_name(json_content.as_str(), format!("qovery-{}", self.id())) {
Ok(cluster_result) => match cluster_result {
None => Err(CommandError::new_from_safe_message("Cluster doesn't exist on DO side.".to_string())),
None => Err(CommandError::new_from_safe_message(
"Cluster doesn't exist on DO side.".to_string(),
)),
Some(cluster) => Ok(cluster),
},
Err(e) => Err(e),
@@ -443,7 +456,11 @@ impl DOKS {
execution_id: self.context.execution_id().to_string(),
},
ProgressLevel::Info,
Some(format!("start to create Digital Ocean Kubernetes cluster {} with id {}", self.name(), self.id())),
Some(format!(
"start to create Digital Ocean Kubernetes cluster {} with id {}",
self.name(),
self.id()
)),
self.context.execution_id(),
));
self.logger().log(
@@ -753,9 +770,10 @@ impl DOKS {
);
match kubectl_exec_get_events(kubeconfig_path, None, environment_variables) {
Ok(ok_line) => self
.logger()
.log(LogLevel::Info, EngineEvent::Deploying(event_details, EventMessage::new(ok_line, None))),
Ok(ok_line) => self.logger().log(
LogLevel::Info,
EngineEvent::Deploying(event_details, EventMessage::new(ok_line, None)),
),
Err(err) => self.logger().log(
LogLevel::Error,
EngineEvent::Deploying(
@@ -866,11 +884,16 @@ impl DOKS {
// should apply before destroy to be sure destroy will compute on all resources
// don't exit on failure, it can happen if we resume a destroy process
let message =
format!("Ensuring everything is up to date before deleting cluster {}/{}", self.name(), self.id());
let message = format!(
"Ensuring everything is up to date before deleting cluster {}/{}",
self.name(),
self.id()
);
self.send_to_customer(&message, &listeners_helper);
self.logger()
.log(LogLevel::Info, EngineEvent::Deleting(event_details.clone(), EventMessage::new_from_safe(message)));
self.logger().log(
LogLevel::Info,
EngineEvent::Deleting(event_details.clone(), EventMessage::new_from_safe(message)),
);
self.logger().log(
LogLevel::Info,
@@ -958,8 +981,10 @@ impl DOKS {
}
}
Err(e) => {
let message_safe =
format!("Error while getting all namespaces for Kubernetes cluster {}", self.name_with_id(),);
let message_safe = format!(
"Error while getting all namespaces for Kubernetes cluster {}",
self.name_with_id(),
);
self.logger().log(
LogLevel::Error,
EngineEvent::Deleting(
@@ -1121,8 +1146,10 @@ impl DOKS {
let message = format!("Deleting Kubernetes cluster {}/{}", self.name(), self.id());
self.send_to_customer(&message, &listeners_helper);
self.logger()
.log(LogLevel::Info, EngineEvent::Deleting(event_details.clone(), EventMessage::new_from_safe(message)));
self.logger().log(
LogLevel::Info,
EngineEvent::Deleting(event_details.clone(), EventMessage::new_from_safe(message)),
);
self.logger().log(
LogLevel::Info,
@@ -1152,9 +1179,10 @@ impl DOKS {
);
Ok(())
}
Err(Operation { error, .. }) => {
Err(EngineError::new_terraform_error_while_executing_destroy_pipeline(event_details, error))
}
Err(Operation { error, .. }) => Err(EngineError::new_terraform_error_while_executing_destroy_pipeline(
event_details,
error,
)),
Err(retry::Error::Internal(msg)) => Err(EngineError::new_terraform_error_while_executing_destroy_pipeline(
event_details,
CommandError::new(msg, None),
@@ -1391,7 +1419,12 @@ impl Kubernetes for DOKS {
let event_details = self.get_event_details(Infrastructure(InfrastructureStep::Upgrade));
let listeners_helper = ListenersHelper::new(&self.listeners);
self.send_to_customer(
format!("Start preparing DOKS upgrade process {} cluster with id {}", self.name(), self.id()).as_str(),
format!(
"Start preparing DOKS upgrade process {} cluster with id {}",
self.name(),
self.id()
)
.as_str(),
&listeners_helper,
);
self.logger().log(
@@ -1482,7 +1515,10 @@ impl Kubernetes for DOKS {
));
}
self.send_to_customer(format!("Upgrading Kubernetes {} nodes", self.name()).as_str(), &listeners_helper);
self.send_to_customer(
format!("Upgrading Kubernetes {} nodes", self.name()).as_str(),
&listeners_helper,
);
self.logger().log(
LogLevel::Info,
EngineEvent::Deploying(

View File

@@ -128,7 +128,10 @@ fn do_get_vpcs_from_api_output(json_content: &str) -> Result<Vec<Vpc>, CommandEr
Ok(vpcs) => Ok(vpcs.vpcs),
Err(e) => {
let message_safe = "Error while trying to deserialize json received from Digital Ocean VPC API";
Err(CommandError::new(format!("{}, error: {}", message_safe, e), Some(message_safe.to_string())))
Err(CommandError::new(
format!("{}, error: {}", message_safe, e),
Some(message_safe.to_string()),
))
}
}
}
@@ -255,7 +258,10 @@ mod tests_do_vpcs {
let vpc_subnets: Vec<String> = vpcs.into_iter().map(|x| x.ip_range).collect();
let joined_subnets = vpc_subnets.join(",");
assert_eq!(joined_subnets, "10.2.0.0/16,10.110.0.0/20,10.116.0.0/20,10.1.0.0/16,10.0.0.0/16");
assert_eq!(
joined_subnets,
"10.2.0.0/16,10.110.0.0/20,10.116.0.0/20,10.1.0.0/16,10.0.0.0/16"
);
}
#[test]
@@ -264,9 +270,11 @@ mod tests_do_vpcs {
let vpcs = do_get_vpcs_from_api_output(&json_content).unwrap();
// available
assert!(get_do_vpc_from_subnet("10.3.0.0/16".to_string(), vpcs.clone(), DoRegion::Frankfurt)
.unwrap()
.is_none());
assert!(
get_do_vpc_from_subnet("10.3.0.0/16".to_string(), vpcs.clone(), DoRegion::Frankfurt)
.unwrap()
.is_none()
);
// already used
assert_eq!(
get_do_vpc_from_subnet("10.2.0.0/16".to_string(), vpcs.clone(), DoRegion::Frankfurt)

View File

@@ -157,7 +157,10 @@ pub trait HelmChart: Send {
if let Err(e) = fs::metadata(file) {
let safe_message =
format!("Can't access helm chart override file `{}` for chart `{}`", file, chart.name,);
return Err(CommandError::new(format!("{}, error: {:?}", safe_message, e), Some(safe_message)));
return Err(CommandError::new(
format!("{}, error: {:?}", safe_message, e),
Some(safe_message),
));
}
}
Ok(None)
@@ -224,7 +227,10 @@ pub trait HelmChart: Send {
match chart_info.action {
HelmAction::Deploy => {
if let Err(e) = helm.uninstall_chart_if_breaking_version(chart_info, &[]) {
warn!("error while trying to destroy chart if breaking change is detected: {:?}", e.to_string());
warn!(
"error while trying to destroy chart if breaking change is detected: {:?}",
e.to_string()
);
}
helm.upgrade(chart_info, &[]).map_err(to_command_error)?;
@@ -299,8 +305,10 @@ fn deploy_parallel_charts(
}
Err(e) => {
let safe_message = "Thread panicked during parallel charts deployments.";
let error =
Err(CommandError::new(format!("{}, error: {:?}", safe_message, e), Some(safe_message.to_string())));
let error = Err(CommandError::new(
format!("{}, error: {:?}", safe_message, e),
Some(safe_message.to_string()),
));
errors.push(error);
}
}
@@ -587,7 +595,10 @@ impl HelmChart for PrometheusOperatorConfigChart {
match chart_info.action {
HelmAction::Deploy => {
if let Err(e) = helm.uninstall_chart_if_breaking_version(chart_info, &[]) {
warn!("error while trying to destroy chart if breaking change is detected: {}", e.to_string());
warn!(
"error while trying to destroy chart if breaking change is detected: {}",
e.to_string()
);
}
helm.upgrade(chart_info, &[]).map_err(to_command_error)?;
@@ -653,8 +664,12 @@ pub fn get_chart_for_shell_agent(
context: ShellAgentContext,
chart_path: impl Fn(&str) -> String,
) -> Result<CommonChart, CommandError> {
let shell_agent_version: QoveryShellAgent =
get_qovery_app_version(QoveryAppName::ShellAgent, context.api_token, context.api_url, context.cluster_id)?;
let shell_agent_version: QoveryShellAgent = get_qovery_app_version(
QoveryAppName::ShellAgent,
context.api_token,
context.api_url,
context.cluster_id,
)?;
let shell_agent = CommonChart {
chart_info: ChartInfo {
name: "shell-agent".to_string(),

View File

@@ -795,7 +795,11 @@ where
EngineEvent::Deleting(
event_details.clone(),
EventMessage::new(
format!("Encountering issues while trying to get objects kind {}: {:?}", object, e.message()),
format!(
"Encountering issues while trying to get objects kind {}: {:?}",
object,
e.message()
),
None,
),
),
@@ -804,8 +808,9 @@ where
}
// delete if resource exists
match retry::retry(Fibonacci::from_millis(5000).take(3), || {
match kubectl_delete_objects_in_all_namespaces(&kubernetes_config, object, envs.clone()) {
match retry::retry(
Fibonacci::from_millis(5000).take(3),
|| match kubectl_delete_objects_in_all_namespaces(&kubernetes_config, object, envs.clone()) {
Ok(_) => OperationResult::Ok(()),
Err(e) => {
logger.log(
@@ -817,8 +822,8 @@ where
);
OperationResult::Retry(e)
}
}
}) {
},
) {
Ok(_) => {}
Err(Operation { error, .. }) => {
return Err(EngineError::new_cannot_uninstall_helm_chart(
@@ -861,7 +866,10 @@ where
let masters_version = match VersionsNumber::from_str(raw_version.as_str()) {
Ok(vn) => vn,
Err(_) => {
return Err(EngineError::new_cannot_determine_k8s_master_version(event_details, raw_version.to_string()))
return Err(EngineError::new_cannot_determine_k8s_master_version(
event_details,
raw_version.to_string(),
))
}
};
@@ -1057,12 +1065,14 @@ fn check_kubernetes_upgrade_status(
}
}
Err(e) => {
return Err(EngineError::new_k8s_version_upgrade_deployed_vs_requested_versions_inconsistency(
event_details,
deployed_masters_version,
wished_version,
e,
))
return Err(
EngineError::new_k8s_version_upgrade_deployed_vs_requested_versions_inconsistency(
event_details,
deployed_masters_version,
wished_version,
e,
),
)
}
};
@@ -1108,12 +1118,14 @@ fn check_kubernetes_upgrade_status(
non_up_to_date_workers += 1;
}
Err(e) => {
return Err(EngineError::new_k8s_version_upgrade_deployed_vs_requested_versions_inconsistency(
event_details,
node,
wished_version,
e,
))
return Err(
EngineError::new_k8s_version_upgrade_deployed_vs_requested_versions_inconsistency(
event_details,
node,
wished_version,
e,
),
)
}
}
}
@@ -1253,9 +1265,18 @@ where
F: Fn() -> R,
{
let waiting_message = match action {
Action::Create => Some(format!("Infrastructure '{}' deployment is in progress...", kubernetes.name_with_id())),
Action::Pause => Some(format!("Infrastructure '{}' pause is in progress...", kubernetes.name_with_id())),
Action::Delete => Some(format!("Infrastructure '{}' deletion is in progress...", kubernetes.name_with_id())),
Action::Create => Some(format!(
"Infrastructure '{}' deployment is in progress...",
kubernetes.name_with_id()
)),
Action::Pause => Some(format!(
"Infrastructure '{}' pause is in progress...",
kubernetes.name_with_id()
)),
Action::Delete => Some(format!(
"Infrastructure '{}' deletion is in progress...",
kubernetes.name_with_id()
)),
Action::Nothing => None,
};
@@ -1393,7 +1414,10 @@ pub fn validate_k8s_required_cpu_and_burstable(
context_id,
));
logger.log(LogLevel::Warning, EngineEvent::Warning(event_details, EventMessage::new_from_safe(message)));
logger.log(
LogLevel::Warning,
EngineEvent::Warning(event_details, EventMessage::new_from_safe(message)),
);
set_cpu_burst = total_cpu.clone();
}
@@ -1414,7 +1438,10 @@ pub fn convert_k8s_cpu_value_to_f32(value: String) -> Result<f32, CommandError>
}
Err(e) => Err(CommandError::new(
e.to_string(),
Some(format!("Error while trying to parse `{}` to float 32.", value_number_string.as_str())),
Some(format!(
"Error while trying to parse `{}` to float 32.",
value_number_string.as_str()
)),
)),
};
}

View File

@@ -52,15 +52,24 @@ pub fn get_qovery_app_version<T: DeserializeOwned>(
QoveryAppName::ShellAgent => "shellAgent",
};
let url = format!("https://{}/api/v1/{}-version?type=cluster&clusterId={}", api_fqdn, app_type, cluster_id);
let url = format!(
"https://{}/api/v1/{}-version?type=cluster&clusterId={}",
api_fqdn, app_type, cluster_id
);
let message_safe = format!("Error while trying to get `{}` version.", app_type);
match reqwest::blocking::Client::new().get(&url).headers(headers).send() {
Ok(x) => match x.json::<T>() {
Ok(qa) => Ok(qa),
Err(e) => Err(CommandError::new(format!("{}, error: {:?}", message_safe, e), Some(message_safe))),
Err(e) => Err(CommandError::new(
format!("{}, error: {:?}", message_safe, e),
Some(message_safe),
)),
},
Err(e) => Err(CommandError::new(format!("{}, error: {:?}", message_safe, e), Some(message_safe))),
Err(e) => Err(CommandError::new(
format!("{}, error: {:?}", message_safe, e),
Some(message_safe),
)),
}
}

View File

@@ -66,7 +66,12 @@ impl MongoDbScw {
}
fn matching_correct_version(&self, event_details: EventDetails) -> Result<ServiceVersionCheckResult, EngineError> {
check_service_version(get_self_hosted_mongodb_version(self.version()), self, event_details, self.logger())
check_service_version(
get_self_hosted_mongodb_version(self.version()),
self,
event_details,
self.logger(),
)
}
fn cloud_provider_name(&self) -> &str {

View File

@@ -66,7 +66,12 @@ impl RedisScw {
}
fn matching_correct_version(&self, event_details: EventDetails) -> Result<ServiceVersionCheckResult, EngineError> {
check_service_version(get_self_hosted_redis_version(self.version()), self, event_details, self.logger())
check_service_version(
get_self_hosted_redis_version(self.version()),
self,
event_details,
self.logger(),
)
}
fn cloud_provider_name(&self) -> &str {

View File

@@ -116,7 +116,10 @@ pub fn scw_helm_charts(
Ok(x) => x,
Err(e) => {
let message_safe = "Can't deploy helm chart as Qovery terraform config file has not been rendered by Terraform. Are you running it in dry run mode?";
return Err(CommandError::new(format!("{}, error: {:?}", message_safe, e), Some(message_safe.to_string())));
return Err(CommandError::new(
format!("{}, error: {:?}", message_safe, e),
Some(message_safe.to_string()),
));
}
};
let chart_prefix = chart_prefix_path.unwrap_or("./");
@@ -126,7 +129,10 @@ pub fn scw_helm_charts(
Ok(config) => config,
Err(e) => {
let message_safe = format!("Error while parsing terraform config file {}", qovery_terraform_config_file);
return Err(CommandError::new(format!("{}, error: {:?}", message_safe, e), Some(message_safe)));
return Err(CommandError::new(
format!("{}, error: {:?}", message_safe, e),
Some(message_safe),
));
}
};

View File

@@ -271,9 +271,9 @@ impl Kapsule {
let error_cluster_id = "expected cluster id for this Scaleway cluster".to_string();
let cluster_id = match cluster_info.id {
None => {
return Err(ScwNodeGroupErrors::NodeGroupValidationError(CommandError::new_from_safe_message(
error_cluster_id,
)))
return Err(ScwNodeGroupErrors::NodeGroupValidationError(
CommandError::new_from_safe_message(error_cluster_id),
))
}
Some(x) => x,
};
@@ -292,7 +292,10 @@ impl Kapsule {
Err(e) => {
let msg = format!("error while trying to get SCW pool info from cluster {}", &cluster_id);
let msg_with_error = format!("{}. {:?}", msg, e);
return Err(ScwNodeGroupErrors::CloudProviderApiError(CommandError::new(msg_with_error, Some(msg))));
return Err(ScwNodeGroupErrors::CloudProviderApiError(CommandError::new(
msg_with_error,
Some(msg),
)));
}
};
@@ -311,7 +314,10 @@ impl Kapsule {
for ng in pools.pools.unwrap() {
if ng.id.is_none() {
let msg = format!("error while trying to validate SCW pool ID from cluster {}", &cluster_id);
return Err(ScwNodeGroupErrors::NodeGroupValidationError(CommandError::new(msg.clone(), Some(msg))));
return Err(ScwNodeGroupErrors::NodeGroupValidationError(CommandError::new(
msg.clone(),
Some(msg),
)));
}
let ng_sanitized = self.get_node_group_info(ng.id.unwrap().as_str())?;
nodegroup_pool.push(ng_sanitized)
@@ -439,8 +445,14 @@ impl Kapsule {
context.insert("managed_dns_domains_helm_format", &managed_dns_domains_helm_format);
context.insert("managed_dns_domains_root_helm_format", &managed_dns_domains_root_helm_format);
context.insert("managed_dns_domains_terraform_format", &managed_dns_domains_terraform_format);
context.insert("managed_dns_domains_root_terraform_format", &managed_dns_domains_root_terraform_format);
context.insert("managed_dns_resolvers_terraform_format", &managed_dns_resolvers_terraform_format);
context.insert(
"managed_dns_domains_root_terraform_format",
&managed_dns_domains_root_terraform_format,
);
context.insert(
"managed_dns_resolvers_terraform_format",
&managed_dns_resolvers_terraform_format,
);
match self.dns_provider.kind() {
dns_provider::Kind::Cloudflare => {
context.insert("external_dns_provider", self.dns_provider.provider_name());
@@ -471,7 +483,10 @@ impl Kapsule {
// Qovery features
context.insert("log_history_enabled", &self.context.is_feature_enabled(&Features::LogsHistory));
context.insert("metrics_history_enabled", &self.context.is_feature_enabled(&Features::MetricsHistory));
context.insert(
"metrics_history_enabled",
&self.context.is_feature_enabled(&Features::MetricsHistory),
);
if self.context.resource_expiration_in_seconds().is_some() {
context.insert("resource_expiration_in_seconds", &self.context.resource_expiration_in_seconds())
}
@@ -491,8 +506,10 @@ impl Kapsule {
.secret_access_key
.as_str(),
);
context
.insert("aws_region_tfstates_account", self.cloud_provider().terraform_state_credentials().region.as_str());
context.insert(
"aws_region_tfstates_account",
self.cloud_provider().terraform_state_credentials().region.as_str(),
);
context.insert("aws_terraform_backend_dynamodb_table", "qovery-terrafom-tfstates");
context.insert("aws_terraform_backend_bucket", "qovery-terrafom-tfstates");
@@ -768,7 +785,10 @@ impl Kapsule {
Err(e) => {
match e {
ScwNodeGroupErrors::CloudProviderApiError(c) => {
return Err(EngineError::new_missing_api_info_from_cloud_provider_error(event_details, Some(c)))
return Err(EngineError::new_missing_api_info_from_cloud_provider_error(
event_details,
Some(c),
))
}
ScwNodeGroupErrors::ClusterDoesNotExists(_) => self.logger().log(
LogLevel::Info,
@@ -1028,9 +1048,10 @@ impl Kapsule {
);
match kubectl_exec_get_events(kubeconfig_path, None, environment_variables) {
Ok(ok_line) => self
.logger()
.log(LogLevel::Info, EngineEvent::Deploying(event_details, EventMessage::new_from_safe(ok_line))),
Ok(ok_line) => self.logger().log(
LogLevel::Info,
EngineEvent::Deploying(event_details, EventMessage::new_from_safe(ok_line)),
),
Err(err) => self.logger().log(
LogLevel::Error,
EngineEvent::Deploying(
@@ -1229,8 +1250,10 @@ impl Kapsule {
Ok(_) => {
let message = format!("Kubernetes cluster {} successfully paused", self.name());
self.send_to_customer(&message, &listeners_helper);
self.logger()
.log(LogLevel::Info, EngineEvent::Pausing(event_details, EventMessage::new_from_safe(message)));
self.logger().log(
LogLevel::Info,
EngineEvent::Pausing(event_details, EventMessage::new_from_safe(message)),
);
Ok(())
}
Err(e) => Err(EngineError::new_terraform_error_while_executing_pipeline(event_details, e)),
@@ -1300,11 +1323,16 @@ impl Kapsule {
// should apply before destroy to be sure destroy will compute on all resources
// don't exit on failure, it can happen if we resume a destroy process
let message =
format!("Ensuring everything is up to date before deleting cluster {}/{}", self.name(), self.id());
let message = format!(
"Ensuring everything is up to date before deleting cluster {}/{}",
self.name(),
self.id()
);
self.send_to_customer(&message, &listeners_helper);
self.logger()
.log(LogLevel::Info, EngineEvent::Deleting(event_details.clone(), EventMessage::new_from_safe(message)));
self.logger().log(
LogLevel::Info,
EngineEvent::Deleting(event_details.clone(), EventMessage::new_from_safe(message)),
);
self.logger().log(
LogLevel::Info,
@@ -1392,8 +1420,10 @@ impl Kapsule {
}
}
Err(e) => {
let message_safe =
format!("Error while getting all namespaces for Kubernetes cluster {}", self.name_with_id(),);
let message_safe = format!(
"Error while getting all namespaces for Kubernetes cluster {}",
self.name_with_id(),
);
self.logger().log(
LogLevel::Error,
EngineEvent::Deleting(
@@ -1555,8 +1585,10 @@ impl Kapsule {
let message = format!("Deleting Kubernetes cluster {}/{}", self.name(), self.id());
self.send_to_customer(&message, &listeners_helper);
self.logger()
.log(LogLevel::Info, EngineEvent::Deleting(event_details.clone(), EventMessage::new_from_safe(message)));
self.logger().log(
LogLevel::Info,
EngineEvent::Deleting(event_details.clone(), EventMessage::new_from_safe(message)),
);
self.logger().log(
LogLevel::Info,
@@ -1586,9 +1618,10 @@ impl Kapsule {
);
Ok(())
}
Err(Operation { error, .. }) => {
Err(EngineError::new_terraform_error_while_executing_destroy_pipeline(event_details, error))
}
Err(Operation { error, .. }) => Err(EngineError::new_terraform_error_while_executing_destroy_pipeline(
event_details,
error,
)),
Err(retry::Error::Internal(msg)) => Err(EngineError::new_terraform_error_while_executing_destroy_pipeline(
event_details,
CommandError::new(msg, None),
@@ -1702,7 +1735,12 @@ impl Kubernetes for Kapsule {
let event_details = self.get_event_details(Infrastructure(InfrastructureStep::Upgrade));
let listeners_helper = ListenersHelper::new(&self.listeners);
self.send_to_customer(
format!("Start preparing Kapsule upgrade process {} cluster with id {}", self.name(), self.id()).as_str(),
format!(
"Start preparing Kapsule upgrade process {} cluster with id {}",
self.name(),
self.id()
)
.as_str(),
&listeners_helper,
);
self.logger().log(
@@ -1744,8 +1782,10 @@ impl Kubernetes for Kapsule {
),
);
context
.insert("kubernetes_cluster_version", format!("{}", &kubernetes_upgrade_status.requested_version).as_str());
context.insert(
"kubernetes_cluster_version",
format!("{}", &kubernetes_upgrade_status.requested_version).as_str(),
);
if let Err(e) = crate::template::generate_and_copy_all_files_into_dir(
self.template_directory.as_str(),
@@ -1773,7 +1813,10 @@ impl Kubernetes for Kapsule {
));
}
self.send_to_customer(format!("Upgrading Kubernetes {} nodes", self.name()).as_str(), &listeners_helper);
self.send_to_customer(
format!("Upgrading Kubernetes {} nodes", self.name()).as_str(),
&listeners_helper,
);
self.logger().log(
LogLevel::Info,
EngineEvent::Deploying(

View File

@@ -418,9 +418,11 @@ where
})?;
// do exec helm upgrade and return the last deployment status
let helm =
helm::Helm::new(&kubernetes_config_file_path, &kubernetes.cloud_provider().credentials_environment_variables())
.map_err(|e| helm::to_engine_error(&event_details, e))?;
let helm = helm::Helm::new(
&kubernetes_config_file_path,
&kubernetes.cloud_provider().credentials_environment_variables(),
)
.map_err(|e| helm::to_engine_error(&event_details, e))?;
let chart = ChartInfo::new_from_custom_namespace(
helm_release_name,
workspace_dir.clone(),
@@ -926,7 +928,11 @@ where
))
}
Err(_err) => {
let message = format!("{} version {} is not supported!", service.service_type().name(), service.version(),);
let message = format!(
"{} version {} is not supported!",
service.service_type().name(),
service.version(),
);
let progress_info = ProgressInfo::new(
service.progress_scope(),
@@ -988,7 +994,12 @@ pub fn check_kubernetes_service_error<T>(
where
T: Service + ?Sized,
{
let message = format!("{} {} {}", action_verb, service.service_type().name().to_lowercase(), service.name());
let message = format!(
"{} {} {}",
action_verb,
service.service_type().name().to_lowercase(),
service.name()
);
let progress_info = ProgressInfo::new(
service.progress_scope(),
@@ -1007,8 +1018,10 @@ where
}
CheckAction::Pause => {
listeners_helper.pause_in_progress(progress_info);
logger
.log(LogLevel::Info, EngineEvent::Pausing(event_details.clone(), EventMessage::new_from_safe(message)));
logger.log(
LogLevel::Info,
EngineEvent::Pausing(event_details.clone(), EventMessage::new_from_safe(message)),
);
}
CheckAction::Delete => {
listeners_helper.delete_in_progress(progress_info);
@@ -1242,12 +1255,16 @@ where
service.service_type().name(),
service.name_with_id()
)),
Action::Pause => {
Some(format!("{} '{}' pause is in progress...", service.service_type().name(), service.name_with_id()))
}
Action::Delete => {
Some(format!("{} '{}' deletion is in progress...", service.service_type().name(), service.name_with_id()))
}
Action::Pause => Some(format!(
"{} '{}' pause is in progress...",
service.service_type().name(),
service.name_with_id()
)),
Action::Delete => Some(format!(
"{} '{}' deletion is in progress...",
service.service_type().name(),
service.name_with_id()
)),
Action::Nothing => None,
};
@@ -1270,8 +1287,12 @@ where
let logger = service.logger().clone_dyn();
let listeners = std::clone::Clone::clone(service.listeners());
let progress_info =
ProgressInfo::new(service.progress_scope(), Info, waiting_message.clone(), service.context().execution_id());
let progress_info = ProgressInfo::new(
service.progress_scope(),
Info,
waiting_message.clone(),
service.context().execution_id(),
);
let (tx, rx) = mpsc::channel();

View File

@@ -183,8 +183,10 @@ pub fn generate_supported_version(
} else {
for minor in minor_min..minor_max + 1 {
// add short minor format targeting latest version
supported_versions
.insert(format!("{}.{}", major, minor), format!("{}.{}.{}", major, minor, update_max.unwrap()));
supported_versions.insert(
format!("{}.{}", major, minor),
format!("{}.{}.{}", major, minor, update_max.unwrap()),
);
if update_min.unwrap() == update_max.unwrap() {
let version = format!("{}.{}.{}", major, minor, update_min.unwrap());
supported_versions.insert(version.clone(), format!("{}{}", version, suffix));
@@ -238,7 +240,11 @@ impl VersionsNumber {
}
pub fn to_major_minor_version_string(&self, default_minor: &str) -> String {
let test = format!("{}.{}", self.major.clone(), self.minor.as_ref().unwrap_or(&default_minor.to_string()));
let test = format!(
"{}.{}",
self.major.clone(),
self.minor.as_ref().unwrap_or(&default_minor.to_string())
);
test
}
@@ -374,7 +380,11 @@ pub fn check_cname_for(
};
send_deployment_progress(
format!("Checking CNAME resolution of '{}'. Please wait, it can take some time...", cname_to_check).as_str(),
format!(
"Checking CNAME resolution of '{}'. Please wait, it can take some time...",
cname_to_check
)
.as_str(),
);
// Trying for 5 min to resolve CNAME
@@ -385,12 +395,14 @@ pub fn check_cname_for(
resolver
};
let fixed_iterable = Fixed::from_millis(Duration::seconds(5).num_milliseconds() as u64).take(6 * 5);
let check_result = retry::retry(fixed_iterable, || match get_cname_record_value(next_resolver(), cname_to_check) {
Some(domain) => OperationResult::Ok(domain),
None => {
let msg = format!("Cannot find domain under CNAME {}. Retrying in 5 seconds...", cname_to_check);
send_deployment_progress(msg.as_str());
OperationResult::Retry(msg)
let check_result = retry::retry(fixed_iterable, || {
match get_cname_record_value(next_resolver(), cname_to_check) {
Some(domain) => OperationResult::Ok(domain),
None => {
let msg = format!("Cannot find domain under CNAME {}. Retrying in 5 seconds...", cname_to_check);
send_deployment_progress(msg.as_str());
OperationResult::Retry(msg)
}
}
});
@@ -422,7 +434,10 @@ pub fn check_domain_for(
let resolvers = dns_resolvers();
for domain in domains_to_check {
let message = format!("Let's check domain resolution for '{}'. Please wait, it can take some time...", domain);
let message = format!(
"Let's check domain resolution for '{}'. Please wait, it can take some time...",
domain
);
listener_helper.deployment_in_progress(ProgressInfo::new(
ProgressScope::Environment {
@@ -537,8 +552,14 @@ pub fn print_action(
) {
let msg = format!("{}.{}.{} called for {}", cloud_provider_name, struct_name, fn_name, item_name);
match fn_name.contains("error") {
true => logger.log(LogLevel::Warning, EngineEvent::Warning(event_details, EventMessage::new_from_safe(msg))),
false => logger.log(LogLevel::Info, EngineEvent::Info(event_details, EventMessage::new_from_safe(msg))),
true => logger.log(
LogLevel::Warning,
EngineEvent::Warning(event_details, EventMessage::new_from_safe(msg)),
),
false => logger.log(
LogLevel::Info,
EngineEvent::Info(event_details, EventMessage::new_from_safe(msg)),
),
}
}

View File

@@ -116,7 +116,11 @@ impl QoveryCommand {
}
pub fn exec(&mut self) -> Result<(), CommandError> {
self.exec_with_abort(&mut |line| info!("{}", line), &mut |line| warn!("{}", line), &CommandKiller::never())
self.exec_with_abort(
&mut |line| info!("{}", line),
&mut |line| warn!("{}", line),
&CommandKiller::never(),
)
}
pub fn exec_with_output<STDOUT, STDERR>(
@@ -273,7 +277,10 @@ impl QoveryCommand {
}
if !exit_status.success() {
debug!("command: {:?} terminated with error exist status {:?}", self.command, exit_status);
debug!(
"command: {:?} terminated with error exist status {:?}",
self.command, exit_status
);
return Err(ExitStatusError(exit_status));
}

View File

@@ -81,8 +81,13 @@ impl Docker {
// First check that the buildx plugin is correctly installed
let args = vec!["buildx", "version"];
let buildx_cmd_exist =
docker_exec(&args, &docker.get_all_envs(&[]), &mut |_| {}, &mut |_| {}, &CommandKiller::never());
let buildx_cmd_exist = docker_exec(
&args,
&docker.get_all_envs(&[]),
&mut |_| {},
&mut |_| {},
&CommandKiller::never(),
);
if buildx_cmd_exist.is_err() {
return Err(DockerError::InvalidConfig(
"Docker buildx plugin for buildkit is not correctly installed".to_string(),
@@ -101,7 +106,13 @@ impl Docker {
"--bootstrap",
"--use",
];
let _ = docker_exec(&args, &docker.get_all_envs(&[]), &mut |_| {}, &mut |_| {}, &CommandKiller::never());
let _ = docker_exec(
&args,
&docker.get_all_envs(&[]),
&mut |_| {},
&mut |_| {},
&CommandKiller::never(),
);
Ok(docker)
}
@@ -188,7 +199,13 @@ impl Docker {
{
info!("Docker pull {:?}", image);
docker_exec(&["pull", &image.image_name()], &self.get_all_envs(&[]), stdout_output, stderr_output, should_abort)
docker_exec(
&["pull", &image.image_name()],
&self.get_all_envs(&[]),
stdout_output,
stderr_output,
should_abort,
)
}
pub fn build<Stdout, Stderr>(
@@ -406,7 +423,13 @@ impl Docker {
let mut errored_commands = vec![];
for prune in all_prunes_commands {
let ret = docker_exec(&prune, &self.get_all_envs(&[]), &mut |_| {}, &mut |_| {}, &CommandKiller::never());
let ret = docker_exec(
&prune,
&self.get_all_envs(&[]),
&mut |_| {},
&mut |_| {},
&CommandKiller::never(),
);
if let Err(e) = ret {
errored_commands.push(e);
}

View File

@@ -129,9 +129,12 @@ impl Helm {
let mut stdout = String::new();
let mut stderr = String::new();
match helm_exec_with_output(&args, &self.get_all_envs(envs), &mut |line| stdout.push_str(&line), &mut |line| {
stderr.push_str(&line)
}) {
match helm_exec_with_output(
&args,
&self.get_all_envs(envs),
&mut |line| stdout.push_str(&line),
&mut |line| stderr.push_str(&line),
) {
Err(_) if stderr.contains("release: not found") => Err(ReleaseDoesNotExist(chart.name.clone())),
Err(err) => {
stderr.push_str(&err.message());

View File

@@ -412,7 +412,9 @@ where
P: AsRef<Path>,
{
if labels.is_empty() {
return Err(CommandError::new_from_safe_message("No labels were defined, can't set them".to_string()));
return Err(CommandError::new_from_safe_message(
"No labels were defined, can't set them".to_string(),
));
};
if !kubectl_exec_is_namespace_present(kubernetes_config.as_ref(), namespace, envs.clone()) {
@@ -436,8 +438,9 @@ where
_envs.push((KUBECONFIG, kubernetes_config.as_ref().to_str().unwrap()));
_envs.extend(envs.clone());
let _ =
kubectl_exec_with_output(command_args, _envs, &mut |line| info!("{}", line), &mut |line| error!("{}", line))?;
let _ = kubectl_exec_with_output(command_args, _envs, &mut |line| info!("{}", line), &mut |line| {
error!("{}", line)
})?;
Ok(())
}
@@ -545,10 +548,12 @@ where
_envs.push((KUBECONFIG, kubernetes_config.as_ref().to_str().unwrap()));
_envs.extend(envs);
let _ =
kubectl_exec_with_output(vec!["delete", "crd", crd_name], _envs, &mut |line| info!("{}", line), &mut |line| {
error!("{}", line)
})?;
let _ = kubectl_exec_with_output(
vec!["delete", "crd", crd_name],
_envs,
&mut |line| info!("{}", line),
&mut |line| error!("{}", line),
)?;
Ok(())
}
@@ -668,7 +673,9 @@ where
environment_variables.push(("KUBECONFIG", kubernetes_config.as_ref().to_str().unwrap()));
let args = vec!["-n", namespace, "rollout", "restart", "deployment", name];
kubectl_exec_with_output(args, environment_variables, &mut |line| info!("{}", line), &mut |line| error!("{}", line))
kubectl_exec_with_output(args, environment_variables, &mut |line| info!("{}", line), &mut |line| {
error!("{}", line)
})
}
pub fn kubectl_exec_get_node<P>(
@@ -767,7 +774,11 @@ pub fn kubectl_exec_get_configmap<P>(
where
P: AsRef<Path>,
{
kubectl_exec::<P, Configmap>(vec!["get", "configmap", "-o", "json", "-n", namespace, name], kubernetes_config, envs)
kubectl_exec::<P, Configmap>(
vec!["get", "configmap", "-o", "json", "-n", namespace, name],
kubernetes_config,
envs,
)
}
pub fn kubectl_exec_get_json_events<P>(
@@ -857,7 +868,10 @@ where
P: AsRef<Path>,
{
let pods = specific_pod_name.unwrap_or("*");
let api_url = format!("/apis/custom.metrics.k8s.io/v1beta1/namespaces/{}/pods/{}/{}", namespace, pods, metric_name);
let api_url = format!(
"/apis/custom.metrics.k8s.io/v1beta1/namespaces/{}/pods/{}/{}",
namespace, pods, metric_name
);
kubectl_exec::<P, KubernetesApiMetrics>(vec!["get", "--raw", api_url.as_str()], kubernetes_config, envs)
}

View File

@@ -1311,7 +1311,10 @@ mod tests {
assert_eq!(pod_status.is_ok(), true);
let pod_status = pod_status.unwrap();
assert_eq!(pod_status.items[0].status.conditions[0].status, "False");
assert_eq!(pod_status.items[0].status.conditions[0].reason, KubernetesPodStatusReason::CrashLoopBackOff);
assert_eq!(
pod_status.items[0].status.conditions[0].reason,
KubernetesPodStatusReason::CrashLoopBackOff
);
let payload = r#"{
"apiVersion": "v1",
@@ -1584,7 +1587,10 @@ mod tests {
let pod_status = serde_json::from_str::<KubernetesList<KubernetesPod>>(payload);
assert!(pod_status.is_ok());
assert_eq!(pod_status.unwrap().items[0].status.conditions[0].reason, KubernetesPodStatusReason::Unknown(None));
assert_eq!(
pod_status.unwrap().items[0].status.conditions[0].reason,
KubernetesPodStatusReason::Unknown(None)
);
}
#[test]

View File

@@ -27,7 +27,10 @@ fn manage_common_issues(terraform_provider_lock: &str, err: &CommandError) -> Re
Ok(_) => Ok(()),
Err(e) => Err(CommandError::new(
format!("Wasn't able to delete terraform lock file {}", &terraform_provider_lock),
Some(format!("Wasn't able to delete terraform lock file {}, error: {:?}", &terraform_provider_lock, e)),
Some(format!(
"Wasn't able to delete terraform lock file {}, error: {:?}",
&terraform_provider_lock, e
)),
)),
};
} else if err.message().contains("Plugin reinitialization required") {
@@ -35,7 +38,9 @@ fn manage_common_issues(terraform_provider_lock: &str, err: &CommandError) -> Re
return Ok(());
}
Err(CommandError::new_from_safe_message("Not known method to fix this Terraform issue".to_string()))
Err(CommandError::new_from_safe_message(
"Not known method to fix this Terraform issue".to_string(),
))
}
fn terraform_init_validate(root_dir: &str) -> Result<(), CommandError> {

View File

@@ -148,8 +148,11 @@ impl DOCR {
}
pub fn exec_docr_login(&self) -> Result<(), ContainerRegistryError> {
let mut cmd =
QoveryCommand::new("doctl", &["registry", "login", self.name.as_str(), "-t", self.api_key.as_str()], &[]);
let mut cmd = QoveryCommand::new(
"doctl",
&["registry", "login", self.name.as_str(), "-t", self.api_key.as_str()],
&[],
);
match cmd.exec() {
Ok(_) => Ok(()),

View File

@@ -73,7 +73,9 @@ impl DnsProvider for Cloudflare {
fn is_valid(&self) -> Result<(), EngineError> {
if self.cloudflare_api_token.is_empty() || self.cloudflare_email.is_empty() {
Err(EngineError::new_client_invalid_cloud_provider_credentials(self.get_event_details()))
Err(EngineError::new_client_invalid_cloud_provider_credentials(
self.get_event_details(),
))
} else {
Ok(())
}

View File

@@ -111,7 +111,11 @@ pub fn cast_simple_error_to_engine_error<X, T: Into<String>>(
Err(simple_error) => {
let message = match simple_error.kind {
SimpleErrorKind::Command(exit_status) => {
format!("{} ({})", simple_error.message.unwrap_or_else(|| "<no message>".into()), exit_status)
format!(
"{} ({})",
simple_error.message.unwrap_or_else(|| "<no message>".into()),
exit_status
)
}
SimpleErrorKind::Other => simple_error.message.unwrap_or_else(|| "<no message>".into()),
};

View File

@@ -469,7 +469,15 @@ impl EngineError {
link: Option<Url>,
hint_message: Option<String>,
) -> EngineError {
EngineError::new(event_details, Tag::Unknown, qovery_log_message, user_log_message, message, link, hint_message)
EngineError::new(
event_details,
Tag::Unknown,
qovery_log_message,
user_log_message,
message,
link,
hint_message,
)
}
/// Creates new error for missing required env variable.
@@ -482,7 +490,15 @@ impl EngineError {
/// * `variable_name`: Variable name which is not set.
pub fn new_missing_required_env_variable(event_details: EventDetails, variable_name: String) -> EngineError {
let message = format!("`{}` environment variable wasn't found.", variable_name);
EngineError::new(event_details, Tag::MissingRequiredEnvVariable, message.to_string(), message, None, None, None)
EngineError::new(
event_details,
Tag::MissingRequiredEnvVariable,
message.to_string(),
message,
None,
None,
None,
)
}
/// Creates new error for cluster has no worker nodes.
@@ -1175,7 +1191,15 @@ impl EngineError {
selector, namespace
);
EngineError::new(event_details, Tag::K8sGetLogs, message.to_string(), message, Some(raw_error), None, None)
EngineError::new(
event_details,
Tag::K8sGetLogs,
message.to_string(),
message,
Some(raw_error),
None,
None,
)
}
/// Creates new error for kubernetes get events.
@@ -1192,7 +1216,15 @@ impl EngineError {
) -> EngineError {
let message = format!("Error, unable to retrieve events in namespace `{}`.", namespace);
EngineError::new(event_details, Tag::K8sGetLogs, message.to_string(), message, Some(raw_error), None, None)
EngineError::new(
event_details,
Tag::K8sGetLogs,
message.to_string(),
message,
Some(raw_error),
None,
None,
)
}
/// Creates new error for kubernetes describe.
@@ -1209,10 +1241,20 @@ impl EngineError {
namespace: String,
raw_error: CommandError,
) -> EngineError {
let message =
format!("Error, unable to describe pod with selector `{}` in namespace `{}`.", selector, namespace);
let message = format!(
"Error, unable to describe pod with selector `{}` in namespace `{}`.",
selector, namespace
);
EngineError::new(event_details, Tag::K8sDescribe, message.to_string(), message, Some(raw_error), None, None)
EngineError::new(
event_details,
Tag::K8sDescribe,
message.to_string(),
message,
Some(raw_error),
None,
None,
)
}
/// Creates new error for kubernetes history.
@@ -1225,7 +1267,15 @@ impl EngineError {
pub fn new_k8s_history(event_details: EventDetails, namespace: String, raw_error: CommandError) -> EngineError {
let message = format!("Error, unable to get history in namespace `{}`.", namespace);
EngineError::new(event_details, Tag::K8sHistory, message.to_string(), message, Some(raw_error), None, None)
EngineError::new(
event_details,
Tag::K8sHistory,
message.to_string(),
message,
Some(raw_error),
None,
None,
)
}
/// Creates new error for kubernetes namespace creation issue.
@@ -1267,7 +1317,10 @@ impl EngineError {
namespace: String,
raw_error: CommandError,
) -> EngineError {
let message = format!("Error, pod with selector `{}` in namespace `{}` is not ready.", selector, namespace);
let message = format!(
"Error, pod with selector `{}` in namespace `{}` is not ready.",
selector, namespace
);
EngineError::new(
event_details,
@@ -1364,7 +1417,15 @@ impl EngineError {
pub fn new_missing_required_binary(event_details: EventDetails, missing_binary_name: String) -> EngineError {
let message = format!("`{}` binary is required but was not found.", missing_binary_name);
EngineError::new(event_details, Tag::CannotFindRequiredBinary, message.to_string(), message, None, None, None)
EngineError::new(
event_details,
Tag::CannotFindRequiredBinary,
message.to_string(),
message,
None,
None,
None,
)
}
/// Creates new error for subnets count not being even. Subnets count should be even to get the same number as private and public.
@@ -1384,7 +1445,15 @@ impl EngineError {
zone_name, subnets_count,
);
EngineError::new(event_details, Tag::SubnetsCountShouldBeEven, message.to_string(), message, None, None, None)
EngineError::new(
event_details,
Tag::SubnetsCountShouldBeEven,
message.to_string(),
message,
None,
None,
None,
)
}
/// Creates new error for IAM role which cannot be retrieved or created.
@@ -1568,8 +1637,10 @@ impl EngineError {
parameter_value: String,
raw_error: Option<CommandError>,
) -> EngineError {
let message =
format!("{} value `{}` not supported for parameter `{}`", service_type, parameter_value, parameter_name,);
let message = format!(
"{} value `{}` not supported for parameter `{}`",
service_type, parameter_value, parameter_name,
);
EngineError::new(
event_details,
@@ -1667,7 +1738,15 @@ impl EngineError {
/// * `event_details`: Error linked event details.
/// * `error`: Raw error message.
pub fn new_build_error(event_details: EventDetails, error: BuildError) -> EngineError {
EngineError::new(event_details, Tag::BuilderError, error.to_string(), error.to_string(), None, None, None)
EngineError::new(
event_details,
Tag::BuilderError,
error.to_string(),
error.to_string(),
None,
None,
None,
)
}
/// Creates new error from an Container Registry error
@@ -1732,8 +1811,10 @@ impl EngineError {
namespace: String,
raw_error: CommandError,
) -> EngineError {
let message =
format!("Error while trying to get helm chart `{}` history in namespace `{}`.", helm_chart, namespace);
let message = format!(
"Error while trying to get helm chart `{}` history in namespace `{}`.",
helm_chart, namespace
);
EngineError::new(
event_details,
@@ -1805,7 +1886,15 @@ impl EngineError {
) -> EngineError {
let message = format!("Error, version `{}` is not supported for `{}`.", version, product_name);
EngineError::new(event_details, Tag::UnsupportedVersion, message.to_string(), message, None, None, None)
EngineError::new(
event_details,
Tag::UnsupportedVersion,
message.to_string(),
message,
None,
None,
None,
)
}
/// Creates new error while trying to get cluster.
@@ -1868,7 +1957,10 @@ impl EngineError {
service_name: String,
) -> EngineError {
// TODO(benjaminch): Service should probably passed otherwise, either inside event_details or via a new dedicated struct.
let message = format!("Service `{}` (id `{}`) failed to deploy (before start).", service_name, service_id);
let message = format!(
"Service `{}` (id `{}`) failed to deploy (before start).",
service_name, service_id
);
EngineError::new(
event_details,
@@ -1895,8 +1987,10 @@ impl EngineError {
service_type: String,
raw_error: Option<CommandError>,
) -> EngineError {
let message =
format!("Database `{}` (id `{}`) failed to start after several retries.", service_type, service_id);
let message = format!(
"Database `{}` (id `{}`) failed to start after several retries.",
service_type, service_id
);
EngineError::new(
event_details,
@@ -2203,7 +2297,15 @@ impl EngineError {
/// * `event_details`: Error linked event details.
/// * `error`: Raw error message.
pub fn new_docker_error(event_details: EventDetails, error: DockerError) -> EngineError {
EngineError::new(event_details, Tag::DockerError, error.to_string(), error.to_string(), None, None, None)
EngineError::new(
event_details,
Tag::DockerError,
error.to_string(),
error.to_string(),
None,
None,
None,
)
}
/// Creates new error when trying to push a Docker image.
@@ -2220,8 +2322,10 @@ impl EngineError {
repository_url: String,
raw_error: CommandError,
) -> EngineError {
let message =
format!("Error, trying to push Docker image `{}` to repository `{}`.", image_name, repository_url);
let message = format!(
"Error, trying to push Docker image `{}` to repository `{}`.",
image_name, repository_url
);
EngineError::new(
event_details,
@@ -2248,8 +2352,10 @@ impl EngineError {
repository_url: String,
raw_error: CommandError,
) -> EngineError {
let message =
format!("Error, trying to pull Docker image `{}` from repository `{}`.", image_name, repository_url);
let message = format!(
"Error, trying to pull Docker image `{}` from repository `{}`.",
image_name, repository_url
);
EngineError::new(
event_details,
@@ -2399,8 +2505,10 @@ impl EngineError {
event_details: EventDetails,
repository_name: String,
) -> EngineError {
let message =
format!("Failed to retrieve credentials and endpoint URL from container registry `{}`.", repository_name,);
let message = format!(
"Failed to retrieve credentials and endpoint URL from container registry `{}`.",
repository_name,
);
EngineError::new(
event_details,
@@ -2617,7 +2725,10 @@ impl EngineError {
file_name: String,
raw_error: ObjectStorageError,
) -> EngineError {
let message = format!("Error, cannot put file `{}` into object storage bucket `{}`.", file_name, bucket_name,);
let message = format!(
"Error, cannot put file `{}` into object storage bucket `{}`.",
file_name, bucket_name,
);
EngineError::new(
event_details,
@@ -2692,8 +2803,10 @@ impl EngineError {
bucket_name: String,
raw_error: CommandError,
) -> EngineError {
let message =
format!("Error while trying to activate versioning for object storage bucket `{}`.", bucket_name,);
let message = format!(
"Error while trying to activate versioning for object storage bucket `{}`.",
bucket_name,
);
EngineError::new(
event_details,

View File

@@ -458,7 +458,12 @@ mod tests {
fn test_event_message() {
// setup:
let test_cases: Vec<(String, Option<String>, EventMessageVerbosity, String)> = vec![
("safe".to_string(), Some("raw".to_string()), EventMessageVerbosity::SafeOnly, "safe".to_string()),
(
"safe".to_string(),
Some("raw".to_string()),
EventMessageVerbosity::SafeOnly,
"safe".to_string(),
),
("safe".to_string(), None, EventMessageVerbosity::SafeOnly, "safe".to_string()),
("safe".to_string(), None, EventMessageVerbosity::FullDetails, "safe".to_string()),
(
@@ -483,11 +488,26 @@ mod tests {
fn test_stage_sub_step_name() {
// setup:
let test_cases: Vec<(Stage, String)> = vec![
(Stage::Infrastructure(InfrastructureStep::Create), InfrastructureStep::Create.to_string()),
(Stage::Infrastructure(InfrastructureStep::Upgrade), InfrastructureStep::Upgrade.to_string()),
(Stage::Infrastructure(InfrastructureStep::Delete), InfrastructureStep::Delete.to_string()),
(Stage::Infrastructure(InfrastructureStep::Resume), InfrastructureStep::Resume.to_string()),
(Stage::Infrastructure(InfrastructureStep::Pause), InfrastructureStep::Pause.to_string()),
(
Stage::Infrastructure(InfrastructureStep::Create),
InfrastructureStep::Create.to_string(),
),
(
Stage::Infrastructure(InfrastructureStep::Upgrade),
InfrastructureStep::Upgrade.to_string(),
),
(
Stage::Infrastructure(InfrastructureStep::Delete),
InfrastructureStep::Delete.to_string(),
),
(
Stage::Infrastructure(InfrastructureStep::Resume),
InfrastructureStep::Resume.to_string(),
),
(
Stage::Infrastructure(InfrastructureStep::Pause),
InfrastructureStep::Pause.to_string(),
),
(
Stage::Infrastructure(InfrastructureStep::LoadConfiguration),
InfrastructureStep::LoadConfiguration.to_string(),

View File

@@ -113,7 +113,11 @@ pub fn cleanup_workspace_directory(working_root_dir: &str, execution_id: &str) -
Err(err) => {
error!(
"{}",
format!("error trying to remove workspace directory '{}', error: {}", workspace_dir.as_str(), err)
format!(
"error trying to remove workspace directory '{}', error: {}",
workspace_dir.as_str(),
err
)
);
Err(err)
}

View File

@@ -49,7 +49,10 @@ fn checkout<'a>(repo: &'a Repository, commit_id: &'a str) -> Result<Object<'a>,
.find_remote("origin")
.map(|remote| remote.url().unwrap_or_default().to_string())
.unwrap_or_default();
let msg = format!("Unable to use git object commit ID {} on repository {}: {}", &commit_id, &repo_url, &err);
let msg = format!(
"Unable to use git object commit ID {} on repository {}: {}",
&commit_id, &repo_url, &err
);
Error::from_str(&msg)
})?;
@@ -188,11 +191,19 @@ mod tests {
let repo_path = repo_dir.path();
// We only allow https:// at the moment
let repo = clone(&Url::parse("ssh://git@github.com/Qovery/engine.git").unwrap(), &repo_path, &|_| vec![]);
let repo = clone(
&Url::parse("ssh://git@github.com/Qovery/engine.git").unwrap(),
&repo_path,
&|_| vec![],
);
assert!(matches!(repo, Err(e) if e.message().contains("https://")));
// Repository must be empty
let repo = clone(&Url::parse("https://github.com/Qovery/engine-testing.git").unwrap(), &repo_path, &|_| vec![]);
let repo = clone(
&Url::parse("https://github.com/Qovery/engine-testing.git").unwrap(),
&repo_path,
&|_| vec![],
);
assert!(repo.is_ok()); // clone makes sure to empty the directory
// Working case
@@ -210,10 +221,16 @@ mod tests {
{
let clone_dir = DirectoryForTests::new_with_random_suffix("/tmp/engine_test_clone".to_string());
let get_credentials = |_: &str| {
vec![(CredentialType::USER_PASS_PLAINTEXT, Cred::userpass_plaintext("FAKE", "FAKE").unwrap())]
vec![(
CredentialType::USER_PASS_PLAINTEXT,
Cred::userpass_plaintext("FAKE", "FAKE").unwrap(),
)]
};
let repo =
clone(&Url::parse("https://gitlab.com/qovery/q-core.git").unwrap(), clone_dir.path(), &get_credentials);
let repo = clone(
&Url::parse("https://gitlab.com/qovery/q-core.git").unwrap(),
clone_dir.path(),
&get_credentials,
);
assert!(matches!(repo, Err(repo) if repo.message().contains("authentication")));
}
@@ -246,9 +263,12 @@ mod tests {
#[test]
fn test_git_checkout() {
let clone_dir = DirectoryForTests::new_with_random_suffix("/tmp/engine_test_checkout".to_string());
let repo =
clone(&Url::parse("https://github.com/Qovery/engine-testing.git").unwrap(), clone_dir.path(), &|_| vec![])
.unwrap();
let repo = clone(
&Url::parse("https://github.com/Qovery/engine-testing.git").unwrap(),
clone_dir.path(),
&|_| vec![],
)
.unwrap();
// Invalid commit for this repository
let check = checkout(&repo, "c2c2101f8e4c4ffadb326dc440ba8afb4aeb1310");
@@ -305,7 +325,10 @@ mod tests {
CredentialType::SSH_MEMORY,
Cred::ssh_key_from_memory(user, None, &invalid_ssh_key, Some("toto")).unwrap(),
),
(CredentialType::SSH_MEMORY, Cred::ssh_key_from_memory(user, None, &ssh_key, None).unwrap()),
(
CredentialType::SSH_MEMORY,
Cred::ssh_key_from_memory(user, None, &ssh_key, None).unwrap(),
),
(
CredentialType::SSH_MEMORY,
Cred::ssh_key_from_memory(user, None, &invalid_ssh_key, Some("toto")).unwrap(),

View File

@@ -129,7 +129,10 @@ mod tests {
),
qovery_message.to_string(),
user_message.to_string(),
Some(errors::CommandError::new(safe_message.to_string(), Some(raw_message.to_string()))),
Some(errors::CommandError::new(
safe_message.to_string(),
Some(raw_message.to_string()),
)),
Some(link),
Some(hint.to_string()),
),
@@ -205,9 +208,21 @@ mod tests {
tc.description
);
assert!(logs_contain(format!("organization_id=\"{}\"", orga_id.short()).as_str()), "{}", tc.description);
assert!(logs_contain(format!("cluster_id=\"{}\"", cluster_id.short()).as_str()), "{}", tc.description);
assert!(logs_contain(format!("execution_id=\"{}\"", execution_id).as_str()), "{}", tc.description);
assert!(
logs_contain(format!("organization_id=\"{}\"", orga_id.short()).as_str()),
"{}",
tc.description
);
assert!(
logs_contain(format!("cluster_id=\"{}\"", cluster_id.short()).as_str()),
"{}",
tc.description
);
assert!(
logs_contain(format!("execution_id=\"{}\"", execution_id).as_str()),
"{}",
tc.description
);
let details = tc.event.get_details();
assert!(
@@ -240,13 +255,21 @@ mod tests {
tc.description
);
assert!(logs_contain(format!("stage=\"{}\"", details.stage()).as_str()), "{}", tc.description);
assert!(
logs_contain(format!("stage=\"{}\"", details.stage()).as_str()),
"{}",
tc.description
);
assert!(
logs_contain(format!("step=\"{}\"", details.stage().sub_step_name()).as_str()),
"{}",
tc.description
);
assert!(logs_contain(format!("transmitter=\"{}\"", details.transmitter()).as_str()), "{}", tc.description);
assert!(
logs_contain(format!("transmitter=\"{}\"", details.transmitter()).as_str()),
"{}",
tc.description
);
// Logger should display everything
assert!(logs_contain(safe_message), "{}", tc.description);

View File

@@ -1426,8 +1426,16 @@ mod tests {
let result = QoveryIdentifier::new_from_long_id(tc.input.clone());
// verify:
assert_eq!(tc.expected_long_id_output, result.raw_long_id, "case {} : '{}'", tc.description, tc.input);
assert_eq!(tc.expected_short_output, result.short, "case {} : '{}'", tc.description, tc.input);
assert_eq!(
tc.expected_long_id_output, result.raw_long_id,
"case {} : '{}'",
tc.description, tc.input
);
assert_eq!(
tc.expected_short_output, result.short,
"case {} : '{}'",
tc.description, tc.input
);
}
}
}

View File

@@ -60,8 +60,10 @@ impl S3 {
fn get_s3_client(&self) -> S3Client {
let region = RusotoRegion::from_str(&self.region.to_aws_format())
.unwrap_or_else(|_| panic!("S3 region `{}` doesn't seems to be valid.", self.region.to_aws_format()));
let client =
Client::new_with(self.get_credentials(), HttpClient::new().expect("unable to create new Http client"));
let client = Client::new_with(
self.get_credentials(),
HttpClient::new().expect("unable to create new Http client"),
);
S3Client::new_with_client(client, region)
}

View File

@@ -23,7 +23,10 @@ where
tera::ErrorKind::TemplateNotFound(x) => format!("template not found: {}", x),
tera::ErrorKind::Msg(x) => format!("tera error: {}", x),
tera::ErrorKind::CircularExtend { tpl, inheritance_chain } => {
format!("circular extend - template: {}, inheritance chain: {:?}", tpl, inheritance_chain)
format!(
"circular extend - template: {}, inheritance chain: {:?}",
tpl, inheritance_chain
)
}
tera::ErrorKind::MissingParent { current, parent } => {
format!("missing parent - current: {}, parent: {}", current, parent)

View File

@@ -93,7 +93,14 @@ impl Cluster<AWS, Options> for AWS {
vpc_network_mode,
);
EngineConfig::new(context.clone(), build_platform, container_registry, cloud_provider, dns_provider, k)
EngineConfig::new(
context.clone(),
build_platform,
container_registry,
cloud_provider,
dns_provider,
k,
)
}
fn cloud_provider(context: &Context) -> Box<AWS> {

View File

@@ -76,7 +76,14 @@ impl Cluster<DO, DoksOptions> for DO {
vpc_network_mode,
);
EngineConfig::new(context.clone(), build_platform, container_registry, cloud_provider, dns_provider, k)
EngineConfig::new(
context.clone(),
build_platform,
container_registry,
cloud_provider,
dns_provider,
k,
)
}
fn cloud_provider(context: &Context) -> Box<DO> {

View File

@@ -104,7 +104,14 @@ impl Cluster<Scaleway, KapsuleOptions> for Scaleway {
vpc_network_mode,
);
EngineConfig::new(context.clone(), build_platform, container_registry, cloud_provider, dns_provider, cluster)
EngineConfig::new(
context.clone(),
build_platform,
container_registry,
cloud_provider,
dns_provider,
cluster,
)
}
fn cloud_provider(context: &Context) -> Box<Scaleway> {
@@ -222,8 +229,14 @@ pub fn clean_environments(
let secret_token = secrets.SCALEWAY_SECRET_KEY.unwrap();
let project_id = secrets.SCALEWAY_DEFAULT_PROJECT_ID.unwrap();
let container_registry_client =
ScalewayCR::new(context.clone(), "test", "test", secret_token.as_str(), project_id.as_str(), zone)?;
let container_registry_client = ScalewayCR::new(
context.clone(),
"test",
"test",
secret_token.as_str(),
project_id.as_str(),
zone,
)?;
// delete images created in registry
let registry_url = container_registry_client.registry_info();

View File

@@ -169,13 +169,21 @@ impl FuncTestsSecrets {
fn get_vault_config() -> Result<VaultConfig, Error> {
let vault_addr = match env::var_os("VAULT_ADDR") {
Some(x) => x.into_string().unwrap(),
None => return Err(Error::new(ErrorKind::NotFound, format!("VAULT_ADDR environment variable is missing"))),
None => {
return Err(Error::new(
ErrorKind::NotFound,
format!("VAULT_ADDR environment variable is missing"),
))
}
};
let vault_token = match env::var_os("VAULT_TOKEN") {
Some(x) => x.into_string().unwrap(),
None => {
return Err(Error::new(ErrorKind::NotFound, format!("VAULT_TOKEN environment variable is missing")))
return Err(Error::new(
ErrorKind::NotFound,
format!("VAULT_TOKEN environment variable is missing"),
))
}
};
@@ -370,7 +378,10 @@ pub fn init() -> Instant {
None => tracing_subscriber::fmt().try_init(),
};
info!("running from current directory: {}", std::env::current_dir().unwrap().to_str().unwrap());
info!(
"running from current directory: {}",
std::env::current_dir().unwrap().to_str().unwrap()
);
Instant::now()
}
@@ -701,7 +712,10 @@ fn get_cloud_provider_credentials(provider_kind: Kind, secrets: &FuncTestsSecret
Kind::Scw => vec![
(SCALEWAY_ACCESS_KEY, secrets.SCALEWAY_ACCESS_KEY.as_ref().unwrap().as_str()),
(SCALEWAY_SECRET_KEY, secrets.SCALEWAY_SECRET_KEY.as_ref().unwrap().as_str()),
(SCALEWAY_DEFAULT_PROJECT_ID, secrets.SCALEWAY_DEFAULT_PROJECT_ID.as_ref().unwrap().as_str()),
(
SCALEWAY_DEFAULT_PROJECT_ID,
secrets.SCALEWAY_DEFAULT_PROJECT_ID.as_ref().unwrap().as_str(),
),
],
}
}

View File

@@ -330,7 +330,10 @@ fn postgresql_deploy_a_working_environment_and_redeploy() {
}
let ret = environment_delete.delete_environment(&ea_delete, logger, &engine_config_for_delete);
assert!(matches!(ret, TransactionResult::Ok | TransactionResult::UnrecoverableError(_, _)));
assert!(matches!(
ret,
TransactionResult::Ok | TransactionResult::UnrecoverableError(_, _)
));
test_name.to_string()
})

View File

@@ -117,7 +117,13 @@ fn deploy_a_working_environment_and_pause_it_eks() {
let ret = environment.deploy_environment(&ea, logger.clone(), &engine_config);
assert!(matches!(ret, TransactionResult::Ok));
let ret = get_pods(context.clone(), Kind::Aws, environment.clone(), selector.as_str(), secrets.clone());
let ret = get_pods(
context.clone(),
Kind::Aws,
environment.clone(),
selector.as_str(),
secrets.clone(),
);
assert_eq!(ret.is_ok(), true);
assert_eq!(ret.unwrap().items.is_empty(), false);
@@ -125,7 +131,13 @@ fn deploy_a_working_environment_and_pause_it_eks() {
assert!(matches!(ret, TransactionResult::Ok));
// Check that we have actually 0 pods running for this app
let ret = get_pods(context.clone(), Kind::Aws, environment.clone(), selector.as_str(), secrets.clone());
let ret = get_pods(
context.clone(),
Kind::Aws,
environment.clone(),
selector.as_str(),
secrets.clone(),
);
assert_eq!(ret.is_ok(), true);
assert_eq!(ret.unwrap().items.is_empty(), true);
@@ -268,7 +280,10 @@ fn deploy_a_not_working_environment_with_no_router_on_aws_eks() {
assert!(matches!(ret, TransactionResult::UnrecoverableError(_, _)));
let ret = environment_delete.delete_environment(&ea_delete, logger, &engine_config_for_delete);
assert!(matches!(ret, TransactionResult::Ok | TransactionResult::UnrecoverableError(_, _)));
assert!(matches!(
ret,
TransactionResult::Ok | TransactionResult::UnrecoverableError(_, _)
));
test_name.to_string()
})
@@ -626,8 +641,13 @@ fn redeploy_same_app_with_ebs() {
};
let app_name = format!("{}-0", &environment_check1.applications[0].name);
let (_, number) =
is_pod_restarted_env(context.clone(), Kind::Aws, environment_check1, app_name.as_str(), secrets.clone());
let (_, number) = is_pod_restarted_env(
context.clone(),
Kind::Aws,
environment_check1,
app_name.as_str(),
secrets.clone(),
);
let ret = environment_redeploy.deploy_environment(&ea2, logger.clone(), &engine_config_bis);
assert!(matches!(ret, TransactionResult::Ok));
@@ -796,12 +816,18 @@ fn deploy_ok_fail_fail_ok_environment() {
// FAIL and rollback
let ret =
not_working_env_1.deploy_environment(&ea_not_working_1, logger.clone(), &engine_config_for_not_working_1);
assert!(matches!(ret, TransactionResult::Rollback(_) | TransactionResult::UnrecoverableError(_, _)));
assert!(matches!(
ret,
TransactionResult::Rollback(_) | TransactionResult::UnrecoverableError(_, _)
));
// FAIL and Rollback again
let ret =
not_working_env_2.deploy_environment(&ea_not_working_2, logger.clone(), &engine_config_for_not_working_2);
assert!(matches!(ret, TransactionResult::Rollback(_) | TransactionResult::UnrecoverableError(_, _)));
assert!(matches!(
ret,
TransactionResult::Rollback(_) | TransactionResult::UnrecoverableError(_, _)
));
// Should be working
let ret = environment.deploy_environment(&ea, logger.clone(), &engine_config);

View File

@@ -25,7 +25,10 @@ fn create_and_destroy_eks_cluster(
cluster_test(
test_name,
Kind::Aws,
context(generate_id().as_str(), generate_cluster_id(region.to_string().as_str()).as_str()),
context(
generate_id().as_str(),
generate_cluster_id(region.to_string().as_str()).as_str(),
),
logger(),
region.to_aws_format().as_str(),
Some(zones),

View File

@@ -172,7 +172,11 @@ fn test_put_file() {
let temp_file = NamedTempFile::new().expect("error while creating tempfile");
// compute:
let result = aws_os.put(bucket_name.as_str(), object_key.as_str(), temp_file.into_temp_path().to_str().unwrap());
let result = aws_os.put(
bucket_name.as_str(),
object_key.as_str(),
temp_file.into_temp_path().to_str().unwrap(),
);
// validate:
assert!(result.is_ok());

View File

@@ -131,7 +131,13 @@ fn deploy_an_environment_with_db_and_pause_it() {
// Check that we have actually 0 pods running for this db
let app_name = format!("postgresql{}-0", environment.databases[0].name);
let ret = get_pods(context.clone(), ProviderKind::Do, environment.clone(), app_name.as_str(), secrets.clone());
let ret = get_pods(
context.clone(),
ProviderKind::Do,
environment.clone(),
app_name.as_str(),
secrets.clone(),
);
assert_eq!(ret.is_ok(), true);
assert_eq!(ret.unwrap().items.is_empty(), true);
@@ -362,7 +368,10 @@ fn postgresql_deploy_a_working_environment_and_redeploy() {
}
let ret = environment_delete.delete_environment(&env_action_delete, logger, &engine_config_for_delete);
assert!(matches!(ret, TransactionResult::Ok | TransactionResult::UnrecoverableError(_, _)));
assert!(matches!(
ret,
TransactionResult::Ok | TransactionResult::UnrecoverableError(_, _)
));
// delete images created during test from registries
if let Err(e) = clean_environments(&context, vec![environment], secrets, DO_TEST_REGION) {

View File

@@ -125,7 +125,10 @@ fn digitalocean_doks_deploy_a_not_working_environment_with_no_router() {
let result =
environment_for_delete.delete_environment(&env_action_for_delete, logger, &engine_config_for_delete);
assert!(matches!(result, TransactionResult::Ok | TransactionResult::UnrecoverableError(_, _)));
assert!(matches!(
result,
TransactionResult::Ok | TransactionResult::UnrecoverableError(_, _)
));
if let Err(e) = clean_environments(&context, vec![environment], secrets, DO_TEST_REGION) {
warn!("cannot clean environments, error: {:?}", e);
@@ -176,7 +179,13 @@ fn digitalocean_doks_deploy_a_working_environment_and_pause() {
let ret = environment.deploy_environment(&env_action, logger.clone(), &engine_config);
assert!(matches!(ret, TransactionResult::Ok));
let ret = get_pods(context.clone(), Kind::Do, environment.clone(), selector.as_str(), secrets.clone());
let ret = get_pods(
context.clone(),
Kind::Do,
environment.clone(),
selector.as_str(),
secrets.clone(),
);
assert_eq!(ret.is_ok(), true);
assert_eq!(ret.unwrap().items.is_empty(), false);
@@ -184,7 +193,13 @@ fn digitalocean_doks_deploy_a_working_environment_and_pause() {
assert!(matches!(ret, TransactionResult::Ok));
// Check that we have actually 0 pods running for this app
let ret = get_pods(context.clone(), Kind::Do, environment.clone(), selector.as_str(), secrets.clone());
let ret = get_pods(
context.clone(),
Kind::Do,
environment.clone(),
selector.as_str(),
secrets.clone(),
);
assert_eq!(ret.is_ok(), true);
assert_eq!(ret.unwrap().items.is_empty(), true);
@@ -194,7 +209,13 @@ fn digitalocean_doks_deploy_a_working_environment_and_pause() {
let ret = environment.deploy_environment(&env_action, logger.clone(), &engine_config_resume);
assert!(matches!(ret, TransactionResult::Ok));
let ret = get_pods(context.clone(), Kind::Do, environment.clone(), selector.as_str(), secrets.clone());
let ret = get_pods(
context.clone(),
Kind::Do,
environment.clone(),
selector.as_str(),
secrets.clone(),
);
assert_eq!(ret.is_ok(), true);
assert_eq!(ret.unwrap().items.is_empty(), false);
@@ -497,14 +518,24 @@ fn digitalocean_doks_redeploy_same_app() {
};
let app_name = format!("{}-0", &environment_check1.applications[0].name);
let (_, number) =
is_pod_restarted_env(context.clone(), Kind::Do, environment_check1, app_name.as_str(), secrets.clone());
let (_, number) = is_pod_restarted_env(
context.clone(),
Kind::Do,
environment_check1,
app_name.as_str(),
secrets.clone(),
);
let result = environment_redeploy.deploy_environment(&env_action_redeploy, logger.clone(), &engine_config_bis);
assert!(matches!(result, TransactionResult::Ok));
let (_, number2) =
is_pod_restarted_env(context.clone(), Kind::Do, environment_check2, app_name.as_str(), secrets.clone());
let (_, number2) = is_pod_restarted_env(
context.clone(),
Kind::Do,
environment_check2,
app_name.as_str(),
secrets.clone(),
);
// nothing changed in the app, so, it shouldn't be restarted
assert!(number.eq(&number2));
@@ -677,7 +708,10 @@ fn digitalocean_doks_deploy_ok_fail_fail_ok_environment() {
logger.clone(),
&engine_config_for_not_working_1,
);
assert!(matches!(result, TransactionResult::Rollback(_) | TransactionResult::UnrecoverableError(_, _)));
assert!(matches!(
result,
TransactionResult::Rollback(_) | TransactionResult::UnrecoverableError(_, _)
));
// FAIL and Rollback again
let result = not_working_env_2.deploy_environment(
@@ -685,7 +719,10 @@ fn digitalocean_doks_deploy_ok_fail_fail_ok_environment() {
logger.clone(),
&engine_config_for_not_working_2,
);
assert!(matches!(result, TransactionResult::Rollback(_) | TransactionResult::UnrecoverableError(_, _)));
assert!(matches!(
result,
TransactionResult::Rollback(_) | TransactionResult::UnrecoverableError(_, _)
));
// Should be working
let result = environment.deploy_environment(&env_action, logger.clone(), &engine_config);

View File

@@ -170,7 +170,11 @@ fn test_put_file() {
let temp_file = NamedTempFile::new().expect("error while creating tempfile");
// compute:
let result = spaces.put(bucket_name.as_str(), object_key.as_str(), temp_file.into_temp_path().to_str().unwrap());
let result = spaces.put(
bucket_name.as_str(),
object_key.as_str(),
temp_file.into_temp_path().to_str().unwrap(),
);
// validate:
assert!(result.is_ok());

View File

@@ -137,7 +137,13 @@ fn deploy_an_environment_with_db_and_pause_it() {
// Check that we have actually 0 pods running for this db
let app_name = format!("postgresql{}-0", environment.databases[0].name);
let ret = get_pods(context.clone(), ProviderKind::Scw, environment.clone(), app_name.as_str(), secrets.clone());
let ret = get_pods(
context.clone(),
ProviderKind::Scw,
environment.clone(),
app_name.as_str(),
secrets.clone(),
);
assert_eq!(ret.is_ok(), true);
assert_eq!(ret.unwrap().items.is_empty(), true);
@@ -367,7 +373,10 @@ fn postgresql_deploy_a_working_environment_and_redeploy() {
}
let result = environment_delete.delete_environment(&env_action_delete, logger, &engine_config_for_delete);
assert!(matches!(result, TransactionResult::Ok | TransactionResult::UnrecoverableError(_, _)));
assert!(matches!(
result,
TransactionResult::Ok | TransactionResult::UnrecoverableError(_, _)
));
// delete images created during test from registries
if let Err(e) = clean_environments(&context, vec![environment], secrets, SCW_TEST_ZONE) {

View File

@@ -129,7 +129,10 @@ fn scaleway_kapsule_deploy_a_not_working_environment_with_no_router() {
let result =
environment_for_delete.delete_environment(&env_action_for_delete, logger, &engine_config_for_delete);
assert!(matches!(result, TransactionResult::Ok | TransactionResult::UnrecoverableError(_, _)));
assert!(matches!(
result,
TransactionResult::Ok | TransactionResult::UnrecoverableError(_, _)
));
if let Err(e) = clean_environments(&context, vec![environment], secrets, SCW_TEST_ZONE) {
warn!("cannot clean environments, error: {:?}", e);
@@ -182,7 +185,13 @@ fn scaleway_kapsule_deploy_a_working_environment_and_pause() {
let result = environment.deploy_environment(&env_action, logger.clone(), &engine_config);
assert!(matches!(result, TransactionResult::Ok));
let ret = get_pods(context.clone(), Kind::Scw, environment.clone(), selector.as_str(), secrets.clone());
let ret = get_pods(
context.clone(),
Kind::Scw,
environment.clone(),
selector.as_str(),
secrets.clone(),
);
assert_eq!(ret.is_ok(), true);
assert_eq!(ret.unwrap().items.is_empty(), false);
@@ -190,7 +199,13 @@ fn scaleway_kapsule_deploy_a_working_environment_and_pause() {
assert!(matches!(result, TransactionResult::Ok));
// Check that we have actually 0 pods running for this app
let ret = get_pods(context.clone(), Kind::Scw, environment.clone(), selector.as_str(), secrets.clone());
let ret = get_pods(
context.clone(),
Kind::Scw,
environment.clone(),
selector.as_str(),
secrets.clone(),
);
assert_eq!(ret.is_ok(), true);
assert_eq!(ret.unwrap().items.is_empty(), true);
@@ -200,7 +215,13 @@ fn scaleway_kapsule_deploy_a_working_environment_and_pause() {
let result = environment.deploy_environment(&env_action, logger.clone(), &engine_config_resume);
assert!(matches!(result, TransactionResult::Ok));
let ret = get_pods(context.clone(), Kind::Scw, environment.clone(), selector.as_str(), secrets.clone());
let ret = get_pods(
context.clone(),
Kind::Scw,
environment.clone(),
selector.as_str(),
secrets.clone(),
);
assert_eq!(ret.is_ok(), true);
assert_eq!(ret.unwrap().items.is_empty(), false);
@@ -475,7 +496,13 @@ fn deploy_a_working_environment_and_pause_it() {
let result = environment.deploy_environment(&ea, logger.clone(), &engine_config);
assert!(matches!(result, TransactionResult::Ok));
let ret = get_pods(context.clone(), Kind::Scw, environment.clone(), selector.as_str(), secrets.clone());
let ret = get_pods(
context.clone(),
Kind::Scw,
environment.clone(),
selector.as_str(),
secrets.clone(),
);
assert_eq!(ret.is_ok(), true);
assert_eq!(ret.unwrap().items.is_empty(), false);
@@ -483,7 +510,13 @@ fn deploy_a_working_environment_and_pause_it() {
assert!(matches!(result, TransactionResult::Ok));
// Check that we have actually 0 pods running for this app
let ret = get_pods(context.clone(), Kind::Scw, environment.clone(), selector.as_str(), secrets.clone());
let ret = get_pods(
context.clone(),
Kind::Scw,
environment.clone(),
selector.as_str(),
secrets.clone(),
);
assert_eq!(ret.is_ok(), true);
assert_eq!(ret.unwrap().items.is_empty(), true);
@@ -583,14 +616,24 @@ fn scaleway_kapsule_redeploy_same_app() {
};
let app_name = format!("{}-0", &environment_check1.applications[0].name);
let (_, number) =
is_pod_restarted_env(context.clone(), Kind::Scw, environment_check1, app_name.as_str(), secrets.clone());
let (_, number) = is_pod_restarted_env(
context.clone(),
Kind::Scw,
environment_check1,
app_name.as_str(),
secrets.clone(),
);
let result = environment_redeploy.deploy_environment(&env_action_redeploy, logger.clone(), &engine_config_bis);
assert!(matches!(result, TransactionResult::Ok));
let (_, number2) =
is_pod_restarted_env(context.clone(), Kind::Scw, environment_check2, app_name.as_str(), secrets.clone());
let (_, number2) = is_pod_restarted_env(
context.clone(),
Kind::Scw,
environment_check2,
app_name.as_str(),
secrets.clone(),
);
// nothing changed in the app, so, it shouldn't be restarted
assert!(number.eq(&number2));
@@ -770,7 +813,10 @@ fn scaleway_kapsule_deploy_ok_fail_fail_ok_environment() {
logger.clone(),
&engine_config_for_not_working_1,
);
assert!(matches!(result, TransactionResult::Rollback(_) | TransactionResult::UnrecoverableError(_, _)));
assert!(matches!(
result,
TransactionResult::Rollback(_) | TransactionResult::UnrecoverableError(_, _)
));
// FAIL and Rollback again
let result = not_working_env_2.deploy_environment(
@@ -778,7 +824,10 @@ fn scaleway_kapsule_deploy_ok_fail_fail_ok_environment() {
logger.clone(),
&engine_config_for_not_working_2,
);
assert!(matches!(result, TransactionResult::Rollback(_) | TransactionResult::UnrecoverableError(_, _)));
assert!(matches!(
result,
TransactionResult::Rollback(_) | TransactionResult::UnrecoverableError(_, _)
));
// Should be working
let result = environment.deploy_environment(&env_action, logger.clone(), &engine_config);

View File

@@ -191,8 +191,11 @@ fn test_put_file() {
let temp_file = NamedTempFile::new().expect("error while creating tempfile");
// compute:
let result =
scaleway_os.put(bucket_name.as_str(), object_key.as_str(), temp_file.into_temp_path().to_str().unwrap());
let result = scaleway_os.put(
bucket_name.as_str(),
object_key.as_str(),
temp_file.into_temp_path().to_str().unwrap(),
);
// validate:
assert!(result.is_ok());