Java tutorial
/* * Copyright 2014 by SCSK Corporation. * * 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 org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import jp.primecloud.auto.common.constant.PCCConstant; import jp.primecloud.auto.common.status.ZabbixInstanceStatus; import jp.primecloud.auto.config.Config; import jp.primecloud.auto.entity.crud.Component; import jp.primecloud.auto.entity.crud.ComponentInstance; import jp.primecloud.auto.entity.crud.ComponentType; import jp.primecloud.auto.entity.crud.Farm; import jp.primecloud.auto.entity.crud.Image; import jp.primecloud.auto.entity.crud.Instance; import jp.primecloud.auto.entity.crud.Platform; import jp.primecloud.auto.entity.crud.User; import jp.primecloud.auto.entity.crud.ZabbixInstance; import jp.primecloud.auto.exception.AutoException; import jp.primecloud.auto.log.EventLogger; 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 jp.primecloud.auto.zabbix.model.template.Template; /** * <p> * TODO: * </p> * */ public class ZabbixHostProcess extends ServiceSupport { protected ZabbixProcessClientFactory zabbixProcessClientFactory; protected EventLogger eventLogger; protected ProcessLogger processLogger; public void startHost(Long instanceNo) { ZabbixInstance zabbixInstance = zabbixInstanceDao.read(instanceNo); if (zabbixInstance == null) { // Zabbix??? throw new AutoException("EPROCESS-000401", instanceNo); } Instance instance = instanceDao.read(instanceNo); Platform platform = platformDao.read(instance.getPlatformNo()); // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100301", instanceNo, instance.getInstanceName())); } ZabbixProcessClient zabbixProcessClient = zabbixProcessClientFactory.createZabbixProcessClient(); String hostid = zabbixInstance.getHostid(); log.info("********hostid:" + hostid); //??? String hostname = getHostName(instance.getFqdn()); //IP/DNS? Boolean useIp = BooleanUtils.toBooleanObject(Config.getProperty("zabbix.useIp")); //ZabbixID? String proxyHostid = getProxyHostid(zabbixProcessClient); //IP String zabbixListenIp = getZabbixListenIp(zabbixProcessClient, instance, platform); if (StringUtils.isEmpty(hostid)) { List<Hostgroup> hostgroups = getInitHostgroups(zabbixProcessClient, instance); // ? hostid = zabbixProcessClient.createHost(hostname, instance.getFqdn(), hostgroups, true, useIp, zabbixListenIp, proxyHostid); // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "ZabbixRegist", new Object[] { instance.getFqdn(), hostid }); // ? zabbixInstance.setHostid(hostid); zabbixInstance.setStatus(ZabbixInstanceStatus.MONITORING.toString()); zabbixInstanceDao.update(zabbixInstance); } else { // ? zabbixProcessClient.updateHost(hostid, hostname, instance.getFqdn(), null, true, useIp, zabbixListenIp, proxyHostid); // ? zabbixInstance.setStatus(ZabbixInstanceStatus.MONITORING.toString()); zabbixInstanceDao.update(zabbixInstance); // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "ZabbixStart", new Object[] { instance.getFqdn(), hostid }); } // ?? Image image = imageDao.read(instance.getImageNo()); String templateName = image.getZabbixTemplate(); if (StringUtils.isEmpty(templateName)) { // TODO: ?????????? templateName = Config.getProperty("zabbix.basetemplate"); } Template template = zabbixProcessClient.getTemplateByName(templateName); boolean ret = zabbixProcessClient.addTemplate(hostid, template); if (ret) { // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "ZabbixTemplateAdd", new Object[] { instance.getFqdn(), templateName }); } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100302", instanceNo, instance.getInstanceName())); } } public void stopHost(Long instanceNo) { ZabbixInstance zabbixInstance = zabbixInstanceDao.read(instanceNo); if (zabbixInstance == null) { // Zabbix??? throw new AutoException("EPROCESS-000401", instanceNo); } if (StringUtils.isEmpty(zabbixInstance.getHostid())) { // ??????? return; } Instance instance = instanceDao.read(instanceNo); // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100303", instanceNo, instance.getInstanceName())); } ZabbixProcessClient zabbixProcessClient = zabbixProcessClientFactory.createZabbixProcessClient(); // ? try { //??? String hostname = getHostName(instance.getFqdn()); //IP/DNS? Boolean useIp = BooleanUtils.toBooleanObject(Config.getProperty("zabbix.useIp")); //ZabbixID? String proxyHostid = getProxyHostid(zabbixProcessClient); zabbixProcessClient.updateHost(zabbixInstance.getHostid(), hostname, instance.getFqdn(), null, false, useIp, null, proxyHostid); // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "ZabbixStop", new Object[] { instance.getFqdn(), zabbixInstance.getHostid() }); // ? zabbixInstance.setStatus(ZabbixInstanceStatus.UN_MONITORING.toString()); zabbixInstanceDao.update(zabbixInstance); } catch (AutoException ignore) { // ??????? log.warn(ignore.getMessage()); } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100304", instanceNo, instance.getInstanceName())); } } public void startTemplate(Long instanceNo, Long componentNo) { ZabbixInstance zabbixInstance = zabbixInstanceDao.read(instanceNo); if (zabbixInstance == null) { // Zabbix??? throw new AutoException("EPROCESS-000401", instanceNo); } if (StringUtils.isEmpty(zabbixInstance.getHostid())) { // ?????? throw new AutoException("EPROCESS-000404", instanceNo); } Instance instance = instanceDao.read(instanceNo); // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100305", instanceNo, instance.getInstanceName())); } Component component = componentDao.read(componentNo); ZabbixProcessClient zabbixProcessClient = zabbixProcessClientFactory.createZabbixProcessClient(); // ? startTemplateHostgroup(zabbixProcessClient, instance, component, zabbixInstance.getHostid()); // ? ComponentType componentType = componentTypeDao.read(component.getComponentTypeNo()); String templateName = componentType.getZabbixTemplate(); if (StringUtils.isNotEmpty(templateName)) { // ? Template template = zabbixProcessClient.getTemplateByName(templateName); // ? boolean ret = zabbixProcessClient.addTemplate(zabbixInstance.getHostid(), template); if (ret) { // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, component, instance, "ZabbixTemplateAdd", new Object[] { instance.getFqdn(), templateName }); } // ????? boolean ret2 = zabbixProcessClient.enableItems(zabbixInstance.getHostid(), template.getTemplateid()); if (ret2) { // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, component, instance, "ZabbixItemEnable", new Object[] { instance.getFqdn(), templateName }); } } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100306", instanceNo, instance.getInstanceName())); } } public void stopTemplate(Long instanceNo, Long componentNo) { ZabbixInstance zabbixInstance = zabbixInstanceDao.read(instanceNo); if (zabbixInstance == null) { // Zabbix??? throw new AutoException("EPROCESS-000401", instanceNo); } if (StringUtils.isEmpty(zabbixInstance.getHostid())) { // ?????? throw new AutoException("EPROCESS-000404", instanceNo); } Component component = componentDao.read(componentNo); ComponentType componentType = componentTypeDao.read(component.getComponentTypeNo()); String templateName = componentType.getZabbixTemplate(); if (StringUtils.isEmpty(templateName)) { // ????????????? return; } Instance instance = instanceDao.read(instanceNo); // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100305", instanceNo, instance.getInstanceName())); } ZabbixProcessClient zabbixProcessClient = zabbixProcessClientFactory.createZabbixProcessClient(); // ? Template template = zabbixProcessClient.getTemplateByName(templateName); // ????? boolean ret = zabbixProcessClient.disableItems(zabbixInstance.getHostid(), template.getTemplateid()); if (ret) { // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, component, instance, "ZabbixItemDisable", new Object[] { instance.getFqdn(), templateName }); } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100306", instanceNo, instance.getInstanceName())); } } public void removeTemplate(Long instanceNo, Long componentNo) { ZabbixInstance zabbixInstance = zabbixInstanceDao.read(instanceNo); if (zabbixInstance == null) { // Zabbix??? throw new AutoException("EPROCESS-000401", instanceNo); } if (StringUtils.isEmpty(zabbixInstance.getHostid())) { // ?????????? return; } Component component = componentDao.read(componentNo); ComponentType componentType = componentTypeDao.read(component.getComponentTypeNo()); String templateName = componentType.getZabbixTemplate(); if (StringUtils.isEmpty(templateName)) { // ???????? return; } Instance instance = instanceDao.read(instanceNo); // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100305", instanceNo, instance.getInstanceName())); } ZabbixProcessClient zabbixProcessClient = zabbixProcessClientFactory.createZabbixProcessClient(); // ? Template template = zabbixProcessClient.getTemplateByName(templateName); // boolean ret = zabbixProcessClient.removeTemplate(zabbixInstance.getHostid(), template); if (ret) { // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, component, instance, "ZabbixTemplateRemove", new Object[] { instance.getFqdn(), templateName }); } // boolean ret2 = zabbixProcessClient.deleteItems(zabbixInstance.getHostid(), template.getTemplateid()); if (ret2) { // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, component, instance, "ZabbixItemDelete", new Object[] { instance.getFqdn(), templateName }); } // ? removeTemplateHostgroup(zabbixProcessClient, instance, component, zabbixInstance.getHostid()); // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100306", instanceNo, instance.getInstanceName())); } } public void createComponentHostgroup(Long componentNo) { Component component = componentDao.read(componentNo); Farm farm = farmDao.read(component.getFarmNo()); User user = userDao.read(farm.getUserNo()); String hostgroupName = getHostgroupName(user, farm, component); ZabbixProcessClient zabbixProcessClient = zabbixProcessClientFactory.createZabbixProcessClient(); Hostgroup hostgroup = zabbixProcessClient.getHostgroupByName(hostgroupName); if (hostgroup != null) { // ??????????? return; } zabbixProcessClient.createHostgroup(hostgroupName); } public void createFarmHostgroup(Long farmNo) { Farm farm = farmDao.read(farmNo); User user = userDao.read(farm.getUserNo()); String hostgroupName = getHostgroupName(user, farm); ZabbixProcessClient zabbixProcessClient = zabbixProcessClientFactory.createZabbixProcessClient(); Hostgroup hostgroup = zabbixProcessClient.getHostgroupByName(hostgroupName); if (hostgroup != null) { // ??????????? return; } zabbixProcessClient.createHostgroup(hostgroupName); } public void deleteFarmHostgroup(Long farmNo) { Farm farm = farmDao.read(farmNo); User user = userDao.read(farm.getUserNo()); String hostgroupName = user.getUsername() + "_" + farm.getFarmName(); ZabbixProcessClient zabbixProcessClient = zabbixProcessClientFactory.createZabbixProcessClient(); Hostgroup hostgroup = zabbixProcessClient.getHostgroupByName(hostgroupName); if (hostgroup != null) { // ???? zabbixProcessClient.deleteHostgroup(hostgroup.getGroupid(), hostgroupName); } // ????? String prefix = hostgroupName + "_"; List<Hostgroup> hostgroups = zabbixProcessClient.getHostgroups(); for (Hostgroup hostgroup2 : hostgroups) { if (StringUtils.startsWith(hostgroup2.getName(), prefix)) { zabbixProcessClient.deleteHostgroup(hostgroup2.getGroupid(), hostgroup2.getName()); } } } protected String getHostgroupName(User user) { return getHostgroupName(user, null); } protected String getHostgroupName(User user, Farm farm) { return getHostgroupName(user, farm, null); } protected String getHostgroupName(User user, Farm farm, Component component) { String delimiter = "_"; StringBuilder sb = new StringBuilder(); sb.append(user.getUsername()); if (farm != null) { sb.append(delimiter); sb.append(farm.getFarmName()); } if (component != null) { sb.append(delimiter); sb.append(component.getComponentName()); } // 64?? // TODO: Zabbix??? if (sb.length() <= 64) { return sb.toString(); } else { return sb.substring(0, 64); } } protected List<Hostgroup> getInitHostgroups(ZabbixProcessClient zabbixProcessClient, Instance instance) { Farm farm = farmDao.read(instance.getFarmNo()); 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; } protected void startTemplateHostgroup(ZabbixProcessClient zabbixProcessClient, Instance instance, Component component, String hostid) { // ???? List<Hostgroup> hostgroups = zabbixProcessClient.getHostgroupsByHostid(hostid); List<String> groupids = new ArrayList<String>(); for (Hostgroup hostgroup : hostgroups) { groupids.add(hostgroup.getGroupid()); } // ?????? Farm farm = farmDao.read(instance.getFarmNo()); User user = userDao.read(farm.getUserNo()); Platform platform = platformDao.read(instance.getPlatformNo()); String hostgroupName = getHostgroupName(user, farm, component); Hostgroup hostgroup = zabbixProcessClient.getHostgroupByName(hostgroupName); // ??????????? if (hostgroup != null && !groupids.contains(hostgroup.getGroupid())) { hostgroups.add(hostgroup); //??? String hostname = getHostName(instance.getFqdn()); //IP/DNS? Boolean useIp = BooleanUtils.toBooleanObject(Config.getProperty("zabbix.useIp")); //ZabbixID? String proxyHostid = getProxyHostid(zabbixProcessClient); //IP String zabbixListenIp = getZabbixListenIp(zabbixProcessClient, instance, platform); zabbixProcessClient.updateHost(hostid, hostname, instance.getFqdn(), hostgroups, null, useIp, zabbixListenIp, proxyHostid); } } protected void removeTemplateHostgroup(ZabbixProcessClient zabbixProcessClient, Instance instance, Component component, String hostid) { // ???? List<Hostgroup> hostgroups = zabbixProcessClient.getHostgroupsByHostid(hostid); List<String> groupids = new ArrayList<String>(); for (Hostgroup hostgroup : hostgroups) { groupids.add(hostgroup.getGroupid()); } // ??????? Farm farm = farmDao.read(instance.getFarmNo()); User user = userDao.read(farm.getUserNo()); Platform platform = platformDao.read(instance.getPlatformNo()); String hostgroupName = getHostgroupName(user, farm, component); // ???????????????????? // TODO: ????64??Zabbix???? List<ComponentInstance> componentInstances = componentInstanceDao .readByInstanceNo(instance.getInstanceNo()); for (ComponentInstance componentInstance : componentInstances) { if (component.getComponentNo().equals(componentInstance.getComponentNo())) { continue; } Component component2 = componentDao.read(componentInstance.getComponentNo()); String hostgroupName2 = getHostgroupName(user, farm, component2); if (StringUtils.equals(hostgroupName, hostgroupName2)) { return; } } // ? Hostgroup hostgroup = zabbixProcessClient.getHostgroupByName(hostgroupName); // ???????? if (hostgroup != null && groupids.contains(hostgroup.getGroupid())) { for (int i = 0; i < hostgroups.size(); i++) { if (StringUtils.equals(hostgroup.getGroupid(), hostgroups.get(i).getGroupid())) { hostgroups.remove(i); break; } } //??? String hostname = getHostName(instance.getFqdn()); //IP/DNS? Boolean useIp = BooleanUtils.toBooleanObject(Config.getProperty("zabbix.useIp")); //ZabbixID? String proxyHostid = getProxyHostid(zabbixProcessClient); //IP String zabbixListenIp = getZabbixListenIp(zabbixProcessClient, instance, platform); zabbixProcessClient.updateHost(hostid, hostname, instance.getFqdn(), hostgroups, null, useIp, zabbixListenIp, proxyHostid); } } private String getHostName(String fqdn) { // Zabbix?????? prefix + _ + FQDN ?? // prefix?config.properties?? String hostname = fqdn; if (StringUtils.isNotEmpty(Config.getProperty("zabbix.prefix"))) { //pretix??????? //????????FQDN hostname = Config.getProperty("zabbix.prefix") + "-" + fqdn; } return hostname; } private String getProxyHostid(ZabbixProcessClient zabbixProcessClient) { String proxyName = Config.getProperty("zabbix.proxy"); String proxyHostid = null; if (StringUtils.isNotEmpty(proxyName)) { Proxy proxy = zabbixProcessClient.getProxy(proxyName); if (proxy != null) { proxyHostid = proxy.getProxyid(); } } return proxyHostid; } private String getZabbixListenIp(ZabbixProcessClient zabbixProcessClient, Instance instance, Platform platform) { String zabbixListenIp = instance.getPublicIp(); if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) { if (BooleanUtils.isTrue(platform.getInternal())) { // ?AWS???privateIp???? // ???????? // Eucalyptus // AWS // ?VPC(VPC+VPN???) zabbixListenIp = instance.getPrivateIp(); } } return zabbixListenIp; } /** * zabbixProcessClientFactory??? * * @param zabbixProcessClientFactory zabbixProcessClientFactory */ public void setZabbixProcessClientFactory(ZabbixProcessClientFactory zabbixProcessClientFactory) { this.zabbixProcessClientFactory = zabbixProcessClientFactory; } /** * eventLogger??? * * @param eventLogger eventLogger */ public void setEventLogger(EventLogger eventLogger) { this.eventLogger = eventLogger; } /** * processLogger??? * * @param processLogger processLogger */ public void setProcessLogger(ProcessLogger processLogger) { this.processLogger = processLogger; } }