Refactor/avoid log issue on action (#491)

* refactor: reduce mistakes on logs for new providers + refactored AWS

* refactor: refactor DO to avoid action log issue

* refactor: refactor SCW to avoid action log issue
This commit is contained in:
Pierre Mavro
2021-11-18 10:20:50 +01:00
committed by GitHub
parent 6285c8e790
commit eaf9f5b3a9
24 changed files with 1354 additions and 203 deletions

View File

@@ -25,6 +25,7 @@ futures = "0.3.15"
timeout-readwrite = "0.3.1"
lazy_static = "1.4.0"
uuid = { version = "0.8", features = ["v4"] }
function_name = "0.2.0"
# FIXME use https://crates.io/crates/blocking instead of runtime.rs
@@ -70,8 +71,6 @@ scaleway_api_rs = "=0.1.2"
test-utilities = { path = "test_utilities" }
tempdir = "0.3"
tempfile = "3.2.0"
uuid = { version = "0.8", features = ["v4"] }
function_name = "0.2.0"
maplit = "1.0.2"
[features]

View File

@@ -9,13 +9,14 @@ use crate::cloud_provider::service::{
scale_down_application, send_progress_on_long_task, Action, Application as CApplication, Create, Delete, Helm,
Pause, Service, ServiceType, StatelessService,
};
use crate::cloud_provider::utilities::{sanitize_name, validate_k8s_required_cpu_and_burstable};
use crate::cloud_provider::utilities::{print_action, sanitize_name, validate_k8s_required_cpu_and_burstable};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::cmd::kubectl::ScalingKind::{Deployment, Statefulset};
use crate::error::EngineErrorCause::Internal;
use crate::error::{EngineError, EngineErrorScope};
use crate::models::{Context, Listen, Listener, Listeners, ListenersHelper};
use ::function_name::named;
pub struct Application {
context: Context,
@@ -72,6 +73,14 @@ impl Application {
fn is_stateful(&self) -> bool {
!self.storage.is_empty()
}
fn cloud_provider_name(&self) -> &str {
"aws"
}
fn struct_name(&self) -> &str {
"application"
}
}
impl crate::cloud_provider::service::Application for Application {
@@ -265,9 +274,14 @@ impl Service for Application {
}
impl Create for Application {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.application.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_user_stateless_service(target, self)
})
@@ -277,8 +291,14 @@ impl Create for Application {
Ok(())
}
#[named]
fn on_create_error(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.application.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateless_service_error(target, self)
@@ -287,8 +307,14 @@ impl Create for Application {
}
impl Pause for Application {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.application.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_application(
@@ -304,16 +330,28 @@ impl Pause for Application {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.application.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for Application {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.application.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateless_service(target, self, false)
@@ -324,8 +362,14 @@ impl Delete for Application {
Ok(())
}
#[named]
fn on_delete_error(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.application.on_delete_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateless_service(target, self, true)

View File

@@ -10,7 +10,7 @@ use crate::cloud_provider::service::{
Upgrade,
};
use crate::cloud_provider::utilities::{
generate_supported_version, get_self_hosted_mongodb_version, get_supported_version_to_use,
generate_supported_version, get_self_hosted_mongodb_version, get_supported_version_to_use, print_action,
};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
@@ -18,6 +18,7 @@ use crate::cmd::kubectl;
use crate::error::{EngineError, EngineErrorScope, StringError};
use crate::models::DatabaseMode::MANAGED;
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
pub struct MongoDB {
context: Context,
@@ -68,6 +69,14 @@ impl MongoDB {
fn matching_correct_version(&self, is_managed_services: bool) -> Result<String, EngineError> {
check_service_version(get_mongodb_version(self.version(), is_managed_services), self)
}
fn cloud_provider_name(&self) -> &str {
"aws"
}
fn struct_name(&self) -> &str {
"mongodb"
}
}
impl StatefulService for MongoDB {
@@ -245,8 +254,14 @@ impl Terraform for MongoDB {
}
impl Create for MongoDB {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.MongoDB.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateful_service(target, self)
@@ -257,15 +272,27 @@ impl Create for MongoDB {
self.check_domains(self.listeners.clone(), vec![self.fqdn.as_str()])
}
#[named]
fn on_create_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.MongoDB.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Pause for MongoDB {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.MongoDB.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_database(target, self, 0)
@@ -276,16 +303,28 @@ impl Pause for MongoDB {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.MongoDB.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for MongoDB {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.MongoDB.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
delete_stateful_service(target, self)
@@ -296,8 +335,14 @@ impl Delete for MongoDB {
Ok(())
}
#[named]
fn on_delete_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.MongoDB.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -11,6 +11,7 @@ use crate::cloud_provider::service::{
};
use crate::cloud_provider::utilities::{
generate_supported_version, get_self_hosted_mysql_version, get_supported_version_to_use, managed_db_name_sanitizer,
print_action,
};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
@@ -18,6 +19,7 @@ use crate::cmd::kubectl;
use crate::error::{EngineError, EngineErrorCause, EngineErrorScope, StringError};
use crate::models::DatabaseMode::MANAGED;
use crate::models::{Context, DatabaseKind, Listen, Listener, Listeners};
use ::function_name::named;
pub struct MySQL {
context: Context,
@@ -68,6 +70,14 @@ impl MySQL {
fn matching_correct_version(&self, is_managed_services: bool) -> Result<String, EngineError> {
check_service_version(get_mysql_version(self.version(), is_managed_services), self)
}
fn cloud_provider_name(&self) -> &str {
"aws"
}
fn struct_name(&self) -> &str {
"mysql"
}
}
impl StatefulService for MySQL {
@@ -255,8 +265,14 @@ impl Terraform for MySQL {
}
impl Create for MySQL {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.MySQL.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateful_service(target, self)
@@ -267,16 +283,28 @@ impl Create for MySQL {
self.check_domains(self.listeners.clone(), vec![self.fqdn.as_str()])
}
#[named]
fn on_create_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.MySQL.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Pause for MySQL {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.MySQL.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_database(target, self, 0)
@@ -287,15 +315,27 @@ impl Pause for MySQL {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.MySQL.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for MySQL {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.MySQL.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateful_service(target, self)
@@ -306,8 +346,14 @@ impl Delete for MySQL {
Ok(())
}
#[named]
fn on_delete_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.MySQL.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -11,7 +11,7 @@ use crate::cloud_provider::service::{
};
use crate::cloud_provider::utilities::{
generate_supported_version, get_self_hosted_postgres_version, get_supported_version_to_use,
managed_db_name_sanitizer,
managed_db_name_sanitizer, print_action,
};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
@@ -19,6 +19,7 @@ use crate::cmd::kubectl;
use crate::error::{EngineError, EngineErrorScope, StringError};
use crate::models::DatabaseMode::MANAGED;
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
pub struct PostgreSQL {
context: Context,
@@ -69,6 +70,14 @@ impl PostgreSQL {
fn matching_correct_version(&self, is_managed_services: bool) -> Result<String, EngineError> {
check_service_version(get_postgres_version(self.version(), is_managed_services), self)
}
fn cloud_provider_name(&self) -> &str {
"aws"
}
fn struct_name(&self) -> &str {
"postgresql"
}
}
impl StatefulService for PostgreSQL {
@@ -243,8 +252,14 @@ impl Terraform for PostgreSQL {
}
impl Create for PostgreSQL {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.PostgreSQL.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateful_service(target, self)
@@ -255,16 +270,28 @@ impl Create for PostgreSQL {
self.check_domains(self.listeners.clone(), vec![self.fqdn.as_str()])
}
#[named]
fn on_create_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.PostgreSQL.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Pause for PostgreSQL {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.PostgreSQL.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_database(target, self, 0)
@@ -275,16 +302,28 @@ impl Pause for PostgreSQL {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.PostgreSQL.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for PostgreSQL {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.PostgreSQL.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateful_service(target, self)
@@ -295,8 +334,14 @@ impl Delete for PostgreSQL {
Ok(())
}
#[named]
fn on_delete_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.PostgreSQL.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}

View File

@@ -9,13 +9,14 @@ use crate::cloud_provider::service::{
DatabaseOptions, DatabaseType, Delete, Downgrade, Helm, Pause, Service, ServiceType, StatefulService, Terraform,
Upgrade,
};
use crate::cloud_provider::utilities::{get_self_hosted_redis_version, get_supported_version_to_use};
use crate::cloud_provider::utilities::{get_self_hosted_redis_version, get_supported_version_to_use, print_action};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::cmd::kubectl;
use crate::error::{EngineError, EngineErrorCause, EngineErrorScope, StringError};
use crate::models::DatabaseMode::MANAGED;
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
pub struct Redis {
context: Context,
@@ -66,6 +67,14 @@ impl Redis {
fn matching_correct_version(&self, is_managed_services: bool) -> Result<String, EngineError> {
check_service_version(get_redis_version(self.version(), is_managed_services), self)
}
fn cloud_provider_name(&self) -> &str {
"aws"
}
fn struct_name(&self) -> &str {
"redis"
}
}
impl StatefulService for Redis {
@@ -256,8 +265,14 @@ impl Terraform for Redis {
}
impl Create for Redis {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.Redis.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateful_service(target, self)
@@ -268,15 +283,27 @@ impl Create for Redis {
self.check_domains(self.listeners.clone(), vec![self.fqdn.as_str()])
}
#[named]
fn on_create_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.Redis.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Pause for Redis {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.Redis.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_database(target, self, 0)
@@ -287,16 +314,28 @@ impl Pause for Redis {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.Redis.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for Redis {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.Redis.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateful_service(target, self)
@@ -307,8 +346,14 @@ impl Delete for Redis {
Ok(())
}
#[named]
fn on_delete_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.Redis.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -22,6 +22,7 @@ use crate::cloud_provider::kubernetes::{
};
use crate::cloud_provider::models::{NodeGroups, NodeGroupsFormat};
use crate::cloud_provider::qovery::EngineLocation;
use crate::cloud_provider::utilities::print_action;
use crate::cloud_provider::{kubernetes, CloudProvider};
use crate::cmd;
use crate::cmd::kubectl::{
@@ -44,6 +45,7 @@ use crate::models::{
use crate::object_storage::s3::S3;
use crate::object_storage::ObjectStorage;
use crate::string::terraform_list_format;
use ::function_name::named;
pub mod helm_charts;
pub mod node;
@@ -1438,6 +1440,14 @@ impl<'a> EKS<'a> {
// FIXME What should we do if something goes wrong while deleting the cluster?
Ok(())
}
fn cloud_provider_name(&self) -> &str {
"aws"
}
fn struct_name(&self) -> &str {
"kubernetes"
}
}
impl<'a> Kubernetes for EKS<'a> {
@@ -1485,83 +1495,179 @@ impl<'a> Kubernetes for EKS<'a> {
Ok(())
}
#[named]
fn on_create(&self) -> Result<(), EngineError> {
info!("EKS.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.create())
}
#[named]
fn on_create_error(&self) -> Result<(), EngineError> {
info!("EKS.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.create_error())
}
#[named]
fn on_upgrade(&self) -> Result<(), EngineError> {
info!("EKS.on_upgrade() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.upgrade())
}
#[named]
fn on_upgrade_error(&self) -> Result<(), EngineError> {
info!("EKS.on_upgrade() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.upgrade_error())
}
#[named]
fn on_downgrade(&self) -> Result<(), EngineError> {
info!("EKS.on_downgrade() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.downgrade())
}
#[named]
fn on_downgrade_error(&self) -> Result<(), EngineError> {
info!("EKS.on_downgrade_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.downgrade_error())
}
#[named]
fn on_pause(&self) -> Result<(), EngineError> {
info!("EKS.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Pause, || self.pause())
}
#[named]
fn on_pause_error(&self) -> Result<(), EngineError> {
info!("EKS.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Pause, || self.pause_error())
}
#[named]
fn on_delete(&self) -> Result<(), EngineError> {
info!("EKS.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Delete, || self.delete())
}
#[named]
fn on_delete_error(&self) -> Result<(), EngineError> {
info!("EKS.on_delete_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Delete, || self.delete_error())
}
#[named]
fn deploy_environment(&self, environment: &Environment) -> Result<(), EngineError> {
info!("EKS.deploy_environment() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
kubernetes::deploy_environment(self, environment)
}
#[named]
fn deploy_environment_error(&self, environment: &Environment) -> Result<(), EngineError> {
warn!("EKS.deploy_environment_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
kubernetes::deploy_environment_error(self, environment)
}
#[named]
fn pause_environment(&self, environment: &Environment) -> Result<(), EngineError> {
info!("EKS.pause_environment() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
kubernetes::pause_environment(self, environment)
}
#[named]
fn pause_environment_error(&self, _environment: &Environment) -> Result<(), EngineError> {
warn!("EKS.pause_environment_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
#[named]
fn delete_environment(&self, environment: &Environment) -> Result<(), EngineError> {
info!("EKS.delete_environment() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
kubernetes::delete_environment(self, environment)
}
#[named]
fn delete_environment_error(&self, _environment: &Environment) -> Result<(), EngineError> {
warn!("EKS.delete_environment_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -5,11 +5,12 @@ use crate::cloud_provider::service::{
default_tera_context, delete_router, deploy_stateless_service_error, send_progress_on_long_task, Action, Create,
Delete, Helm, Pause, Router as RRouter, Service, ServiceType, StatelessService,
};
use crate::cloud_provider::utilities::{check_cname_for, sanitize_name};
use crate::cloud_provider::utilities::{check_cname_for, print_action, sanitize_name};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::error::{cast_simple_error_to_engine_error, EngineError, EngineErrorCause, EngineErrorScope};
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
pub struct Router {
context: Context,
@@ -44,6 +45,14 @@ impl Router {
listeners,
}
}
fn cloud_provider_name(&self) -> &str {
"aws"
}
fn struct_name(&self) -> &str {
"router"
}
}
impl Service for Router {
@@ -260,8 +269,14 @@ impl Listen for Router {
impl StatelessService for Router {}
impl Create for Router {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.router.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
let kubernetes = target.kubernetes;
let environment = target.environment;
let workspace_dir = self.workspace_directory();
@@ -329,8 +344,14 @@ impl Create for Router {
Ok(())
}
#[named]
fn on_create_error(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.router.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateless_service_error(target, self)
@@ -339,6 +360,7 @@ impl Create for Router {
}
impl Pause for Router {
#[named]
fn on_pause(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.router.on_pause() called for {}, doing nothing", self.name());
Ok(())
@@ -348,15 +370,27 @@ impl Pause for Router {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.router.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for Router {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("AWS.router.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
delete_router(target, self, false)
}
@@ -364,8 +398,14 @@ impl Delete for Router {
Ok(())
}
#[named]
fn on_delete_error(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("AWS.router.on_delete_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
delete_router(target, self, true)
}
}

View File

@@ -9,13 +9,14 @@ use crate::cloud_provider::service::{
scale_down_application, send_progress_on_long_task, Action, Create, Delete, Helm, Pause, Service, ServiceType,
StatelessService,
};
use crate::cloud_provider::utilities::{sanitize_name, validate_k8s_required_cpu_and_burstable};
use crate::cloud_provider::utilities::{print_action, sanitize_name, validate_k8s_required_cpu_and_burstable};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::cmd::kubectl::ScalingKind::{Deployment, Statefulset};
use crate::error::EngineErrorCause::Internal;
use crate::error::{EngineError, EngineErrorScope};
use crate::models::{Context, Listen, Listener, Listeners, ListenersHelper};
use ::function_name::named;
use std::fmt;
use std::str::FromStr;
@@ -74,6 +75,14 @@ impl Application {
fn is_stateful(&self) -> bool {
self.storage.len() > 0
}
fn cloud_provider_name(&self) -> &str {
"digitalocean"
}
fn struct_name(&self) -> &str {
"application"
}
}
impl crate::cloud_provider::service::Application for Application {
@@ -266,31 +275,14 @@ impl Service for Application {
}
impl Create for Application {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.application.on_create() called for {}", self.name);
// todo(pmavro): I don't get wy this is done here and not in hte
// let (kubernetes, _) = match target {
// DeploymentTarget::ManagedServices(k, env) => (*k, *env),
// DeploymentTarget::SelfHosted(k, env) => (*k, *env),
// };
// FIXME: remove downcast
//let digitalocean = kubernetes.cloud_provider().as_any().downcast_ref::<DO>().unwrap();
// // retrieve the cluster uuid, useful to link DO registry to k8s cluster
// let cluster_uuid_res = get_uuid_of_cluster_from_name(digitalocean.token.as_str(), kubernetes.name());
//
// match cluster_uuid_res {
// // ensure DO registry is linked to k8s cluster
// Ok(uuid) => {
// match subscribe_kube_cluster_to_container_registry(digitalocean.token.as_str(), uuid.as_str()) {
// Ok(_) => info!("Container registry is well linked with the Cluster"),
// Err(e) => error!("Unable to link cluster to registry {:?}", e.message),
// }
// }
// Err(e) => error!("Unable to get cluster uuid {:?}", e.message),
// };
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_user_stateless_service(target, self)
@@ -301,8 +293,14 @@ impl Create for Application {
Ok(())
}
#[named]
fn on_create_error(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.application.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateless_service_error(target, self)
@@ -311,8 +309,14 @@ impl Create for Application {
}
impl Pause for Application {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.application.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_application(
@@ -328,16 +332,28 @@ impl Pause for Application {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.application.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for Application {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.application.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateless_service(target, self, false)
@@ -348,8 +364,14 @@ impl Delete for Application {
Ok(())
}
#[named]
fn on_delete_error(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.application.on_delete_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateless_service(target, self, true)

View File

@@ -6,13 +6,14 @@ use crate::cloud_provider::service::{
DatabaseOptions, DatabaseType, Delete, Downgrade, Helm, Pause, Service, ServiceType, StatefulService, Terraform,
Upgrade,
};
use crate::cloud_provider::utilities::{get_self_hosted_mongodb_version, sanitize_name};
use crate::cloud_provider::utilities::{get_self_hosted_mongodb_version, print_action, sanitize_name};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::cmd::kubectl;
use crate::error::{EngineError, EngineErrorScope};
use crate::models::DatabaseMode::MANAGED;
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
pub struct MongoDB {
context: Context,
@@ -63,6 +64,14 @@ impl MongoDB {
fn matching_correct_version(&self) -> Result<String, EngineError> {
check_service_version(get_self_hosted_mongodb_version(self.version().clone()), self)
}
fn cloud_provider_name(&self) -> &str {
"digitalocean"
}
fn struct_name(&self) -> &str {
"mongodb"
}
}
impl StatefulService for MongoDB {
@@ -229,8 +238,14 @@ impl Terraform for MongoDB {
}
impl Create for MongoDB {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.MongoDB.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateful_service(target, self)
@@ -241,15 +256,28 @@ impl Create for MongoDB {
Ok(())
}
#[named]
fn on_create_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.MongoDB.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Pause for MongoDB {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.MongoDB.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_database(target, self, 0)
@@ -260,16 +288,28 @@ impl Pause for MongoDB {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.MongoDB.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for MongoDB {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.MongoDB.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateful_service(target, self)
@@ -280,8 +320,15 @@ impl Delete for MongoDB {
Ok(())
}
#[named]
fn on_delete_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.MongoDB.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -6,13 +6,14 @@ use crate::cloud_provider::service::{
DatabaseOptions, DatabaseType, Delete, Downgrade, Helm, Pause, Service, ServiceType, StatefulService, Terraform,
Upgrade,
};
use crate::cloud_provider::utilities::{get_self_hosted_mysql_version, sanitize_name};
use crate::cloud_provider::utilities::{get_self_hosted_mysql_version, print_action, sanitize_name};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::cmd::kubectl;
use crate::error::{EngineError, EngineErrorScope};
use crate::models::DatabaseMode::MANAGED;
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
pub struct MySQL {
context: Context,
@@ -63,6 +64,14 @@ impl MySQL {
fn matching_correct_version(&self) -> Result<String, EngineError> {
check_service_version(get_self_hosted_mysql_version(self.version()), self)
}
fn cloud_provider_name(&self) -> &str {
"digitalocean"
}
fn struct_name(&self) -> &str {
"mysql"
}
}
impl StatefulService for MySQL {
@@ -229,8 +238,14 @@ impl Terraform for MySQL {
}
impl Create for MySQL {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DIGITALOCEAN.MySQL.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(
self,
@@ -244,16 +259,28 @@ impl Create for MySQL {
Ok(())
}
#[named]
fn on_create_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DIGITALOCEAN.MySQL.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Pause for MySQL {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DIGITALOCEAN.MySQL.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_database(target, self, 0)
@@ -264,16 +291,28 @@ impl Pause for MySQL {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.MySQL.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for MySQL {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DIGITALOCEAN.MySQL.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(
self,
@@ -286,8 +325,14 @@ impl Delete for MySQL {
Ok(())
}
#[named]
fn on_delete_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DIGITALOCEAN.MySQL.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -6,13 +6,14 @@ use crate::cloud_provider::service::{
DatabaseOptions, DatabaseType, Delete, Downgrade, Helm, Pause, Service, ServiceType, StatefulService, Terraform,
Upgrade,
};
use crate::cloud_provider::utilities::{get_self_hosted_postgres_version, sanitize_name};
use crate::cloud_provider::utilities::{get_self_hosted_postgres_version, print_action, sanitize_name};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::cmd::kubectl;
use crate::error::{EngineError, EngineErrorScope};
use crate::models::DatabaseMode::MANAGED;
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
pub struct PostgreSQL {
context: Context,
@@ -63,6 +64,14 @@ impl PostgreSQL {
fn matching_correct_version(&self) -> Result<String, EngineError> {
check_service_version(get_self_hosted_postgres_version(self.version()), self)
}
fn cloud_provider_name(&self) -> &str {
"digitalocean"
}
fn struct_name(&self) -> &str {
"postgresql"
}
}
impl StatefulService for PostgreSQL {
@@ -231,8 +240,14 @@ impl Terraform for PostgreSQL {
}
impl Create for PostgreSQL {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.PostgreSQL.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(
self,
@@ -245,16 +260,28 @@ impl Create for PostgreSQL {
Ok(())
}
#[named]
fn on_create_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.PostgreSQL.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Pause for PostgreSQL {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.PostgreSQL.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_database(target, self, 0)
@@ -265,16 +292,28 @@ impl Pause for PostgreSQL {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.PostgreSQL.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for PostgreSQL {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.PostgreSQL.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(
self,
@@ -287,8 +326,14 @@ impl Delete for PostgreSQL {
Ok(())
}
#[named]
fn on_delete_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DIGITALOCEAN.PostgreSQL.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}

View File

@@ -6,13 +6,14 @@ use crate::cloud_provider::service::{
DatabaseOptions, DatabaseType, Delete, Downgrade, Helm, Pause, Service, ServiceType, StatefulService, Terraform,
Upgrade,
};
use crate::cloud_provider::utilities::{get_self_hosted_redis_version, sanitize_name};
use crate::cloud_provider::utilities::{get_self_hosted_redis_version, print_action, sanitize_name};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::cmd::kubectl;
use crate::error::{EngineError, EngineErrorScope};
use crate::models::DatabaseMode::MANAGED;
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
pub struct Redis {
context: Context,
@@ -63,6 +64,14 @@ impl Redis {
fn matching_correct_version(&self) -> Result<String, EngineError> {
check_service_version(get_self_hosted_redis_version(self.version()), self)
}
fn cloud_provider_name(&self) -> &str {
"digitalocean"
}
fn struct_name(&self) -> &str {
"redis"
}
}
impl StatefulService for Redis {
@@ -228,8 +237,14 @@ impl Terraform for Redis {
}
impl Create for Redis {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.Redis.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(
self,
@@ -243,15 +258,27 @@ impl Create for Redis {
Ok(())
}
#[named]
fn on_create_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.Redis.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Pause for Redis {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.Redis.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_database(target, self, 0)
@@ -262,15 +289,27 @@ impl Pause for Redis {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.Redis.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for Redis {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.Redis.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(
self,
@@ -283,8 +322,14 @@ impl Delete for Redis {
Ok(())
}
#[named]
fn on_delete_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.Redis.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -21,6 +21,7 @@ use crate::cloud_provider::helm::{deploy_charts_levels, ChartInfo, ChartSetValue
use crate::cloud_provider::kubernetes::{send_progress_on_long_task, uninstall_cert_manager, Kind, Kubernetes};
use crate::cloud_provider::models::NodeGroups;
use crate::cloud_provider::qovery::EngineLocation;
use crate::cloud_provider::utilities::print_action;
use crate::cloud_provider::{kubernetes, CloudProvider};
use crate::cmd::helm::{helm_exec_upgrade_with_chart_info, helm_upgrade_diff_with_chart_info};
use crate::cmd::kubectl::{
@@ -40,6 +41,7 @@ use crate::object_storage::spaces::Spaces;
use crate::object_storage::ObjectStorage;
use crate::string::terraform_list_format;
use crate::{cmd, dns_provider};
use ::function_name::named;
use retry::delay::Fibonacci;
use retry::Error::Operation;
use retry::OperationResult;
@@ -1082,6 +1084,14 @@ impl<'a> DOKS<'a> {
fn delete_error(&self) -> Result<(), EngineError> {
Ok(())
}
fn cloud_provider_name(&self) -> &str {
"digitalocean"
}
fn struct_name(&self) -> &str {
"kubernetes"
}
}
impl<'a> Kubernetes for DOKS<'a> {
@@ -1129,83 +1139,179 @@ impl<'a> Kubernetes for DOKS<'a> {
Ok(())
}
#[named]
fn on_create(&self) -> Result<(), EngineError> {
info!("DOKS.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.create())
}
#[named]
fn on_create_error(&self) -> Result<(), EngineError> {
info!("DOKS.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.create_error())
}
#[named]
fn on_upgrade(&self) -> Result<(), EngineError> {
info!("DOKS.on_upgrade() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.upgrade())
}
#[named]
fn on_upgrade_error(&self) -> Result<(), EngineError> {
info!("DOKS.on_upgrade() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.upgrade_error())
}
#[named]
fn on_downgrade(&self) -> Result<(), EngineError> {
info!("DOKS.on_downgrade() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.downgrade())
}
#[named]
fn on_downgrade_error(&self) -> Result<(), EngineError> {
info!("DOKS.on_downgrade_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.downgrade_error())
}
#[named]
fn on_pause(&self) -> Result<(), EngineError> {
info!("DOKS.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Pause, || self.pause())
}
#[named]
fn on_pause_error(&self) -> Result<(), EngineError> {
info!("DOKS.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Pause, || self.pause_error())
}
#[named]
fn on_delete(&self) -> Result<(), EngineError> {
info!("DOKS.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Delete, || self.delete())
}
#[named]
fn on_delete_error(&self) -> Result<(), EngineError> {
info!("DOKS.on_delete_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Delete, || self.delete_error())
}
#[named]
fn deploy_environment(&self, environment: &Environment) -> Result<(), EngineError> {
info!("DOKS.deploy_environment() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
kubernetes::deploy_environment(self, environment)
}
#[named]
fn deploy_environment_error(&self, environment: &Environment) -> Result<(), EngineError> {
warn!("DOKS.deploy_environment_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
kubernetes::deploy_environment_error(self, environment)
}
#[named]
fn pause_environment(&self, environment: &Environment) -> Result<(), EngineError> {
info!("DOKS.pause_environment() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
kubernetes::pause_environment(self, environment)
}
#[named]
fn pause_environment_error(&self, _environment: &Environment) -> Result<(), EngineError> {
warn!("DOKS.pause_environment_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
#[named]
fn delete_environment(&self, environment: &Environment) -> Result<(), EngineError> {
info!("DOKS.delete_environment() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
kubernetes::delete_environment(self, environment)
}
#[named]
fn delete_environment_error(&self, _environment: &Environment) -> Result<(), EngineError> {
warn!("DOKS.delete_environment_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -5,11 +5,12 @@ use crate::cloud_provider::service::{
default_tera_context, delete_router, deploy_stateless_service_error, send_progress_on_long_task, Action, Create,
Delete, Helm, Pause, Service, ServiceType, StatelessService,
};
use crate::cloud_provider::utilities::{check_cname_for, sanitize_name};
use crate::cloud_provider::utilities::{check_cname_for, print_action, sanitize_name};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::error::{cast_simple_error_to_engine_error, EngineError, EngineErrorCause, EngineErrorScope};
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
pub struct Router {
context: Context,
@@ -44,6 +45,14 @@ impl Router {
listeners,
}
}
fn cloud_provider_name(&self) -> &str {
"digitalocean"
}
fn struct_name(&self) -> &str {
"router"
}
}
impl Service for Router {
@@ -278,8 +287,14 @@ impl Listen for Router {
impl StatelessService for Router {}
impl Create for Router {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DigitalOcean.router.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
let kubernetes = target.kubernetes;
let environment = target.environment;
@@ -350,8 +365,14 @@ impl Create for Router {
Ok(())
}
#[named]
fn on_create_error(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.router.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateless_service_error(target, self)
@@ -360,8 +381,14 @@ impl Create for Router {
}
impl Pause for Router {
#[named]
fn on_pause(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.router.on_pause() called for {}, doing nothing", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
@@ -369,15 +396,27 @@ impl Pause for Router {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.router.on_pause_error() called for {}, doing nothing", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for Router {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("DO.router.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
delete_router(target, self, false)
}
@@ -385,8 +424,14 @@ impl Delete for Router {
Ok(())
}
#[named]
fn on_delete_error(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("DO.router.on_delete_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
delete_router(target, self, true)
}
}

View File

@@ -12,13 +12,14 @@ use crate::cloud_provider::service::{
scale_down_application, send_progress_on_long_task, Action, Application as CApplication, Create, Delete, Helm,
Pause, Service, ServiceType, StatelessService,
};
use crate::cloud_provider::utilities::{sanitize_name, validate_k8s_required_cpu_and_burstable};
use crate::cloud_provider::utilities::{print_action, sanitize_name, validate_k8s_required_cpu_and_burstable};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::cmd::kubectl::ScalingKind::{Deployment, Statefulset};
use crate::error::EngineErrorCause::Internal;
use crate::error::{EngineError, EngineErrorScope};
use crate::models::{Context, Listen, Listener, Listeners, ListenersHelper};
use ::function_name::named;
pub struct Application {
context: Context,
@@ -75,6 +76,14 @@ impl Application {
fn is_stateful(&self) -> bool {
!self.storage.is_empty()
}
fn cloud_provider_name(&self) -> &str {
"scaleway"
}
fn struct_name(&self) -> &str {
"application"
}
}
impl crate::cloud_provider::service::Application for Application {
@@ -284,8 +293,14 @@ impl Service for Application {
}
impl Create for Application {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.application.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_user_stateless_service(target, self)
@@ -296,8 +311,14 @@ impl Create for Application {
Ok(())
}
#[named]
fn on_create_error(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.application.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateless_service_error(target, self)
@@ -306,8 +327,14 @@ impl Create for Application {
}
impl Pause for Application {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.application.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_application(
@@ -323,16 +350,28 @@ impl Pause for Application {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.application.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for Application {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.application.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateless_service(target, self, false)
@@ -343,8 +382,14 @@ impl Delete for Application {
Ok(())
}
#[named]
fn on_delete_error(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.application.on_delete_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateless_service(target, self, true)

View File

@@ -6,13 +6,14 @@ use crate::cloud_provider::service::{
DatabaseOptions, DatabaseType, Delete, Downgrade, Helm, Pause, Service, ServiceType, StatefulService, Terraform,
Upgrade,
};
use crate::cloud_provider::utilities::{get_self_hosted_mongodb_version, sanitize_name};
use crate::cloud_provider::utilities::{get_self_hosted_mongodb_version, print_action, sanitize_name};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::cmd::kubectl;
use crate::error::{EngineError, EngineErrorScope};
use crate::models::DatabaseMode::MANAGED;
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
pub struct MongoDB {
context: Context,
@@ -63,6 +64,14 @@ impl MongoDB {
fn matching_correct_version(&self) -> Result<String, EngineError> {
check_service_version(get_self_hosted_mongodb_version(self.version()), self)
}
fn cloud_provider_name(&self) -> &str {
"scaleway"
}
fn struct_name(&self) -> &str {
"mongodb"
}
}
impl StatefulService for MongoDB {
@@ -230,8 +239,14 @@ impl Terraform for MongoDB {
}
impl Create for MongoDB {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.MongoDB.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateful_service(target, self)
@@ -242,15 +257,27 @@ impl Create for MongoDB {
self.check_domains(self.listeners.clone(), vec![self.fqdn.as_str()])
}
#[named]
fn on_create_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.MongoDB.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Pause for MongoDB {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.MongoDB.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_database(target, self, 0)
@@ -261,16 +288,28 @@ impl Pause for MongoDB {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.MongoDB.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for MongoDB {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.MongoDB.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateful_service(target, self)
@@ -281,8 +320,14 @@ impl Delete for MongoDB {
Ok(())
}
#[named]
fn on_delete_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.MongoDB.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -7,7 +7,7 @@ use crate::cloud_provider::service::{
Upgrade,
};
use crate::cloud_provider::utilities::{
get_self_hosted_mysql_version, get_supported_version_to_use, sanitize_name, VersionsNumber,
get_self_hosted_mysql_version, get_supported_version_to_use, print_action, sanitize_name, VersionsNumber,
};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
@@ -15,6 +15,7 @@ use crate::cmd::kubectl;
use crate::error::{EngineError, EngineErrorCause, EngineErrorScope, StringError};
use crate::models::DatabaseMode::MANAGED;
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
use std::collections::HashMap;
use std::str::FromStr;
@@ -94,6 +95,14 @@ impl MySQL {
get_supported_version_to_use("RDB MySQL", supported_mysql_versions, requested_version)
}
fn cloud_provider_name(&self) -> &str {
"scaleway"
}
fn struct_name(&self) -> &str {
"mysql"
}
}
impl StatefulService for MySQL {
@@ -267,8 +276,14 @@ impl Terraform for MySQL {
}
impl Create for MySQL {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.MySQL.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateful_service(target, self)
@@ -279,16 +294,28 @@ impl Create for MySQL {
self.check_domains(self.listeners.clone(), vec![self.fqdn.as_str()])
}
#[named]
fn on_create_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.MySQL.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Pause for MySQL {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.MySQL.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_database(target, self, 0)
@@ -299,16 +326,28 @@ impl Pause for MySQL {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.MySQL.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for MySQL {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.MySQL.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateful_service(target, self)
@@ -319,8 +358,14 @@ impl Delete for MySQL {
Ok(())
}
#[named]
fn on_delete_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.MySQL.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -7,7 +7,7 @@ use crate::cloud_provider::service::{
Upgrade,
};
use crate::cloud_provider::utilities::{
get_self_hosted_postgres_version, get_supported_version_to_use, sanitize_name, VersionsNumber,
get_self_hosted_postgres_version, get_supported_version_to_use, print_action, sanitize_name, VersionsNumber,
};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
@@ -15,6 +15,7 @@ use crate::cmd::kubectl;
use crate::error::{EngineError, EngineErrorCause, EngineErrorScope, StringError};
use crate::models::DatabaseMode::MANAGED;
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
use std::collections::HashMap;
use std::str::FromStr;
@@ -103,6 +104,14 @@ impl PostgreSQL {
get_supported_version_to_use("RDB postgres", supported_postgres_versions, requested_version)
}
fn cloud_provider_name(&self) -> &str {
"scaleway"
}
fn struct_name(&self) -> &str {
"postgresql"
}
}
impl StatefulService for PostgreSQL {
@@ -276,8 +285,14 @@ impl Terraform for PostgreSQL {
}
impl Create for PostgreSQL {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.PostgreSQL.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateful_service(target, self)
@@ -288,16 +303,28 @@ impl Create for PostgreSQL {
self.check_domains(self.listeners.clone(), vec![self.fqdn.as_str()])
}
#[named]
fn on_create_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.PostgreSQL.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Pause for PostgreSQL {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.PostgreSQL.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_database(target, self, 0)
@@ -308,16 +335,28 @@ impl Pause for PostgreSQL {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.PostgreSQL.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for PostgreSQL {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.PostgreSQL.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateful_service(target, self)
@@ -328,8 +367,14 @@ impl Delete for PostgreSQL {
Ok(())
}
#[named]
fn on_delete_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.MySQL.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -6,13 +6,14 @@ use crate::cloud_provider::service::{
DatabaseOptions, DatabaseType, Delete, Downgrade, Helm, Pause, Service, ServiceType, StatefulService, Terraform,
Upgrade,
};
use crate::cloud_provider::utilities::{get_self_hosted_redis_version, sanitize_name};
use crate::cloud_provider::utilities::{get_self_hosted_redis_version, print_action, sanitize_name};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::cmd::kubectl;
use crate::error::{EngineError, EngineErrorScope};
use crate::models::DatabaseMode::MANAGED;
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
pub struct Redis {
context: Context,
@@ -63,6 +64,14 @@ impl Redis {
fn matching_correct_version(&self) -> Result<String, EngineError> {
check_service_version(get_self_hosted_redis_version(self.version()), self)
}
fn cloud_provider_name(&self) -> &str {
"scaleway"
}
fn struct_name(&self) -> &str {
"redis"
}
}
impl StatefulService for Redis {
@@ -229,8 +238,14 @@ impl Terraform for Redis {
}
impl Create for Redis {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.Redis.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateful_service(target, self)
@@ -241,15 +256,27 @@ impl Create for Redis {
self.check_domains(self.listeners.clone(), vec![self.fqdn.as_str()])
}
#[named]
fn on_create_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.Redis.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Pause for Redis {
#[named]
fn on_pause(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.Redis.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Pause, || {
scale_down_database(target, self, 0)
@@ -260,15 +287,27 @@ impl Pause for Redis {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.Redis.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for Redis {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.Redis.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Delete, || {
delete_stateful_service(target, self)
@@ -279,8 +318,14 @@ impl Delete for Redis {
Ok(())
}
#[named]
fn on_delete_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.Redis.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -13,6 +13,7 @@ use crate::cloud_provider::scaleway::application::Zone;
use crate::cloud_provider::scaleway::kubernetes::helm_charts::{scw_helm_charts, ChartsConfigPrerequisites};
use crate::cloud_provider::scaleway::kubernetes::node::ScwInstancesType;
use crate::cloud_provider::scaleway::Scaleway;
use crate::cloud_provider::utilities::print_action;
use crate::cloud_provider::{kubernetes, CloudProvider};
use crate::cmd::kubectl::{kubectl_exec_get_all_namespaces, kubectl_exec_get_events};
use crate::cmd::structs::HelmChart;
@@ -29,6 +30,7 @@ use crate::object_storage::scaleway_object_storage::{BucketDeleteStrategy, Scale
use crate::object_storage::ObjectStorage;
use crate::string::terraform_list_format;
use crate::{cmd, dns_provider};
use ::function_name::named;
use retry::delay::Fibonacci;
use retry::Error::Operation;
use retry::OperationResult;
@@ -921,6 +923,14 @@ impl<'a> Kapsule<'a> {
// FIXME What should we do if something goes wrong while deleting the cluster?
Ok(())
}
fn cloud_provider_name(&self) -> &str {
"scaleway"
}
fn struct_name(&self) -> &str {
"kubernetes"
}
}
impl<'a> Kubernetes for Kapsule<'a> {
@@ -968,83 +978,179 @@ impl<'a> Kubernetes for Kapsule<'a> {
Ok(())
}
#[named]
fn on_create(&self) -> Result<(), EngineError> {
info!("SCW.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.create())
}
#[named]
fn on_create_error(&self) -> Result<(), EngineError> {
info!("SCW.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.create_error())
}
#[named]
fn on_upgrade(&self) -> Result<(), EngineError> {
info!("SCW.on_upgrade() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.upgrade())
}
#[named]
fn on_upgrade_error(&self) -> Result<(), EngineError> {
info!("SCW.on_upgrade() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.upgrade_error())
}
#[named]
fn on_downgrade(&self) -> Result<(), EngineError> {
info!("SCW.on_downgrade() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.downgrade())
}
#[named]
fn on_downgrade_error(&self) -> Result<(), EngineError> {
info!("SCW.on_downgrade_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Create, || self.downgrade_error())
}
#[named]
fn on_pause(&self) -> Result<(), EngineError> {
info!("SCW.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Pause, || self.pause())
}
#[named]
fn on_pause_error(&self) -> Result<(), EngineError> {
info!("SCW.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Pause, || self.pause_error())
}
#[named]
fn on_delete(&self) -> Result<(), EngineError> {
info!("SCW.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Delete, || self.delete())
}
#[named]
fn on_delete_error(&self) -> Result<(), EngineError> {
info!("SCW.on_delete_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, Action::Delete, || self.delete_error())
}
#[named]
fn deploy_environment(&self, environment: &Environment) -> Result<(), EngineError> {
info!("SCW.deploy_environment() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
kubernetes::deploy_environment(self, environment)
}
#[named]
fn deploy_environment_error(&self, environment: &Environment) -> Result<(), EngineError> {
warn!("SCW.deploy_environment_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
kubernetes::deploy_environment_error(self, environment)
}
fn pause_environment(&self, environment: &Environment) -> Result<(), EngineError> {
warn!("SCW.pause_environment() called for {}", self.name());
kubernetes::pause_environment(self, environment)
}
fn pause_environment_error(&self, _environment: &Environment) -> Result<(), EngineError> {
warn!("SCW.pause_environment_error() called for {}", self.name());
#[named]
fn pause_environment(&self, _environment: &Environment) -> Result<(), EngineError> {
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
#[named]
fn pause_environment_error(&self, _environment: &Environment) -> Result<(), EngineError> {
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
#[named]
fn delete_environment(&self, environment: &Environment) -> Result<(), EngineError> {
info!("SCW.delete_environment() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
kubernetes::delete_environment(self, environment)
}
#[named]
fn delete_environment_error(&self, _environment: &Environment) -> Result<(), EngineError> {
warn!("SCW.delete_environment_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}

View File

@@ -5,11 +5,12 @@ use crate::cloud_provider::service::{
default_tera_context, delete_router, deploy_stateless_service_error, send_progress_on_long_task, Action, Create,
Delete, Helm, Pause, Router as RRouter, Service, ServiceType, StatelessService,
};
use crate::cloud_provider::utilities::{check_cname_for, sanitize_name};
use crate::cloud_provider::utilities::{check_cname_for, print_action, sanitize_name};
use crate::cloud_provider::DeploymentTarget;
use crate::cmd::helm::Timeout;
use crate::error::{cast_simple_error_to_engine_error, EngineError, EngineErrorCause, EngineErrorScope};
use crate::models::{Context, Listen, Listener, Listeners};
use ::function_name::named;
pub struct Router {
context: Context,
@@ -44,6 +45,14 @@ impl Router {
listeners,
}
}
fn cloud_provider_name(&self) -> &str {
"scaleway"
}
fn struct_name(&self) -> &str {
"router"
}
}
impl Service for Router {
@@ -224,8 +233,14 @@ impl Listen for Router {
impl StatelessService for Router {}
impl Create for Router {
#[named]
fn on_create(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.router.on_create() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
let kubernetes = target.kubernetes;
let environment = target.environment;
@@ -294,8 +309,14 @@ impl Create for Router {
Ok(())
}
#[named]
fn on_create_error(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.router.on_create_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
send_progress_on_long_task(self, crate::cloud_provider::service::Action::Create, || {
deploy_stateless_service_error(target, self)
@@ -304,8 +325,14 @@ impl Create for Router {
}
impl Pause for Router {
#[named]
fn on_pause(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.router.on_pause() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
@@ -313,15 +340,27 @@ impl Pause for Router {
Ok(())
}
#[named]
fn on_pause_error(&self, _target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.router.on_pause_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
Ok(())
}
}
impl Delete for Router {
#[named]
fn on_delete(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
info!("SCW.router.on_delete() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
delete_router(target, self, false)
}
@@ -329,8 +368,14 @@ impl Delete for Router {
Ok(())
}
#[named]
fn on_delete_error(&self, target: &DeploymentTarget) -> Result<(), EngineError> {
warn!("SCW.router.on_delete_error() called for {}", self.name());
print_action(
self.cloud_provider_name(),
self.struct_name(),
function_name!(),
self.name(),
);
delete_router(target, self, true)
}
}

View File

@@ -559,6 +559,17 @@ pub fn validate_k8s_required_cpu_and_burstable(
})
}
pub fn print_action(cloud_provider_name: &str, struct_name: &str, fn_name: &str, item_name: &str) {
let msg = format!(
"{}.{}.{} called for {}",
cloud_provider_name, struct_name, fn_name, item_name
);
match fn_name.contains("error") {
true => warn!("{}", msg),
false => info!("{}", msg),
}
}
#[cfg(test)]
mod tests {
use crate::cloud_provider::models::CpuLimits;

View File

@@ -724,6 +724,26 @@ version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
[[package]]
name = "function_name"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88b2afa9b514dc3a75af6cf24d1914e1c7eb6f1b86de849147563548d5c0a0cd"
dependencies = [
"function_name-proc-macro",
]
[[package]]
name = "function_name-proc-macro"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6790a8d356d2f65d7972181e866b92a50a87c27d6a48cbe9dbb8be13ca784c7d"
dependencies = [
"proc-macro-crate",
"quote 0.6.13",
"syn 0.15.44",
]
[[package]]
name = "futures"
version = "0.1.30"
@@ -1981,6 +2001,15 @@ version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
[[package]]
name = "proc-macro-crate"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
dependencies = [
"toml",
]
[[package]]
name = "proc-macro-error"
version = "1.0.4"
@@ -2058,6 +2087,7 @@ dependencies = [
"digitalocean",
"dirs",
"flate2",
"function_name",
"futures 0.3.15",
"gethostname",
"git2",
@@ -3563,6 +3593,15 @@ dependencies = [
"tokio 1.10.0",
]
[[package]]
name = "toml"
version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa"
dependencies = [
"serde",
]
[[package]]
name = "tower-service"
version = "0.3.0"