/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.systemservices.impl.util;
import com.emc.storageos.coordinator.client.model.Site;
import com.emc.storageos.coordinator.client.service.CoordinatorClient;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.constraint.AlternateIdConstraint;
import com.emc.storageos.db.client.constraint.NamedElementQueryResultList;
import com.emc.storageos.db.client.constraint.impl.AlternateIdConstraintImpl;
import com.emc.storageos.db.client.impl.DataObjectType;
import com.emc.storageos.db.client.impl.TypeMap;
import com.emc.storageos.db.client.model.UserPreferences;
import com.emc.storageos.security.audit.AuditLogManager;
import com.emc.storageos.security.mail.MailHelper;
import com.emc.storageos.services.OperationTypeEnum;
import com.google.common.collect.Maps;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
public class MailHandler {
private static final Logger log = LoggerFactory.getLogger(MailHandler.class);
@Autowired
private DbClient dbClient;
@Autowired
private AuditLogManager auditLogManager;
@Autowired
private CoordinatorClient coordinator;
private MailHelper mailHelper;
/**
* Sends mail alert that site network is broken.
*
* @param site the site with broken network
*/
public void sendSiteNetworkBrokenMail(Site site) {
String to = getMailAddressOfUser("root");
if (to == null || to.isEmpty()) {
log.warn("Can't send mail alert, no email address for root user");
return;
}
Map<String, String> parameters = Maps.newHashMap();
parameters.put("standbyName", site.getName());
String title = String.format("ATTENTION - %s network is broken",
site.getName());
String content = MailHelper.readTemplate("StandbySiteBroken.html");
content = MailHelper.parseTemplate(parameters, content);
getMailHelper().sendMailMessage(to, title, content);
}
/**
* Send alert mail that standby site is marked as STANDBY_DEGRADED
* @param siteName name of site that is degraded
* @param degradeTimeStamp time the site is marked as degraded
*/
public void sendSiteDegradedMail(String siteName, long degradeTimeStamp) {
String degradeTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(degradeTimeStamp));
String to = getMailAddressOfUser("root");
if (to == null || to.isEmpty()) {
log.warn("Can't send mail alert, no email address for root user");
return;
}
Map<String, String> params = Maps.newHashMap();
params.put("siteName", siteName);
params.put("degradeTime", String.format("%s (TimeZone: %s)", degradeTime, TimeZone.getDefault().getID()));
String title = String.format("ATTENTION - %s site has been marked as STANDBY_DEGRADED state", siteName);
String content = MailHelper.readTemplate("StandbySiteDegraded.html");
content = MailHelper.parseTemplate(params, content);
getMailHelper().sendMailMessage(to, title, content);
}
private MailHelper getMailHelper() {
if (mailHelper == null) {
mailHelper = new MailHelper(coordinator);
}
return mailHelper;
}
/**
* get user's mail address from UserPreference CF
*
* @param userName
* @return
*/
private String getMailAddressOfUser(String userName) {
DataObjectType doType = TypeMap.getDoType(UserPreferences.class);
AlternateIdConstraint constraint = new AlternateIdConstraintImpl(
doType.getColumnField(UserPreferences.USER_ID), userName);
NamedElementQueryResultList queryResults = new NamedElementQueryResultList();
this.dbClient.queryByConstraint(constraint, queryResults);
List<URI> userPrefsIds = new ArrayList<>();
for (NamedElementQueryResultList.NamedElement namedElement : queryResults) {
userPrefsIds.add(namedElement.getId());
}
if (userPrefsIds.isEmpty()) {
return null;
}
final List<UserPreferences> userPrefs = new ArrayList<>();
Iterator<UserPreferences> iter = this.dbClient.queryIterativeObjects(UserPreferences.class, userPrefsIds);
while (iter.hasNext()) {
userPrefs.add(iter.next());
}
if (userPrefs.size() > 1) {
throw new IllegalStateException("There should only be 1 user preferences object for a user");
}
if (userPrefs.isEmpty()) {
// if there isn't a user prefs object in the DB yet then we haven't saved one for this user yet.
return null;
}
return userPrefs.get(0).getEmail();
}
}