Commit 561ad088 authored by lepdou's avatar lepdou

add cat restapi transaction & fix email windows outlook bug

parent 66c20025
...@@ -76,6 +76,11 @@ public class PortalSettings { ...@@ -76,6 +76,11 @@ public class PortalSettings {
return activeEnvs; return activeEnvs;
} }
public boolean isEnvActive(Env env) {
Boolean mark = envStatusMark.get(env);
return mark == null ? false : mark;
}
private class HealthCheckTask implements Runnable { private class HealthCheckTask implements Runnable {
private static final int ENV_DOWN_THRESHOLD = 2; private static final int ENV_DOWN_THRESHOLD = 2;
......
...@@ -85,6 +85,7 @@ public class RetryableRestTemplate { ...@@ -85,6 +85,7 @@ public class RetryableRestTemplate {
String uri = uriTemplateHandler.expand(path, uriVariables).getPath(); String uri = uriTemplateHandler.expand(path, uriVariables).getPath();
Transaction ct = Tracer.newTransaction("AdminAPI", uri); Transaction ct = Tracer.newTransaction("AdminAPI", uri);
ct.addData("Env", env);
List<ServiceDTO> services = getAdminServices(env, ct); List<ServiceDTO> services = getAdminServices(env, ct);
...@@ -126,6 +127,7 @@ public class RetryableRestTemplate { ...@@ -126,6 +127,7 @@ public class RetryableRestTemplate {
String uri = uriTemplateHandler.expand(path, uriVariables).getPath(); String uri = uriTemplateHandler.expand(path, uriVariables).getPath();
Transaction ct = Tracer.newTransaction("AdminAPI", uri); Transaction ct = Tracer.newTransaction("AdminAPI", uri);
ct.addData("Env", env);
List<ServiceDTO> services = getAdminServices(env, ct); List<ServiceDTO> services = getAdminServices(env, ct);
......
...@@ -101,6 +101,21 @@ public class PortalConfig extends RefreshableConfig { ...@@ -101,6 +101,21 @@ public class PortalConfig extends RefreshableConfig {
/*** /***
* Level: low * Level: low
**/ **/
public Set<Env> publishTipsSupportedEnvs() {
String[] configurations = getArrayProperty("namespace.publish.tips.supported.envs", null);
Set<Env> result = Sets.newHashSet();
if (configurations == null || configurations.length == 0) {
return result;
}
for (String env : configurations) {
result.add(Env.fromString(env));
}
return result;
}
public String consumerTokenSalt() { public String consumerTokenSalt() {
return getValue("consumer.token.salt", "apollo-portal"); return getValue("consumer.token.salt", "apollo-portal");
} }
...@@ -109,12 +124,20 @@ public class PortalConfig extends RefreshableConfig { ...@@ -109,12 +124,20 @@ public class PortalConfig extends RefreshableConfig {
return getValue("email.sender"); return getValue("email.sender");
} }
public String publishEmailBodyTemplate() { public String emailTemplateFramework() {
return getValue("email.template.release.v2", ""); return getValue("email.template.framework", "");
}
public String emailReleaseDiffModuleTemplate() {
return getValue("email.template.release.module.diff", "");
} }
public String rollbackEmailBodyTemplate() { public String emailRollbackDiffModuleTemplate() {
return getValue("email.template.rollback.v2", ""); return getValue("email.template.rollback.module.diff", "");
}
public String emailGrayRulesModuleTemplate() {
return getValue("email.template.release.module.rules", "");
} }
/*** /***
...@@ -139,6 +162,10 @@ public class PortalConfig extends RefreshableConfig { ...@@ -139,6 +162,10 @@ public class PortalConfig extends RefreshableConfig {
return getIntProperty("ctrip.email.survival.duration", 5); return getIntProperty("ctrip.email.survival.duration", 5);
} }
public boolean isSendEmailAsync() {
return getBooleanProperty("email.send.async", true);
}
public String portalServerName() { public String portalServerName() {
return getValue("serverName"); return getValue("serverName");
} }
......
...@@ -47,15 +47,13 @@ public abstract class ConfigPublishEmailBuilder { ...@@ -47,15 +47,13 @@ public abstract class ConfigPublishEmailBuilder {
private static final String EMAIL_CONTENT_FIELD_RELEASE_TITLE = "#\\{releaseTitle}"; private static final String EMAIL_CONTENT_FIELD_RELEASE_TITLE = "#\\{releaseTitle}";
private static final String EMAIL_CONTENT_FIELD_RELEASE_COMMENT = "#\\{releaseComment}"; private static final String EMAIL_CONTENT_FIELD_RELEASE_COMMENT = "#\\{releaseComment}";
private static final String EMAIL_CONTENT_FIELD_APOLLO_SERVER_ADDRESS = "#\\{apollo.portal.address}"; private static final String EMAIL_CONTENT_FIELD_APOLLO_SERVER_ADDRESS = "#\\{apollo.portal.address}";
private static final String EMAIL_CONTENT_FIELD_DIFF = "#\\{diff}"; private static final String EMAIL_CONTENT_FIELD_DIFF_CONTENT = "#\\{diffContent}";
//email content special field placeholder private static final String EMAIL_CONTENT_DIFF_MODULE = "#\\{diffModule}";
protected static final String EMAIL_CONTENT_FIELD_RULE = "#\\{rules}"; protected static final String EMAIL_CONTENT_GRAY_RULES_MODULE = "#\\{rulesModule}";
//email content module switch //email content special field placeholder
private static final String EMAIL_CONTENT_DIFF_HAS_CONTENT_SWITCH = "diff-hidden"; protected static final String EMAIL_CONTENT_GRAY_RULES_CONTENT = "#\\{rulesContent}";
private static final String EMAIL_CONTENT_DIFF_HAS_NOT_CONTENT_SWITCH = "diff-empty-hidden";
protected static final String EMAIL_CONTENT_RULE_SWITCH = "rule-hidden";
//set config's value max length to protect email. //set config's value max length to protect email.
protected static final int VALUE_MAX_LENGTH = 100; protected static final int VALUE_MAX_LENGTH = 100;
...@@ -72,65 +70,50 @@ public abstract class ConfigPublishEmailBuilder { ...@@ -72,65 +70,50 @@ public abstract class ConfigPublishEmailBuilder {
@Autowired @Autowired
private UserService userService; private UserService userService;
@Autowired @Autowired
private PortalConfig portalConfig; protected PortalConfig portalConfig;
public Email build(Env env, ReleaseHistoryBO releaseHistory) {
Email email = new Email();
email.setSubject(subject());
email.setSenderEmailAddress(portalConfig.emailSender());
email.setBody(emailContent(env, releaseHistory));
email.setRecipients(recipients(releaseHistory.getAppId(), releaseHistory.getNamespaceName()));
return email;
}
/**
* email subject
*/
protected abstract String subject(); protected abstract String subject();
/**
* email body content
*/
protected abstract String emailContent(Env env, ReleaseHistoryBO releaseHistory); protected abstract String emailContent(Env env, ReleaseHistoryBO releaseHistory);
private List<String> recipients(String appId, String namespaceName) { /**
Set<UserInfo> modifyRoleUsers = * email body template framework
rolePermissionService */
.queryUsersWithRole(RoleUtils.buildNamespaceRoleName(appId, namespaceName, RoleType.MODIFY_NAMESPACE)); protected abstract String getTemplateFramework();
Set<UserInfo> releaseRoleUsers =
rolePermissionService
.queryUsersWithRole(RoleUtils.buildNamespaceRoleName(appId, namespaceName, RoleType.RELEASE_NAMESPACE));
Set<UserInfo> owners = rolePermissionService.queryUsersWithRole(RoleUtils.buildAppMasterRoleName(appId));
Set<String> userIds = new HashSet<>(modifyRoleUsers.size() + releaseRoleUsers.size() + owners.size()); /**
* email body diff module template
*/
protected abstract String getDiffModuleTemplate();
for (UserInfo userInfo : modifyRoleUsers) {
userIds.add(userInfo.getUserId());
}
for (UserInfo userInfo : releaseRoleUsers) { public Email build(Env env, ReleaseHistoryBO releaseHistory) {
userIds.add(userInfo.getUserId());
}
for (UserInfo userInfo : owners) {
userIds.add(userInfo.getUserId());
}
List<UserInfo> userInfos = userService.findByUserIds(Lists.newArrayList(userIds)); Email email = new Email();
if (CollectionUtils.isEmpty(userInfos)){ email.setSubject(subject());
return Collections.emptyList(); email.setSenderEmailAddress(portalConfig.emailSender());
} email.setRecipients(recipients(releaseHistory.getAppId(), releaseHistory.getNamespaceName()));
List<String> recipients = new ArrayList<>(userInfos.size()); String emailBody = emailContent(env, releaseHistory);
for (UserInfo userInfo: userInfos){ //clear not used module
recipients.add(userInfo.getEmail()); emailBody = emailBody.replaceAll(EMAIL_CONTENT_DIFF_MODULE, "");
} emailBody = emailBody.replaceAll(EMAIL_CONTENT_GRAY_RULES_MODULE, "");
email.setBody(emailBody);
return recipients; return email;
} }
protected String renderEmailCommonContent(String template, Env env, ReleaseHistoryBO releaseHistory) { protected String renderEmailCommonContent(Env env, ReleaseHistoryBO releaseHistory) {
String template = getTemplateFramework();
String renderResult = renderReleaseBasicInfo(template, env, releaseHistory); String renderResult = renderReleaseBasicInfo(template, env, releaseHistory);
renderResult = renderDiffContent(renderResult, env, releaseHistory); renderResult = renderDiffModule(renderResult, env, releaseHistory);
return renderResult; return renderResult;
} }
...@@ -142,16 +125,16 @@ public abstract class ConfigPublishEmailBuilder { ...@@ -142,16 +125,16 @@ public abstract class ConfigPublishEmailBuilder {
renderResult = renderResult.replaceAll(EMAIL_CONTENT_FIELD_OPERATOR, Matcher.quoteReplacement(releaseHistory.getOperator())); renderResult = renderResult.replaceAll(EMAIL_CONTENT_FIELD_OPERATOR, Matcher.quoteReplacement(releaseHistory.getOperator()));
renderResult = renderResult.replaceAll(EMAIL_CONTENT_FIELD_RELEASE_TITLE, Matcher.quoteReplacement(releaseHistory.getReleaseTitle())); renderResult = renderResult.replaceAll(EMAIL_CONTENT_FIELD_RELEASE_TITLE, Matcher.quoteReplacement(releaseHistory.getReleaseTitle()));
renderResult = renderResult =
renderResult.replaceAll(EMAIL_CONTENT_FIELD_RELEASE_ID, String.valueOf(releaseHistory.getReleaseId())); renderResult.replaceAll(EMAIL_CONTENT_FIELD_RELEASE_ID, String.valueOf(releaseHistory.getReleaseId()));
renderResult = renderResult =
renderResult.replaceAll(EMAIL_CONTENT_FIELD_RELEASE_HISTORY_ID, String.valueOf(releaseHistory.getId())); renderResult.replaceAll(EMAIL_CONTENT_FIELD_RELEASE_HISTORY_ID, String.valueOf(releaseHistory.getId()));
renderResult = renderResult.replaceAll(EMAIL_CONTENT_FIELD_RELEASE_COMMENT, Matcher.quoteReplacement(releaseHistory.getReleaseComment())); renderResult = renderResult.replaceAll(EMAIL_CONTENT_FIELD_RELEASE_COMMENT, Matcher.quoteReplacement(releaseHistory.getReleaseComment()));
renderResult = renderResult.replaceAll(EMAIL_CONTENT_FIELD_APOLLO_SERVER_ADDRESS, getApolloPortalAddress()); renderResult = renderResult.replaceAll(EMAIL_CONTENT_FIELD_APOLLO_SERVER_ADDRESS, getApolloPortalAddress());
return renderResult return renderResult
.replaceAll(EMAIL_CONTENT_FIELD_RELEASE_TIME, dateFormat.format(releaseHistory.getReleaseTime())); .replaceAll(EMAIL_CONTENT_FIELD_RELEASE_TIME, dateFormat.format(releaseHistory.getReleaseTime()));
} }
private String renderDiffContent(String template, Env env, ReleaseHistoryBO releaseHistory) { private String renderDiffModule(String bodyTemplate, Env env, ReleaseHistoryBO releaseHistory) {
String appId = releaseHistory.getAppId(); String appId = releaseHistory.getAppId();
String namespaceName = releaseHistory.getNamespaceName(); String namespaceName = releaseHistory.getNamespaceName();
...@@ -162,16 +145,15 @@ public abstract class ConfigPublishEmailBuilder { ...@@ -162,16 +145,15 @@ public abstract class ConfigPublishEmailBuilder {
//don't show diff content if namespace's format is file //don't show diff content if namespace's format is file
if (appNamespace == null || if (appNamespace == null ||
!appNamespace.getFormat().equals(ConfigFileFormat.Properties.getValue())) { !appNamespace.getFormat().equals(ConfigFileFormat.Properties.getValue())) {
return template.replaceAll(EMAIL_CONTENT_FIELD_DIFF, "请点击链接到Apollo上查看"); return bodyTemplate.replaceAll(EMAIL_CONTENT_DIFF_MODULE, "<br><h4>变更内容请点击链接到Apollo上查看</h4>");
} }
ReleaseCompareResult result = getReleaseCompareResult(env, releaseHistory); ReleaseCompareResult result = getReleaseCompareResult(env, releaseHistory);
if (!result.hasContent()) { if (!result.hasContent()) {
String renderResult = template.replaceAll(EMAIL_CONTENT_DIFF_HAS_NOT_CONTENT_SWITCH, ""); return bodyTemplate.replaceAll(EMAIL_CONTENT_DIFF_MODULE, "<br><h4>无配置变更</h4>");
return renderResult.replaceAll(EMAIL_CONTENT_FIELD_DIFF, "");
} }
List<Change> changes = result.getChanges(); List<Change> changes = result.getChanges();
...@@ -184,23 +166,24 @@ public abstract class ConfigPublishEmailBuilder { ...@@ -184,23 +166,24 @@ public abstract class ConfigPublishEmailBuilder {
changesHtmlBuilder.append("<tr>"); changesHtmlBuilder.append("<tr>");
changesHtmlBuilder.append("<td width=\"10%\">").append(change.getType().toString()).append("</td>"); changesHtmlBuilder.append("<td width=\"10%\">").append(change.getType().toString()).append("</td>");
changesHtmlBuilder.append("<td width=\"10%\">").append(cutOffString(key)).append("</td>"); changesHtmlBuilder.append("<td width=\"20%\">").append(cutOffString(key)).append("</td>");
changesHtmlBuilder.append("<td width=\"10%\">").append(cutOffString(oldValue)).append("</td>"); changesHtmlBuilder.append("<td width=\"35%\">").append(cutOffString(oldValue)).append("</td>");
changesHtmlBuilder.append("<td width=\"10%\">").append(cutOffString(newValue)).append("</td>"); changesHtmlBuilder.append("<td width=\"35%\">").append(cutOffString(newValue)).append("</td>");
changesHtmlBuilder.append("</tr>"); changesHtmlBuilder.append("</tr>");
} }
String diffContent = Matcher.quoteReplacement(changesHtmlBuilder.toString()); String diffContent = Matcher.quoteReplacement(changesHtmlBuilder.toString());
String renderResult = template.replaceAll(EMAIL_CONTENT_FIELD_DIFF, diffContent); String diffModuleTemplate = getDiffModuleTemplate();
return renderResult.replaceAll(EMAIL_CONTENT_DIFF_HAS_CONTENT_SWITCH, ""); String diffModuleRenderResult = diffModuleTemplate.replaceAll(EMAIL_CONTENT_FIELD_DIFF_CONTENT, diffContent);
return bodyTemplate.replaceAll(EMAIL_CONTENT_DIFF_MODULE, diffModuleRenderResult);
} }
private ReleaseCompareResult getReleaseCompareResult(Env env, ReleaseHistoryBO releaseHistory) { private ReleaseCompareResult getReleaseCompareResult(Env env, ReleaseHistoryBO releaseHistory) {
if (releaseHistory.getOperation() == ReleaseOperation.GRAY_RELEASE if (releaseHistory.getOperation() == ReleaseOperation.GRAY_RELEASE
&& releaseHistory.getPreviousReleaseId() == 0) { && releaseHistory.getPreviousReleaseId() == 0) {
ReleaseDTO masterLatestActiveRelease = releaseService.loadLatestRelease( ReleaseDTO masterLatestActiveRelease = releaseService.loadLatestRelease(
releaseHistory.getAppId(), env, releaseHistory.getClusterName(), releaseHistory.getNamespaceName()); releaseHistory.getAppId(), env, releaseHistory.getClusterName(), releaseHistory.getNamespaceName());
ReleaseDTO branchLatestActiveRelease = releaseService.findReleaseById(env, releaseHistory.getReleaseId()); ReleaseDTO branchLatestActiveRelease = releaseService.findReleaseById(env, releaseHistory.getReleaseId());
return releaseService.compare(masterLatestActiveRelease, branchLatestActiveRelease); return releaseService.compare(masterLatestActiveRelease, branchLatestActiveRelease);
...@@ -209,13 +192,41 @@ public abstract class ConfigPublishEmailBuilder { ...@@ -209,13 +192,41 @@ public abstract class ConfigPublishEmailBuilder {
return releaseService.compare(env, releaseHistory.getPreviousReleaseId(), releaseHistory.getReleaseId()); return releaseService.compare(env, releaseHistory.getPreviousReleaseId(), releaseHistory.getReleaseId());
} }
private List<String> recipients(String appId, String namespaceName) {
Set<UserInfo> modifyRoleUsers =
rolePermissionService
.queryUsersWithRole(RoleUtils.buildNamespaceRoleName(appId, namespaceName, RoleType.MODIFY_NAMESPACE));
Set<UserInfo> releaseRoleUsers =
rolePermissionService
.queryUsersWithRole(RoleUtils.buildNamespaceRoleName(appId, namespaceName, RoleType.RELEASE_NAMESPACE));
Set<UserInfo> owners = rolePermissionService.queryUsersWithRole(RoleUtils.buildAppMasterRoleName(appId));
Set<String> userIds = new HashSet<>(modifyRoleUsers.size() + releaseRoleUsers.size() + owners.size());
protected String getReleaseTemplate() { for (UserInfo userInfo : modifyRoleUsers) {
return portalConfig.publishEmailBodyTemplate(); userIds.add(userInfo.getUserId());
} }
protected String getRollbackTemplate() { for (UserInfo userInfo : releaseRoleUsers) {
return portalConfig.rollbackEmailBodyTemplate(); userIds.add(userInfo.getUserId());
}
for (UserInfo userInfo : owners) {
userIds.add(userInfo.getUserId());
}
List<UserInfo> userInfos = userService.findByUserIds(Lists.newArrayList(userIds));
if (CollectionUtils.isEmpty(userInfos)) {
return Collections.emptyList();
}
List<String> recipients = new ArrayList<>(userInfos.size());
for (UserInfo userInfo : userInfos) {
recipients.add(userInfo.getEmail());
}
return recipients;
} }
protected String getApolloPortalAddress() { protected String getApolloPortalAddress() {
......
...@@ -31,36 +31,48 @@ public class GrayPublishEmailBuilder extends ConfigPublishEmailBuilder { ...@@ -31,36 +31,48 @@ public class GrayPublishEmailBuilder extends ConfigPublishEmailBuilder {
@Override @Override
public String emailContent(Env env, ReleaseHistoryBO releaseHistory) { public String emailContent(Env env, ReleaseHistoryBO releaseHistory) {
String result = renderEmailCommonContent(getReleaseTemplate(), env, releaseHistory); String result = renderEmailCommonContent(env, releaseHistory);
return renderGrayReleaseRuleContent(result, releaseHistory); return renderGrayReleaseRuleContent(result, releaseHistory);
} }
private String renderGrayReleaseRuleContent(String template, ReleaseHistoryBO releaseHistory) { @Override
String result = template.replaceAll(EMAIL_CONTENT_RULE_SWITCH, ""); protected String getTemplateFramework() {
return portalConfig.emailTemplateFramework();
}
@Override
protected String getDiffModuleTemplate() {
return portalConfig.emailReleaseDiffModuleTemplate();
}
private String renderGrayReleaseRuleContent(String bodyTemplate, ReleaseHistoryBO releaseHistory) {
Map<String, Object> context = releaseHistory.getOperationContext(); Map<String, Object> context = releaseHistory.getOperationContext();
Object rules = context.get("rules"); Object rules = context.get("rules");
List<GrayReleaseRuleItemDTO> List<GrayReleaseRuleItemDTO>
ruleItems = rules == null ? ruleItems = rules == null ?
null : gson.fromJson(rules.toString(), GsonType.RULE_ITEMS); null : gson.fromJson(rules.toString(), GsonType.RULE_ITEMS);
StringBuilder rulesHtmlBuilder = new StringBuilder();
if (CollectionUtils.isEmpty(ruleItems)) { if (CollectionUtils.isEmpty(ruleItems)) {
rulesHtmlBuilder.append("无灰度规则"); return bodyTemplate.replaceAll(EMAIL_CONTENT_GRAY_RULES_MODULE, "<br><h4>无灰度规则</h4>");
} else { } else {
StringBuilder rulesHtmlBuilder = new StringBuilder();
for (GrayReleaseRuleItemDTO ruleItem : ruleItems) { for (GrayReleaseRuleItemDTO ruleItem : ruleItems) {
String clientAppId = ruleItem.getClientAppId(); String clientAppId = ruleItem.getClientAppId();
Set<String> ips = ruleItem.getClientIpList(); Set<String> ips = ruleItem.getClientIpList();
rulesHtmlBuilder.append("<b>AppId:&nbsp;</b>") rulesHtmlBuilder.append("<b>AppId:&nbsp;</b>")
.append(clientAppId) .append(clientAppId)
.append("&nbsp;&nbsp; <b>IP:&nbsp;</b>"); .append("&nbsp;&nbsp; <b>IP:&nbsp;</b>");
IP_JOINER.appendTo(rulesHtmlBuilder, ips); IP_JOINER.appendTo(rulesHtmlBuilder, ips);
} }
} String grayRulesModuleContent = portalConfig.emailGrayRulesModuleTemplate().replaceAll(EMAIL_CONTENT_GRAY_RULES_CONTENT,
Matcher.quoteReplacement(rulesHtmlBuilder.toString()));
return result.replaceAll(EMAIL_CONTENT_FIELD_RULE, Matcher.quoteReplacement(rulesHtmlBuilder.toString())); return bodyTemplate.replaceAll(EMAIL_CONTENT_GRAY_RULES_MODULE, Matcher.quoteReplacement(grayRulesModuleContent));
}
} }
} }
...@@ -20,7 +20,16 @@ public class MergeEmailBuilder extends ConfigPublishEmailBuilder { ...@@ -20,7 +20,16 @@ public class MergeEmailBuilder extends ConfigPublishEmailBuilder {
@Override @Override
protected String emailContent(Env env, ReleaseHistoryBO releaseHistory) { protected String emailContent(Env env, ReleaseHistoryBO releaseHistory) {
String template = getReleaseTemplate(); return renderEmailCommonContent(env, releaseHistory);
return renderEmailCommonContent(template, env, releaseHistory); }
@Override
protected String getTemplateFramework() {
return portalConfig.emailTemplateFramework();
}
@Override
protected String getDiffModuleTemplate() {
return portalConfig.emailReleaseDiffModuleTemplate();
} }
} }
...@@ -20,7 +20,16 @@ public class NormalPublishEmailBuilder extends ConfigPublishEmailBuilder { ...@@ -20,7 +20,16 @@ public class NormalPublishEmailBuilder extends ConfigPublishEmailBuilder {
@Override @Override
protected String emailContent(Env env, ReleaseHistoryBO releaseHistory) { protected String emailContent(Env env, ReleaseHistoryBO releaseHistory) {
String template = getReleaseTemplate(); return renderEmailCommonContent(env, releaseHistory);
return renderEmailCommonContent(template, env, releaseHistory); }
@Override
protected String getTemplateFramework() {
return portalConfig.emailTemplateFramework();
}
@Override
protected String getDiffModuleTemplate() {
return portalConfig.emailReleaseDiffModuleTemplate();
} }
} }
...@@ -20,7 +20,16 @@ public class RollbackEmailBuilder extends ConfigPublishEmailBuilder { ...@@ -20,7 +20,16 @@ public class RollbackEmailBuilder extends ConfigPublishEmailBuilder {
@Override @Override
protected String emailContent(Env env, ReleaseHistoryBO releaseHistory) { protected String emailContent(Env env, ReleaseHistoryBO releaseHistory) {
String template = getRollbackTemplate(); return renderEmailCommonContent(env, releaseHistory);
return renderEmailCommonContent(template, env, releaseHistory); }
@Override
protected String getTemplateFramework() {
return portalConfig.emailTemplateFramework();
}
@Override
protected String getDiffModuleTemplate() {
return portalConfig.emailRollbackDiffModuleTemplate();
} }
} }
package com.ctrip.framework.apollo.portal.service; package com.ctrip.framework.apollo.portal.service;
import com.ctrip.framework.apollo.portal.components.config.PortalConfig;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.gson.Gson; import com.google.gson.Gson;
...@@ -30,10 +31,7 @@ import org.springframework.stereotype.Service; ...@@ -30,10 +31,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpClientErrorException;
import java.util.HashMap; import java.util.*;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@Service @Service
public class NamespaceService { public class NamespaceService {
...@@ -41,8 +39,6 @@ public class NamespaceService { ...@@ -41,8 +39,6 @@ public class NamespaceService {
private Logger logger = LoggerFactory.getLogger(NamespaceService.class); private Logger logger = LoggerFactory.getLogger(NamespaceService.class);
private Gson gson = new Gson(); private Gson gson = new Gson();
@Autowired
private PortalSettings portalSettings;
@Autowired @Autowired
private UserInfoHolder userInfoHolder; private UserInfoHolder userInfoHolder;
@Autowired @Autowired
...@@ -53,6 +49,10 @@ public class NamespaceService { ...@@ -53,6 +49,10 @@ public class NamespaceService {
private AdminServiceAPI.NamespaceAPI namespaceAPI; private AdminServiceAPI.NamespaceAPI namespaceAPI;
@Autowired @Autowired
private AppNamespaceService appNamespaceService; private AppNamespaceService appNamespaceService;
@Autowired
private PortalConfig portalConfig;
@Autowired
private PortalSettings portalSettings;
public NamespaceDTO createNamespace(Env env, NamespaceDTO namespace) { public NamespaceDTO createNamespace(Env env, NamespaceDTO namespace) {
...@@ -138,9 +138,11 @@ public class NamespaceService { ...@@ -138,9 +138,11 @@ public class NamespaceService {
public Map<String, Map<String, Boolean>> getNamespacesPublishInfo(String appId) { public Map<String, Map<String, Boolean>> getNamespacesPublishInfo(String appId) {
Map<String, Map<String, Boolean>> result = Maps.newHashMap(); Map<String, Map<String, Boolean>> result = Maps.newHashMap();
List<Env> envs = portalSettings.getActiveEnvs(); Set<Env> envs = portalConfig.publishTipsSupportedEnvs();
for (Env env: envs) { for (Env env: envs) {
result.put(env.toString(), namespaceAPI.getNamespacePublishInfo(env, appId)); if (portalSettings.isEnvActive(env)) {
result.put(env.toString(), namespaceAPI.getNamespacePublishInfo(env, appId));
}
} }
return result; return result;
......
...@@ -66,7 +66,10 @@ public class CtripEmailRequestBuilder { ...@@ -66,7 +66,10 @@ public class CtripEmailRequestBuilder {
setSender.invoke(emailRequest, email.getSenderEmailAddress()); setSender.invoke(emailRequest, email.getSenderEmailAddress());
setSubject.invoke(emailRequest, email.getSubject()); setSubject.invoke(emailRequest, email.getSubject());
setBodyContent.invoke(emailRequest, email.getBody()); String emailBodyBuilder = "<entry><content><![CDATA[<!DOCTYPE html>" +
email.getBody() +
"]]></content></entry>";
setBodyContent.invoke(emailRequest, emailBodyBuilder);
setRecipient.invoke(emailRequest, email.getRecipients()); setRecipient.invoke(emailRequest, email.getRecipients());
return emailRequest; return emailRequest;
......
...@@ -21,6 +21,7 @@ public class CtripEmailService implements EmailService { ...@@ -21,6 +21,7 @@ public class CtripEmailService implements EmailService {
private Object emailServiceClient; private Object emailServiceClient;
private Method sendEmailAsync; private Method sendEmailAsync;
private Method sendEmail;
@Autowired @Autowired
private CtripEmailRequestBuilder emailRequestBuilder; private CtripEmailRequestBuilder emailRequestBuilder;
...@@ -33,13 +34,15 @@ public class CtripEmailService implements EmailService { ...@@ -33,13 +34,15 @@ public class CtripEmailService implements EmailService {
initServiceClientConfig(); initServiceClientConfig();
Class emailServiceClientClazz = Class emailServiceClientClazz =
Class.forName("com.ctrip.framework.apolloctripservice.emailservice.EmailServiceClient"); Class.forName("com.ctrip.framework.apolloctripservice.emailservice.EmailServiceClient");
Method getInstanceMethod = emailServiceClientClazz.getMethod("getInstance"); Method getInstanceMethod = emailServiceClientClazz.getMethod("getInstance");
emailServiceClient = getInstanceMethod.invoke(null); emailServiceClient = getInstanceMethod.invoke(null);
Class sendEmailRequestClazz = Class sendEmailRequestClazz =
Class.forName("com.ctrip.framework.apolloctripservice.emailservice.SendEmailRequest"); Class.forName("com.ctrip.framework.apolloctripservice.emailservice.SendEmailRequest");
sendEmailAsync = emailServiceClientClazz.getMethod("sendEmailAsync", sendEmailRequestClazz); sendEmailAsync = emailServiceClientClazz.getMethod("sendEmailAsync", sendEmailRequestClazz);
sendEmail = emailServiceClientClazz.getMethod("sendEmail", sendEmailRequestClazz);
} catch (Throwable e) { } catch (Throwable e) {
logger.error("init ctrip email service failed", e); logger.error("init ctrip email service failed", e);
Tracer.logError("init ctrip email service failed", e); Tracer.logError("init ctrip email service failed", e);
...@@ -64,9 +67,12 @@ public class CtripEmailService implements EmailService { ...@@ -64,9 +67,12 @@ public class CtripEmailService implements EmailService {
try { try {
Object emailRequest = emailRequestBuilder.buildEmailRequest(email); Object emailRequest = emailRequestBuilder.buildEmailRequest(email);
Object sendResponse = sendEmailAsync.invoke(emailServiceClient, emailRequest);
logger.info("Email sender response:" + sendResponse); Object sendResponse = portalConfig.isSendEmailAsync() ?
sendEmailAsync.invoke(emailServiceClient, emailRequest) :
sendEmail.invoke(emailServiceClient, emailRequest);
logger.info("Email server response: " + sendResponse);
} catch (Throwable e) { } catch (Throwable e) {
logger.error("send email failed", e); logger.error("send email failed", e);
......
package com.ctrip.framework.apollo.portal.spi.ctrip; package com.ctrip.framework.apollo.portal.spi.ctrip;
import com.ctrip.framework.apollo.portal.spi.ctrip.filters.UserAccessFilter;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.ctrip.framework.apollo.portal.components.config.PortalConfig; import com.ctrip.framework.apollo.portal.components.config.PortalConfig;
import com.ctrip.framework.apollo.portal.spi.UserInfoHolder; import com.ctrip.framework.apollo.portal.spi.UserInfoHolder;
import com.ctrip.framework.apollo.portal.spi.ctrip.filters.RecordAccessUserFilter;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.embedded.FilterRegistrationBean; import org.springframework.boot.context.embedded.FilterRegistrationBean;
...@@ -47,10 +47,10 @@ public class WebContextConfiguration { ...@@ -47,10 +47,10 @@ public class WebContextConfiguration {
} }
@Bean @Bean
public FilterRegistrationBean recordAccessUserFilter() { public FilterRegistrationBean userAccessFilter() {
FilterRegistrationBean filter = new FilterRegistrationBean(); FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new RecordAccessUserFilter(userInfoHolder)); filter.setFilter(new UserAccessFilter(userInfoHolder));
filter.addUrlPatterns("/apps"); filter.addUrlPatterns("/*");
return filter; return filter;
} }
......
...@@ -3,23 +3,19 @@ package com.ctrip.framework.apollo.portal.spi.ctrip.filters; ...@@ -3,23 +3,19 @@ package com.ctrip.framework.apollo.portal.spi.ctrip.filters;
import com.ctrip.framework.apollo.portal.constant.CatEventType; import com.ctrip.framework.apollo.portal.constant.CatEventType;
import com.ctrip.framework.apollo.portal.spi.UserInfoHolder; import com.ctrip.framework.apollo.portal.spi.UserInfoHolder;
import com.ctrip.framework.apollo.tracer.Tracer; import com.ctrip.framework.apollo.tracer.Tracer;
import com.google.common.base.Strings;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException; import java.io.IOException;
import javax.servlet.Filter; public class UserAccessFilter implements Filter {
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class RecordAccessUserFilter implements Filter {
private static final String STATIC_RESOURCE_REGEX = ".*\\.(js|html|htm|png|css|woff2)$";
private UserInfoHolder userInfoHolder; private UserInfoHolder userInfoHolder;
public UserAccessFilter(UserInfoHolder userInfoHolder) {
public RecordAccessUserFilter(UserInfoHolder userInfoHolder) {
this.userInfoHolder = userInfoHolder; this.userInfoHolder = userInfoHolder;
} }
...@@ -30,9 +26,13 @@ public class RecordAccessUserFilter implements Filter { ...@@ -30,9 +26,13 @@ public class RecordAccessUserFilter implements Filter {
@Override @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException { throws IOException, ServletException {
String requestUri = ((HttpServletRequest) request).getRequestURI();
Tracer.logEvent(CatEventType.USER_ACCESS, userInfoHolder.getUser().getUserId()); if (!isStaticResource(requestUri)) {
Tracer.logEvent(CatEventType.USER_ACCESS, userInfoHolder.getUser().getUserId());
}
chain.doFilter(request, response); chain.doFilter(request, response);
} }
...@@ -41,4 +41,9 @@ public class RecordAccessUserFilter implements Filter { ...@@ -41,4 +41,9 @@ public class RecordAccessUserFilter implements Filter {
public void destroy() { public void destroy() {
} }
private boolean isStaticResource(String uri) {
return !Strings.isNullOrEmpty(uri) && uri.matches(STATIC_RESOURCE_REGEX);
}
} }
...@@ -17,12 +17,12 @@ $(document).ready(function () { ...@@ -17,12 +17,12 @@ $(document).ready(function () {
$('[data-tooltip="tooltip"]').tooltip({ $('[data-tooltip="tooltip"]').tooltip({
trigger : 'hover' trigger : 'hover'
}); });
}, 2500);
setTimeout(function () {
$("textarea").niceScroll({cursoropacitymax: 0}); $("textarea").niceScroll({cursoropacitymax: 0});
$("pre").niceScroll({cursoropacitymax: 0}); $("pre").niceScroll({cursoropacitymax: 0});
}, 1000);
setTimeout(function () {
$(".release-history-list").niceScroll({cursoropacitymax: 0}); $(".release-history-list").niceScroll({cursoropacitymax: 0});
}, 2500); }, 2500);
......
...@@ -143,7 +143,7 @@ ...@@ -143,7 +143,7 @@
<dependency> <dependency>
<groupId>com.dianping.cat</groupId> <groupId>com.dianping.cat</groupId>
<artifactId>cat-client</artifactId> <artifactId>cat-client</artifactId>
<version>2.1.2</version> <version>2.2.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.unidal.framework</groupId> <groupId>org.unidal.framework</groupId>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment