/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.sa.catalog;
import static com.emc.storageos.db.client.URIUtil.uri;
import static com.emc.storageos.api.mapper.DbObjectMapper.mapDataObjectFields;
import static com.emc.storageos.api.mapper.DbObjectMapper.toRelatedResource;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;
import com.emc.storageos.security.mail.MailHelper;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.emc.sa.email.ApprovalRequiredEmail;
import com.emc.sa.email.ApprovalUpdatedEmail;
import com.emc.sa.email.OrderUpdatedEmail;
import com.emc.storageos.db.client.model.uimodels.ApprovalRequest;
import com.emc.storageos.db.client.model.uimodels.CatalogService;
import com.emc.storageos.db.client.model.uimodels.Order;
import com.emc.storageos.db.client.model.uimodels.TenantPreferences;
import com.emc.storageos.db.client.model.UserPreferences;
import com.emc.sa.util.SSLUtil;
import com.emc.storageos.coordinator.client.service.CoordinatorClient;
import com.emc.storageos.model.ResourceTypeEnum;
import com.emc.vipr.model.catalog.ApprovalRestRep;
import com.google.common.collect.Maps;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientHandlerException;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
@Component
public class NotificationManagerImpl implements NotificationManager {
private static final Logger log = Logger.getLogger(NotificationManagerImpl.class);
public static final String SMTP_PROPERTY_PREFIX = "system_connectemc_smtp_";
public static final String NETWORK_VIRTUAL_IP = "network_vip";
public static final String NETWORK_VIP = "network_vip";
public static final String NETWORK_VIP6 = "network_vip6";
@Autowired
private UserPreferenceManager userPreferenceManager;
@Autowired
private CatalogPreferenceManager catalogPreferenceManager;
@Autowired
protected CoordinatorClient coordinatorClient;
private MailHelper mailHelper;
@PostConstruct
private void init() {
SSLUtil.trustAllSSLCertificates();
SSLUtil.trustAllHostnames();
}
public void notifyUserOfOrderStatus(Order order, CatalogService service, ApprovalRequest approvalRequest) {
if (isUserNotificationsEnabled(order)) {
sendOrderStatusEmail(order, service, approvalRequest);
}
else {
if (order != null && service != null) {
log.info(String.format("(%s) %s %s (Order: %s)", order.getSubmittedByUserId(), service.getTitle(),
order.getOrderStatus(), order.getId()));
}
}
}
public void notifyApproversOfApprovalRequest(Order order, CatalogService service, ApprovalRequest approval) {
if (isApproverNotificationsEnabled(order)) {
sendApproversApprovalRequestEmail(order, service, approval);
}
else {
if (order != null && service != null) {
log.info(String.format("(Approvers) %s requires approval for %s (Order: %s)", order.getSubmittedByUserId(),
service.getTitle(), order.getId()));
}
}
String approvalUrl = getApprovalUrl(order);
if (approvalUrl != null) {
notifyApprovalService(approvalUrl, order, approval);
}
}
public void notifyUserOfApprovalStatus(Order order, CatalogService service, ApprovalRequest approval) {
if (isUserNotificationsEnabled(order)) {
sendApprovalStatusEmail(order, service, approval);
}
else {
if (order != null && service != null) {
log.info(String.format("(%s) %s has been %s by %s (Order: %s)", order.getSubmittedByUserId(), service.getTitle(),
approval.getApprovalStatus(), approval.getApprovedBy(), order.getId()));
}
}
}
private boolean isUserNotificationsEnabled(Order order) {
return getUserEmailAddress(order) != null;
}
private boolean isApproverNotificationsEnabled(Order order) {
return getApproversEmailAddress(order) != null;
}
private String getUserEmailAddress(Order order) {
UserPreferences prefs = userPreferenceManager.getPreferences(order.getSubmittedByUserId());
if ((prefs != null) && Boolean.TRUE.equals(prefs.getNotifyByEmail())) {
return StringUtils.trimToNull(prefs.getEmail());
}
return null;
}
private String getApproversEmailAddress(Order order) {
TenantPreferences prefs = catalogPreferenceManager.getPreferencesByTenant(order.getTenant());
return (prefs != null) ? StringUtils.trimToNull(prefs.getApproverEmail()) : null;
}
private String getApprovalUrl(Order order) {
TenantPreferences prefs = catalogPreferenceManager.getPreferencesByTenant(order.getTenant());
return (prefs != null) ? StringUtils.trimToNull(prefs.getApprovalUrl()) : null;
}
public void sendOrderStatusEmail(Order order, CatalogService catalogService, ApprovalRequest approvalRequest) {
String virtualIp = getNetworkVirtualIP();
OrderUpdatedEmail orderUpdatedEmail = new OrderUpdatedEmail(order, catalogService, approvalRequest, virtualIp);
String to = getUserEmailAddress(order);
String subject = orderUpdatedEmail.getTitle();
String html = orderUpdatedEmail.getEmailContent();
getMailHelper().sendMailMessage(to, subject, html);
}
public void sendApproversApprovalRequestEmail(Order order, CatalogService catalogService, ApprovalRequest approvalRequest) {
String virtualIp = getNetworkVirtualIP();
ApprovalRequiredEmail approvalRequiredEmail = new ApprovalRequiredEmail(order, catalogService, approvalRequest, virtualIp);
String to = getApproversEmailAddress(order);
String subject = approvalRequiredEmail.getTitle();
String html = approvalRequiredEmail.getEmailContent();
getMailHelper().sendMailMessage(to, subject, html);
}
public void sendApprovalStatusEmail(Order order, CatalogService catalogService, ApprovalRequest approvalRequest) {
String virtualIp = getNetworkVirtualIP();
ApprovalUpdatedEmail approvalUpdatedEmail = new ApprovalUpdatedEmail(order, catalogService, approvalRequest, virtualIp);
String to = getUserEmailAddress(order);
String subject = approvalUpdatedEmail.getTitle();
String html = approvalUpdatedEmail.getEmailContent();
getMailHelper().sendMailMessage(to, subject, html);
}
private String getNetworkVirtualIP() {
Map<String, String> props = getPropertiesFromCoordinator();
return props.get(NETWORK_VIP);
}
private Map<String, String> getPropertiesFromCoordinator() {
com.emc.storageos.model.property.PropertyInfo propertyInfo = coordinatorClient.getPropertyInfo();
if (propertyInfo != null) {
return propertyInfo.getAllProperties();
}
return Maps.newHashMap();
}
public CoordinatorClient getCoordinatorClient() {
return coordinatorClient;
}
public void setCoordinatorClient(CoordinatorClient coordinatorClient) {
this.coordinatorClient = coordinatorClient;
}
public boolean containsSmtpSettings(Map<String, String> properties) {
for (String key : properties.keySet()) {
if (key.startsWith(SMTP_PROPERTY_PREFIX)) {
return true;
}
}
return false;
}
private synchronized MailHelper getMailHelper() {
if (mailHelper == null) {
mailHelper = new MailHelper(this.coordinatorClient);
}
return mailHelper;
}
private void notifyApprovalService(String approvalUrl, Order order, ApprovalRequest approval) {
try
{
ApprovalRestRep approvalRestRep = map(approval);
ClientConfig config = new DefaultClientConfig();
config.getClasses().add(JacksonJaxbJsonProvider.class);
Client client = Client.create(config);
WebResource.Builder webResource = client.resource(UriBuilder.fromUri(approvalUrl).build()).type(MediaType.APPLICATION_JSON);
ClientResponse response = webResource.post(ClientResponse.class, approvalRestRep);
if (isError(response)) {
log.error(String.format("Approval POST failed: %s, %s %s", approvalUrl, response.getStatus(),
response.getEntity(String.class)));
}
else {
log.debug(String.format("Approval POST succeeded: %s, %s %s", approvalUrl, response.getStatus(),
response.getEntity(String.class)));
}
} catch (ClientHandlerException e) {
log.error(String.format("Approval POST failed: %s, %s, %s", approvalUrl, e.getCause(), e.getMessage()));
}
}
public ApprovalRestRep map(ApprovalRequest from) {
if (from == null) {
return null;
}
ApprovalRestRep to = new ApprovalRestRep();
mapDataObjectFields(from, to);
if (from.getTenant() != null) {
to.setTenant(toRelatedResource(ResourceTypeEnum.TENANT, uri(from.getTenant())));
}
if (from.getOrderId() != null) {
to.setOrder(toRelatedResource(ResourceTypeEnum.ORDER, from.getOrderId()));
}
to.setApprovedBy(from.getApprovedBy());
to.setDateActioned(from.getDateActioned());
to.setMessage(from.getMessage());
to.setApprovalStatus(from.getApprovalStatus());
return to;
}
protected boolean isError(ClientResponse response) {
int statusCode = response.getStatus();
if (statusCode >= 400) {
return true;
}
else {
return false;
}
}
}