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.vmware; import java.net.Inet4Address; import java.net.InetAddress; import java.net.UnknownHostException; 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.entity.crud.Farm; import jp.primecloud.auto.entity.crud.ImageVmware; 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.PlatformVmwareInstanceType; import jp.primecloud.auto.entity.crud.User; import jp.primecloud.auto.entity.crud.VmwareInstance; import jp.primecloud.auto.entity.crud.VmwareNetwork; 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 com.vmware.vim25.CustomFieldDef; import com.vmware.vim25.DatastoreSummary; import com.vmware.vim25.GuestNicInfo; import com.vmware.vim25.NetIpConfigInfoIpAddress; import com.vmware.vim25.mo.Datastore; import com.vmware.vim25.mo.Folder; import com.vmware.vim25.mo.ManagedEntity; import com.vmware.vim25.mo.VirtualMachine; /** * <p> * TODO: * </p> * */ public class VmwareMachineProcess extends ServiceSupport { protected String fieldUserName = "UserName"; protected EventLogger eventLogger; protected ProcessLogger processLogger; /** * TODO: * * @param vmwareProcessClient * @param instanceNo * @return */ public boolean cloneVM(VmwareProcessClient vmwareProcessClient, Long instanceNo) { VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); if (StringUtils.isNotEmpty(vmwareInstance.getDatastore())) { // ?????????? return false; } Instance instance = instanceDao.read(instanceNo); ImageVmware imageVmware = imageVmwareDao.read(instance.getImageNo()); // ?? String datastoreName = selectDatastore(vmwareProcessClient, vmwareInstance); // Platform platform = platformDao.read(vmwareProcessClient.getPlatformNo()); processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "VmwareInstanceCreate", new Object[] { platform.getPlatformName(), vmwareInstance.getMachineName() }); // vmwareProcessClient.cloneVM(vmwareInstance.getMachineName(), imageVmware.getTemplateName(), vmwareInstance.getComputeResource(), vmwareInstance.getResourcePool(), datastoreName); // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "VmwareInstanceCreateFinish", new Object[] { platform.getPlatformName(), vmwareInstance.getMachineName() }); // vmwareInstance = vmwareInstanceDao.read(instanceNo); vmwareInstance.setDatastore(datastoreName); vmwareInstanceDao.update(vmwareInstance); return true; } protected String selectDatastore(VmwareProcessClient vmwareProcessClient, VmwareInstance vmwareInstance) { // ???????????????? Datastore datastore = null; long freeSpace = 0L; String datastoreFolderName = vmwareInstance.getComputeResource() + "-storage"; Folder datastoreFolder = vmwareProcessClient.getVmwareClient().search(Folder.class, datastoreFolderName); if (datastoreFolder != null) { ManagedEntity[] entities = vmwareProcessClient.getVmwareClient().searchByType(datastoreFolder, Datastore.class); for (ManagedEntity entity : entities) { Datastore datastore2 = Datastore.class.cast(entity); DatastoreSummary summary2 = datastore2.getSummary(); if (summary2.isAccessible() && freeSpace < summary2.getFreeSpace()) { datastore = datastore2; freeSpace = summary2.getFreeSpace(); } } } if (datastore == null) { // ?????? throw new AutoException("EPROCESS-000528", vmwareInstance.getComputeResource()); } return datastore.getName(); } /** * TODO: * * @param vmwareProcessClient * @param instanceNo */ public void powerOnVM(VmwareProcessClient vmwareProcessClient, Long instanceNo) { VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); // Instance instance = instanceDao.read(instanceNo); Platform platform = platformDao.read(vmwareProcessClient.getPlatformNo()); processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "VmwareInstanceStart", new Object[] { platform.getPlatformName(), vmwareInstance.getMachineName() }); // vmwareProcessClient.powerOnVM(vmwareInstance.getMachineName()); } /** * TODO: * * @param vmwareProcessClient * @param instanceNo */ public void powerOffVM(VmwareProcessClient vmwareProcessClient, Long instanceNo) { VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); // Instance instance = instanceDao.read(instanceNo); Platform platform = platformDao.read(vmwareProcessClient.getPlatformNo()); processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "VmwareInstanceStop", new Object[] { platform.getPlatformName(), vmwareInstance.getMachineName() }); // vmwareProcessClient.powerOffVM(vmwareInstance.getMachineName()); // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "VmwareInstanceStopFinish", new Object[] { platform.getPlatformName(), vmwareInstance.getMachineName() }); // vmwareInstance = vmwareInstanceDao.read(instanceNo); vmwareInstance.setIpAddress(null); vmwareInstance.setPrivateIpAddress(null); vmwareInstanceDao.update(vmwareInstance); } /** * TODO: * * @param vmwareProcessClient * @param instanceNo */ public void shutdownGuest(VmwareProcessClient vmwareProcessClient, Long instanceNo) { VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); // Instance instance = instanceDao.read(instanceNo); Platform platform = platformDao.read(vmwareProcessClient.getPlatformNo()); processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "VmwareInstanceStop", new Object[] { platform.getPlatformName(), vmwareInstance.getMachineName() }); // ? vmwareProcessClient.shutdownGuest(vmwareInstance.getMachineName()); // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "VmwareInstanceStopFinish", new Object[] { platform.getPlatformName(), vmwareInstance.getMachineName() }); // vmwareInstance = vmwareInstanceDao.read(instanceNo); vmwareInstance.setIpAddress(null); vmwareInstance.setPrivateIpAddress(null); vmwareInstanceDao.update(vmwareInstance); } /** * TODO: * * @param vmwareProcessClient * @param instanceNo */ public void destroy(VmwareProcessClient vmwareProcessClient, Long instanceNo) { VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); // Instance instance = instanceDao.read(instanceNo); Platform platform = platformDao.read(vmwareProcessClient.getPlatformNo()); processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "VmwareInstanceDelete", new Object[] { platform.getPlatformName(), vmwareInstance.getMachineName() }); // vmwareProcessClient.destroyVM(vmwareInstance.getMachineName()); // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "VmwareInstanceDeleteFinish", new Object[] { platform.getPlatformName(), vmwareInstance.getMachineName() }); } /** * TODO: * * @param vmwareProcessClient * @param instanceNo */ public void waitForRunning(VmwareProcessClient vmwareProcessClient, Long instanceNo) { VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); // ?? vmwareProcessClient.waitForRunning(vmwareInstance.getMachineName()); } /** * TODO: * * @param vmwareProcessClient * @param instanceNo */ public void getGuestInfo(VmwareProcessClient vmwareProcessClient, Long instanceNo) { Instance instance = instanceDao.read(instanceNo); VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); List<VmwareNetwork> vmwareNetworks = vmwareNetworkDao.readByFarmNo(instance.getFarmNo()); // ????? Platform platform = platformDao.read(instance.getPlatformNo()); PlatformVmware platformVmware = platformVmwareDao.read(instance.getPlatformNo()); String publicNetworkName = platformVmware.getPublicNetwork(); String privateNetworkName = platformVmware.getPrivateNetwork(); for (VmwareNetwork vmwareNetwork : vmwareNetworks) { if (BooleanUtils.isTrue(vmwareNetwork.getPublicNetwork())) { publicNetworkName = vmwareNetwork.getNetworkName(); } else { privateNetworkName = vmwareNetwork.getNetworkName(); } } String publicIpAddress = null; String privateIpAddress = null; VirtualMachine machine = vmwareProcessClient.getVirtualMachine(vmwareInstance.getMachineName()); for (GuestNicInfo nicInfo : machine.getGuest().getNet()) { // NIC?IPv4?? NetIpConfigInfoIpAddress[] tmpAddresses = nicInfo.getIpConfig().getIpAddress(); if (tmpAddresses == null) { continue; } String ipAddress = null; for (NetIpConfigInfoIpAddress tmpAdress : tmpAddresses) { try { InetAddress inetAddress = InetAddress.getByName(tmpAdress.getIpAddress()); if (inetAddress instanceof Inet4Address) { ipAddress = tmpAdress.getIpAddress(); break; } } catch (UnknownHostException ignore) { } } // NIC?Public?Private?? if (publicNetworkName.equals(nicInfo.getNetwork())) { publicIpAddress = ipAddress; } else if (privateNetworkName.equals(nicInfo.getNetwork())) { privateIpAddress = ipAddress; } } if (publicIpAddress == null) { // IP??????? throw new AutoException("EPROCESS-000510", vmwareInstance.getMachineName()); } else if (privateIpAddress == null) { // IP??????? throw new AutoException("EPROCESS-000511", vmwareInstance.getMachineName()); } // processLogger.writeLogSupport(ProcessLogger.LOG_DEBUG, null, instance, "VmwareInstanceStartFinish", new Object[] { platform.getPlatformName(), vmwareInstance.getMachineName() }); // ?? vmwareInstance = vmwareInstanceDao.read(instanceNo); vmwareInstance.setIpAddress(publicIpAddress); vmwareInstance.setPrivateIpAddress(privateIpAddress); vmwareInstanceDao.update(vmwareInstance); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100432", vmwareInstance.getMachineName())); } } /** * TODO: * * @param vmwareProcessClient * @param instanceNo */ public void changeResource(VmwareProcessClient vmwareProcessClient, Long instanceNo) { Instance instance = instanceDao.read(instanceNo); VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); // InstanceType?? PlatformVmwareInstanceType instanceType = null; Platform platform = platformDao.read(instance.getPlatformNo()); if (platform != null && (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType()))) { PlatformVmware platformVmware = platformVmwareDao.read(instance.getPlatformNo()); List<PlatformVmwareInstanceType> instanceTypes = platformVmwareInstanceTypeDao .readByPlatformNo(instance.getPlatformNo()); if (platformVmware != null && instanceTypes.isEmpty() == false) { for (PlatformVmwareInstanceType instanceType2 : instanceTypes) { if (StringUtils.equals(vmwareInstance.getInstanceType(), instanceType2.getInstanceTypeName())) { instanceType = instanceType2; break; } } } } if (instanceType == null) { // InstanceType?????? throw new AutoException("EPROCESS-000512", vmwareInstance.getInstanceType()); } // ? vmwareProcessClient.changeResourceVM(vmwareInstance.getMachineName(), instanceType.getCpu(), instanceType.getMemory()); } /** * TODO: * * @param vmwareProcessClient * @param instanceNo */ public void updateCustomValue(VmwareProcessClient vmwareProcessClient, Long instanceNo) { // ?????? CustomFieldDef customFieldDef = vmwareProcessClient.getCustomFieldDef(fieldUserName, VirtualMachine.class); if (customFieldDef == null) { vmwareProcessClient.addCustomFieldDef(fieldUserName, VirtualMachine.class); } VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); Instance instance = instanceDao.read(instanceNo); Farm farm = farmDao.read(instance.getFarmNo()); User user = userDao.read(farm.getUserNo()); // ? vmwareProcessClient.setCustomValue(vmwareInstance.getMachineName(), fieldUserName, user.getUsername()); } /** * fieldUserName??? * * @param fieldUserName fieldUserName */ public void setFieldUserName(String fieldUserName) { this.fieldUserName = fieldUserName; } /** * eventLogger??? * * @param eventLogger eventLogger */ public void setEventLogger(EventLogger eventLogger) { this.eventLogger = eventLogger; } /** * processLogger??? * * @param processLogger processLogger */ public void setProcessLogger(ProcessLogger processLogger) { this.processLogger = processLogger; } }