From 2f701e1f8939f76a0a71f23aaadd41cb91725a43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Jandre?= <48719461+JoaoJandre@users.noreply.github.com> Date: Tue, 29 Aug 2023 15:00:12 -0300 Subject: [PATCH] New configs for quota email's headers and footers (#7852) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: João Jandre --- .../quota/QuotaAlertManagerImpl.java | 22 ++++++++++++-- .../quota/constant/QuotaConfig.java | 6 ++++ .../quota/QuotaAlertManagerImplTest.java | 29 ++++++++++++++++++- .../cloudstack/quota/QuotaServiceImpl.java | 3 +- 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java index 8ef2c96f2aa..6be739919ea 100644 --- a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java +++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java @@ -36,6 +36,7 @@ import org.apache.cloudstack.quota.vo.QuotaAccountVO; import org.apache.cloudstack.quota.vo.QuotaEmailTemplatesVO; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.text.StrSubstitutor; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -223,7 +224,7 @@ public class QuotaAlertManagerImpl extends ManagerBase implements QuotaAlertMana final String body = bodySubstitutor.replace(emailTemplate.getTemplateBody()); try { - sendQuotaAlert(account.getUuid(), emailRecipients, subject, body); + sendQuotaAlert(account, emailRecipients, subject, body); emailToBeSent.sentSuccessfully(_quotaAcc); } catch (Exception e) { s_logger.error(String.format("Unable to send quota alert email (subject=%s; body=%s) to account %s (%s) recipients (%s) due to error (%s)", subject, body, account.getAccountName(), @@ -354,17 +355,20 @@ public class QuotaAlertManagerImpl extends ManagerBase implements QuotaAlertMana } }; - protected void sendQuotaAlert(String accountUuid, List emails, String subject, String body) { + protected void sendQuotaAlert(Account account, List emails, String subject, String body) { SMTPMailProperties mailProperties = new SMTPMailProperties(); mailProperties.setSender(new MailAddress(senderAddress)); + + body = addHeaderAndFooter(body, QuotaConfig.QuotaEmailHeader.valueIn(account.getDomainId()), QuotaConfig.QuotaEmailFooter.valueIn(account.getDomainId())); + mailProperties.setSubject(subject); mailProperties.setContent(body); mailProperties.setContentType("text/html; charset=utf-8"); if (CollectionUtils.isEmpty(emails)) { s_logger.warn(String.format("Account [%s] does not have users with email registered, " - + "therefore we are unable to send quota alert email with subject [%s] and content [%s].", accountUuid, subject, body)); + + "therefore we are unable to send quota alert email with subject [%s] and content [%s].", account.getUuid(), subject, body)); return; } @@ -378,4 +382,16 @@ public class QuotaAlertManagerImpl extends ManagerBase implements QuotaAlertMana mailSender.sendMail(mailProperties); } + protected String addHeaderAndFooter(String body, String header, String footer) { + + if (StringUtils.isNotEmpty(header)) { + body = String.format("%s%s", header, body); + } + if (StringUtils.isNotEmpty(footer)) { + body = String.format("%s%s", body, footer); + } + + return body; + } + } diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaConfig.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaConfig.java index fa9af8f822a..f1426f397b3 100644 --- a/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaConfig.java +++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaConfig.java @@ -63,6 +63,12 @@ public interface QuotaConfig { ConfigKey QuotaAccountEnabled = new ConfigKey<>("Advanced", Boolean.class, "quota.account.enabled", "true", "Indicates whether Quota plugin is enabled or not for " + "the account.", true, ConfigKey.Scope.Account); + ConfigKey QuotaEmailHeader = new ConfigKey<>("Advanced", String.class, "quota.email.header", "", + "Text to be added as a header for quota emails. Line breaks are not automatically inserted between this section and the body.", true, ConfigKey.Scope.Domain); + + ConfigKey QuotaEmailFooter = new ConfigKey<>("Advanced", String.class, "quota.email.footer", "", + "Text to be added as a footer for quota emails. Line breaks are not automatically inserted between this section and the body.", true, ConfigKey.Scope.Domain); + enum QuotaEmailTemplateTypes { QUOTA_LOW, QUOTA_EMPTY, QUOTA_UNLOCK_ACCOUNT, QUOTA_STATEMENT } diff --git a/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaAlertManagerImplTest.java b/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaAlertManagerImplTest.java index 7a1e7b7e456..ae2f2e9926e 100644 --- a/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaAlertManagerImplTest.java +++ b/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaAlertManagerImplTest.java @@ -71,6 +71,21 @@ public class QuotaAlertManagerImplTest extends TestCase { @Mock private ConfigurationDao configDao; + @Mock + private QuotaAccountVO quotaAccountVOMock; + + @Mock + private List deferredQuotaEmailListMock; + + @Mock + private QuotaManagerImpl quotaManagerMock; + + @Mock + private Date balanceDateMock; + + @Mock + private AccountVO accountMock; + @Spy @InjectMocks private QuotaAlertManagerImpl quotaAlertManager = new QuotaAlertManagerImpl(); @@ -162,10 +177,22 @@ public class QuotaAlertManagerImplTest extends TestCase { quotaAlertManager.sendQuotaAlert(email); assertTrue(email.getSendDate() != null); - Mockito.verify(quotaAlertManager, Mockito.times(1)).sendQuotaAlert(Mockito.anyString(), Mockito.anyListOf(String.class), Mockito.anyString(), Mockito.anyString()); + Mockito.verify(quotaAlertManager, Mockito.times(1)).sendQuotaAlert(Mockito.any(), Mockito.anyListOf(String.class), Mockito.anyString(), Mockito.anyString()); Mockito.verify(quotaAlertManager.mailSender, Mockito.times(1)).sendMail(Mockito.any(SMTPMailProperties.class)); } + @Test + public void addHeaderAndFooterTestIfHeaderAndFootersAreAdded() { + String body = quotaAlertManager.addHeaderAndFooter("body", "Header", "Footer"); + assertEquals("HeaderbodyFooter", body); + } + + @Test + public void addHeaderAndFooterTestIfHeaderAndFootersAreNotAddedIfEmpty() { + String body = quotaAlertManager.addHeaderAndFooter("body", "", ""); + assertEquals("body", body); + } + @Test public void testGetDifferenceDays() { Date now = new Date(); diff --git a/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java b/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java index afcfe3ead99..1a4007ca5de 100644 --- a/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java +++ b/plugins/database/quota/src/main/java/org/apache/cloudstack/quota/QuotaServiceImpl.java @@ -141,7 +141,8 @@ public class QuotaServiceImpl extends ManagerBase implements QuotaService, Confi @Override public ConfigKey[] getConfigKeys() { return new ConfigKey[] {QuotaPluginEnabled, QuotaEnableEnforcement, QuotaCurrencySymbol, QuotaStatementPeriod, QuotaSmtpHost, QuotaSmtpPort, QuotaSmtpTimeout, - QuotaSmtpUser, QuotaSmtpPassword, QuotaSmtpAuthType, QuotaSmtpSender, QuotaSmtpEnabledSecurityProtocols, QuotaSmtpUseStartTLS, QuotaActivationRuleTimeout, QuotaAccountEnabled}; + QuotaSmtpUser, QuotaSmtpPassword, QuotaSmtpAuthType, QuotaSmtpSender, QuotaSmtpEnabledSecurityProtocols, QuotaSmtpUseStartTLS, QuotaActivationRuleTimeout, QuotaAccountEnabled, + QuotaEmailHeader, QuotaEmailFooter}; } @Override