mirror of
https://github.com/jlengrand/engine.git
synced 2026-03-10 08:11:21 +00:00
fmt
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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),
|
||||
))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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),
|
||||
));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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()),
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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()
|
||||
)),
|
||||
)),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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),
|
||||
));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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)),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -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(()),
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
|
||||
@@ -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()),
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
43
src/git.rs
43
src/git.rs
@@ -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(),
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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(),
|
||||
),
|
||||
],
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
})
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user