/* * 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.vmware; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import jp.primecloud.auto.common.constant.PCCConstant; import jp.primecloud.auto.config.Config; import jp.primecloud.auto.entity.crud.Farm; import jp.primecloud.auto.entity.crud.Instance; import jp.primecloud.auto.entity.crud.Platform; import jp.primecloud.auto.entity.crud.PlatformVmware; import jp.primecloud.auto.entity.crud.VmwareAddress; import jp.primecloud.auto.entity.crud.VmwareInstance; import jp.primecloud.auto.entity.crud.VmwareKeyPair; import jp.primecloud.auto.process.ProcessLogger; import jp.primecloud.auto.service.ServiceSupport; import jp.primecloud.auto.util.MessageUtils; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import com.vmware.vim25.DistributedVirtualPortgroupInfo; import com.vmware.vim25.VirtualDevice; import com.vmware.vim25.VirtualEthernetCard; import com.vmware.vim25.VirtualEthernetCardDistributedVirtualPortBackingInfo; import com.vmware.vim25.VirtualEthernetCardNetworkBackingInfo; import com.vmware.vim25.mo.VirtualMachine; /** * <p> * TODO: クラスコメントを記述 * </p> * */ public class VmwareInitProcess extends ServiceSupport { protected ProcessLogger processLogger; /** * TODO: メソッドコメントを記述 * * @param vmwareProcessClient * @param instanceNo */ public void initialize(VmwareProcessClient vmwareProcessClient, Long instanceNo) { VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); // UserDataの作成 String userData = createUserData(instanceNo); // ExtraConfig Map<String, Object> extraConfigs = new LinkedHashMap<String, Object>(); extraConfigs.put("guestinfo.userdata", userData); // インスタンス情報の設定 vmwareProcessClient.setExtraConfigVM(vmwareInstance.getMachineName(), extraConfigs); } protected String createUserData(Long instanceNo) { Map<String, String> map = createUserDataMap(instanceNo); return convertMapToString(map); } protected String convertMapToString(Map<String, String> map) { if (map.isEmpty()) { return ""; } StringBuilder sb = new StringBuilder(); for (Entry<String, String> entry : map.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); if (key != null && value != null) { sb.append(key).append("=").append(value).append(";"); } } sb.delete(sb.length() - 1, sb.length()); return sb.toString(); } protected Map<String, String> createUserDataMap(Long instanceNo) { Instance instance = instanceDao.read(instanceNo); Farm farm = farmDao.read(instance.getFarmNo()); Map<String, String> map = new HashMap<String, String>(); // DB情報 map.put("instanceName", instance.getInstanceName()); map.put("farmName", farm.getFarmName()); // FQDN String fqdn = instance.getFqdn(); map.put("hostname", fqdn); // 初期スクリプト情報 map.put("scriptserver", Config.getProperty("script.server")); // rsyslogサーバ情報 map.put("rsyslogserver", Config.getProperty("rsyslog.server")); // DNS情報 map.putAll(createDnsUserDataMap(instanceNo)); // Puppet情報 map.putAll(createPuppetUserDataMap(instanceNo)); // VPN情報 Platform platform = platformDao.read(instance.getPlatformNo()); if (platform.getInternal() == false) { // 外部のプラットフォームの場合、VPN情報を含める map.putAll(createVpnUserDataMap(instanceNo)); } // VMware情報 if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) { map.putAll(createVmwareUserDataMap(instanceNo)); } return map; } protected Map<String, String> createDnsUserDataMap(Long instanceNo) { Map<String, String> map = new HashMap<String, String>(); // Primary DNSサーバ map.put("dns", Config.getProperty("dns.server")); // Secondry DNSサーバ String dns2 = Config.getProperty("dns.server2"); if (dns2 != null && dns2.length() > 0) { map.put("dns2", dns2); } // DNSドメイン map.put("dnsdomain", Config.getProperty("dns.domain")); return map; } protected Map<String, String> createPuppetUserDataMap(Long instanceNo) { Map<String, String> map = new HashMap<String, String>(); // PuppetMaster情報 map.put("puppetmaster", Config.getProperty("puppet.masterHost")); return map; } protected Map<String, String> createVpnUserDataMap(Long instanceNo) { Map<String, String> map = new HashMap<String, String>(); // VPN情報のユーザとパスワードをセットする Instance instance = instanceDao.read(instanceNo); map.put("vpnuser", instance.getFqdn()); map.put("vpnuserpass", instance.getInstanceCode()); // VPNサーバ情報 map.put("vpnserver", Config.getProperty("vpn.server")); map.put("vpnport", Config.getProperty("vpn.port")); //map.put("vpnuser", Config.getProperty("vpn.user")); //map.put("vpnuserpass", Config.getProperty("vpn.userpass")); // ZIPパスワード map.put("vpnzippass", Config.getProperty("vpn.zippass")); // OpenVPNクライアント証明書ダウンロード先URL map.put("vpnclienturl", Config.getProperty("vpn.clienturl")); return map; } protected Map<String, String> createVmwareUserDataMap(Long instanceNo) { VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); VmwareKeyPair vmwareKeyPair = vmwareKeyPairDao.read(vmwareInstance.getKeyPairNo()); Map<String, String> map = new HashMap<String, String>(); // 公開鍵 map.put("sshpubkey", vmwareKeyPair.getKeyPublic()); return map; } /** * TODO: メソッドコメントを記述 * * @param vmwareProcessClient * @param instanceNo * @param vmwareNetworkProcess */ public void initializeNetwork(VmwareProcessClient vmwareProcessClient, Long instanceNo, VmwareNetworkProcess vmwareNetworkProcess) { VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); // VirtualMachine VirtualMachine machine = vmwareProcessClient.getVirtualMachine(vmwareInstance.getMachineName()); // ExtraConfig Map<String, Object> extraConfigs = new LinkedHashMap<String, Object>(); // パブリックネットワーク名の取得 PlatformVmware platformVmware = platformVmwareDao.read(vmwareProcessClient.getPlatformNo()); String publicNetworkName = platformVmware.getPublicNetwork(); // パブリックネットワークに相応する分散ポートグループの取得 String publicPortGroup = null; if (StringUtils.isNotEmpty(publicNetworkName)) { DistributedVirtualPortgroupInfo dvPortgroupInfo = vmwareNetworkProcess.getDVPortgroupInfo(machine, publicNetworkName); if (dvPortgroupInfo != null) { publicPortGroup = dvPortgroupInfo.getPortgroupKey(); } } boolean configPublic = false; int i = 1; for (VirtualDevice device : machine.getConfig().getHardware().getDevice()) { if (device instanceof VirtualEthernetCard) { VirtualEthernetCard ethernetCard = (VirtualEthernetCard) device; // ネットワーク名の取得 String networkName = null; if (ethernetCard.getBacking() instanceof VirtualEthernetCardNetworkBackingInfo) { VirtualEthernetCardNetworkBackingInfo backingInfo = (VirtualEthernetCardNetworkBackingInfo) ethernetCard .getBacking(); networkName = backingInfo.getDeviceName(); } // ポートグループ名の取得 String portGroup = null; if (ethernetCard.getBacking() instanceof VirtualEthernetCardDistributedVirtualPortBackingInfo) { VirtualEthernetCardDistributedVirtualPortBackingInfo backingInfo2 = (VirtualEthernetCardDistributedVirtualPortBackingInfo) ethernetCard .getBacking(); portGroup = backingInfo2.getPort().getPortgroupKey(); } Map<String, String> map; if ((StringUtils.isNotEmpty(networkName) && StringUtils.equals(networkName, publicNetworkName)) || (StringUtils.isNotEmpty(portGroup) && StringUtils.equals(portGroup, publicPortGroup))) { // パブリックのイーサネットカードの場合 map = createPublicNetworkData(instanceNo, ethernetCard); configPublic = true; } else { // パブリックのイーサネットカードでない場合は動的IP map = createDhcpNetworkData(ethernetCard); } String networkData = convertMapToString(map); extraConfigs.put("guestinfo.network" + i, networkData); i++; } } // ネットワーク情報の設定 vmwareProcessClient.setExtraConfigVM(vmwareInstance.getMachineName(), extraConfigs); // データベース更新、ログ出力 if (configPublic) { VmwareAddress vmwareAddress = vmwareAddressDao.readByInstanceNo(instanceNo); if (vmwareAddress != null) { if (BooleanUtils.isTrue(vmwareAddress.getEnabled())) { // イベントログ出力 Instance instance = instanceDao.read(instanceNo); processLogger.debug(null, instance, "VmwareNetworkCustomizeStatic", new Object[] { vmwareInstance.getMachineName(), vmwareAddress.getIpAddress() }); if (BooleanUtils.isNotTrue(vmwareAddress.getAssociated())) { // データベース更新 vmwareAddress.setAssociated(true); vmwareAddressDao.update(vmwareAddress); } // ログ出力 if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100445", vmwareInstance.getMachineName(), vmwareAddress.getIpAddress())); } } else { // イベントログ出力 Instance instance = instanceDao.read(instanceNo); processLogger.debug(null, instance, "VmwareNetworkCustomizeDhcp", new Object[] { vmwareInstance.getMachineName() }); if (BooleanUtils.isTrue(vmwareAddress.getAssociated())) { // データベース更新 vmwareAddress.setAssociated(false); vmwareAddressDao.update(vmwareAddress); } // ログ出力 if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100446", vmwareInstance.getMachineName())); } } } } } protected Map<String, String> createPublicNetworkData(Long instanceNo, VirtualEthernetCard ethernetCard) { VmwareAddress vmwareAddress = vmwareAddressDao.readByInstanceNo(instanceNo); if (vmwareAddress == null) { // VmwareAddressがない場合は動的IP return createDhcpNetworkData(ethernetCard); } if (BooleanUtils.isTrue(vmwareAddress.getEnabled())) { // VmwareAddressが有効な場合は静的IP return createStaticNetworkData(ethernetCard, vmwareAddress); } else { // VmwareAddressが無効な場合は動的IP return createDhcpNetworkData(ethernetCard); } } protected Map<String, String> createStaticNetworkData(VirtualEthernetCard ethernetCard, VmwareAddress vmwareAddress) { Map<String, String> map = new HashMap<String, String>(); String macAddress = ethernetCard.getMacAddress().toUpperCase(); map.put("BootProto", "static"); map.put("Mac", macAddress); map.put("IP", vmwareAddress.getIpAddress()); map.put("Netmask", vmwareAddress.getSubnetMask()); map.put("Gateway", vmwareAddress.getDefaultGateway()); return map; } protected Map<String, String> createDhcpNetworkData(VirtualEthernetCard ethernetCard) { Map<String, String> map = new HashMap<String, String>(); map.put("BootProto", "dhcp"); map.put("Mac", ethernetCard.getMacAddress().toUpperCase()); return map; } /** * processLoggerを設定します。 * * @param processLogger processLogger */ public void setProcessLogger(ProcessLogger processLogger) { this.processLogger = processLogger; } }