/* * Copyright 2016 by PrimeCloud Controller/OSS Community. * * This file is part of PrimeCloud Controller(TM). * * PrimeCloud Controller(TM) is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * PrimeCloud Controller(TM) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PrimeCloud Controller(TM). If not, see <http://www.gnu.org/licenses/>. */ package jp.primecloud.auto.process.zabbix; import java.util.ArrayList; import java.util.List; import jp.primecloud.auto.common.status.ZabbixInstanceStatus; import jp.primecloud.auto.config.Config; import jp.primecloud.auto.entity.crud.Farm; import jp.primecloud.auto.entity.crud.LoadBalancer; import jp.primecloud.auto.entity.crud.User; import jp.primecloud.auto.entity.crud.ZabbixLoadBalancer; import jp.primecloud.auto.exception.AutoException; import jp.primecloud.auto.process.ProcessLogger; import jp.primecloud.auto.service.ServiceSupport; import jp.primecloud.auto.util.MessageUtils; import jp.primecloud.auto.zabbix.model.hostgroup.Hostgroup; import jp.primecloud.auto.zabbix.model.proxy.Proxy; import org.apache.commons.lang.StringUtils; /** * <p> * TODO: クラスコメントを記述 * </p> * */ public class ZabbixLoadBalancerProcess extends ServiceSupport { protected ZabbixProcessClientFactory zabbixProcessClientFactory; protected ProcessLogger processLogger; public void startHost(Long loadBalancerNo) { LoadBalancer loadBalancer = loadBalancerDao.read(loadBalancerNo); // ログ出力 if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200232", loadBalancerNo, loadBalancer.getLoadBalancerName())); } ZabbixProcessClient zabbixProcessClient = zabbixProcessClientFactory.createZabbixProcessClient(); ZabbixLoadBalancer zabbixLoadBalancer = zabbixLoadBalancerDao.read(loadBalancerNo); String hostid = zabbixLoadBalancer.getHostid(); // Zabbixホスト名 String hostname = getHostName(loadBalancer.getFqdn()); // ZabbixプロキシID String proxyHostid = getProxyHostid(zabbixProcessClient); // 監視対象の登録 if (StringUtils.isEmpty(hostid)) { List<Hostgroup> hostgroups = getInitHostgroups(zabbixProcessClient, loadBalancer.getFarmNo()); hostid = zabbixProcessClient.createHost(hostname, loadBalancer.getFqdn(), hostgroups, true, false, null, proxyHostid); // イベントログ出力 processLogger.debug(null, null, "ZabbixRegist", new Object[] { loadBalancer.getFqdn(), hostid }); // データベースの更新 zabbixLoadBalancer.setHostid(hostid); zabbixLoadBalancer.setStatus(ZabbixInstanceStatus.MONITORING.toString()); zabbixLoadBalancerDao.update(zabbixLoadBalancer); } // 監視対象の有効化 else { zabbixProcessClient.updateHost(hostid, hostname, loadBalancer.getFqdn(), null, true, false, null, proxyHostid); // データベースの更新 zabbixLoadBalancer.setStatus(ZabbixInstanceStatus.MONITORING.toString()); zabbixLoadBalancerDao.update(zabbixLoadBalancer); // イベントログ出力 processLogger.debug(null, null, "ZabbixStart", new Object[] { loadBalancer.getFqdn(), hostid }); } // ログ出力 if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200233", loadBalancerNo, loadBalancer.getLoadBalancerName())); } } public void stopHost(Long loadBalancerNo) { LoadBalancer loadBalancer = loadBalancerDao.read(loadBalancerNo); // ログ出力 if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200234", loadBalancerNo, loadBalancer.getLoadBalancerName())); } ZabbixProcessClient zabbixProcessClient = zabbixProcessClientFactory.createZabbixProcessClient(); // 監視対象の無効化 try { // Zabbixホスト名 String hostname = getHostName(loadBalancer.getFqdn()); // ZabbixプロキシID取得 String proxyHostid = getProxyHostid(zabbixProcessClient); ZabbixLoadBalancer zabbixLoadBalancer = zabbixLoadBalancerDao.read(loadBalancerNo); zabbixProcessClient.updateHost(zabbixLoadBalancer.getHostid(), hostname, loadBalancer.getFqdn(), null, false, false, null, proxyHostid); // イベントログ出力 processLogger.debug(null, null, "ZabbixStop", new Object[] { loadBalancer.getFqdn(), zabbixLoadBalancer.getHostid() }); // データベースの更新 zabbixLoadBalancer.setStatus(ZabbixInstanceStatus.UN_MONITORING.toString()); zabbixLoadBalancerDao.update(zabbixLoadBalancer); } catch (AutoException ignore) { // 処理に失敗した場合、警告ログを出力する log.warn(ignore.getMessage()); } // ログ出力 if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-200235", loadBalancerNo, loadBalancer.getLoadBalancerName())); } } protected String getHostgroupName(User user) { return getHostgroupName(user, null); } protected String getHostgroupName(User user, Farm farm) { String delimiter = "_"; StringBuilder sb = new StringBuilder(); sb.append(user.getUsername()); if (farm != null) { sb.append(delimiter); sb.append(farm.getFarmName()); } // 64文字でカットする // TODO: Zabbixの制限による暫定対応 if (sb.length() <= 64) { return sb.toString(); } else { return sb.substring(0, 64); } } protected List<Hostgroup> getInitHostgroups(ZabbixProcessClient zabbixProcessClient, Long farmNo) { Farm farm = farmDao.read(farmNo); User user = userDao.read(farm.getUserNo()); List<Hostgroup> hostgroups = new ArrayList<Hostgroup>(); // ユーザごとのホストグループ String hostgroupName = getHostgroupName(user); Hostgroup hostgroup = zabbixProcessClient.getHostgroupByName(hostgroupName); if (hostgroup != null) { hostgroups.add(hostgroup); } // ファームごとのホストグループ String hostgroupName2 = getHostgroupName(user, farm); Hostgroup hostgroup2 = zabbixProcessClient.getHostgroupByName(hostgroupName2); if (hostgroup2 != null) { hostgroups.add(hostgroup2); } return hostgroups; } private String getHostName(String fqdn) { String hostname = fqdn; if (StringUtils.isNotEmpty(Config.getProperty("zabbix.prefix"))) { hostname = Config.getProperty("zabbix.prefix") + "-" + hostname; } return hostname; } private String getProxyHostid(ZabbixProcessClient zabbixProcessClient) { String proxyName = Config.getProperty("zabbix.proxy"); if (StringUtils.isEmpty(proxyName)) { return null; } Proxy proxy = zabbixProcessClient.getProxy(proxyName); if (proxy != null) { return proxy.getProxyid(); } return null; } public void setZabbixProcessClientFactory(ZabbixProcessClientFactory zabbixProcessClientFactory) { this.zabbixProcessClientFactory = zabbixProcessClientFactory; } public void setProcessLogger(ProcessLogger processLogger) { this.processLogger = processLogger; } }