jp.primecloud.auto.process.vmware.VmwareCustomizeProcess.java Source code

Java tutorial

Introduction

Here is the source code for jp.primecloud.auto.process.vmware.VmwareCustomizeProcess.java

Source

package jp.primecloud.auto.process.vmware;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import jp.primecloud.auto.common.component.PasswordEncryptor;
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.Image;
import jp.primecloud.auto.entity.crud.Instance;
import jp.primecloud.auto.entity.crud.PccSystemInfo;
import jp.primecloud.auto.entity.crud.User;
import jp.primecloud.auto.entity.crud.VmwareInstance;
import jp.primecloud.auto.exception.AutoException;
import jp.primecloud.auto.service.ServiceSupport;
import jp.primecloud.auto.util.MessageUtils;
import jp.primecloud.auto.vmware.VmwareClient;
import com.vmware.vim25.CustomizationAdapterMapping;
import com.vmware.vim25.CustomizationDhcpIpGenerator;
import com.vmware.vim25.CustomizationFixedName;
import com.vmware.vim25.CustomizationGlobalIPSettings;
import com.vmware.vim25.CustomizationGuiUnattended;
import com.vmware.vim25.CustomizationIPSettings;
import com.vmware.vim25.CustomizationIdentification;
import com.vmware.vim25.CustomizationLicenseDataMode;
import com.vmware.vim25.CustomizationLicenseFilePrintData;
import com.vmware.vim25.CustomizationPassword;
import com.vmware.vim25.CustomizationSpec;
import com.vmware.vim25.CustomizationSysprep;
import com.vmware.vim25.CustomizationSysprepRebootOption;
import com.vmware.vim25.CustomizationUserData;
import com.vmware.vim25.CustomizationWinOptions;
import com.vmware.vim25.VirtualDevice;
import com.vmware.vim25.VirtualEthernetCard;
import com.vmware.vim25.VirtualMachineConfigInfo;
import com.vmware.vim25.mo.VirtualMachine;

public class VmwareCustomizeProcess extends ServiceSupport {

    protected String windowsFullName = StringUtils.defaultIfEmpty(Config.getProperty("vmware.windowsFullName"),
            "PCC");

    protected String windowsOrgName = StringUtils.defaultIfEmpty(Config.getProperty("vmware.windowsOrgName"),
            "PCC");

    protected String windowsWorkgroup = StringUtils.defaultIfEmpty(Config.getProperty("vmware.windowsWorkgroup"),
            "WORKGROUP");

    public void customize(VmwareProcessClient vmwareProcessClient, Long instanceNo) {
        VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo);
        VmwareClient vmwareClient = vmwareProcessClient.getVmwareClient();

        // VirtualMachine
        VirtualMachine machine = vmwareClient.search(VirtualMachine.class, vmwareInstance.getMachineName());
        if (machine == null) {
            // ??????
            throw new AutoException("EPROCESS-000501", vmwareInstance.getMachineName());
        }

        // Windows??OS??
        Instance instance = instanceDao.read(instanceNo);
        Image image = imageDao.read(instance.getImageNo());
        if (StringUtils.startsWith(image.getOs(), PCCConstant.OS_NAME_WIN)) {
            if (log.isInfoEnabled()) {
                log.info(MessageUtils.getMessage("IPROCESS-100464", vmwareInstance.getMachineName()));
            }
            customizeWindows(vmwareProcessClient, vmwareInstance, machine);

            vmwareProcessClient.powerOnVM(vmwareInstance.getMachineName());

            vmwareProcessClient.waitForStopped(vmwareInstance.getMachineName());

            vmwareProcessClient.powerOnVM(vmwareInstance.getMachineName());

            vmwareProcessClient.waitForRunning(vmwareInstance.getMachineName());

            vmwareProcessClient.shutdownGuest(vmwareInstance.getMachineName());

            if (log.isInfoEnabled()) {
                log.info(MessageUtils.getMessage("IPROCESS-100465", vmwareInstance.getMachineName()));
            }
        }

    }

    protected void customizeWindows(VmwareProcessClient vmwareProcessClient, VmwareInstance vmwareInstance,
            VirtualMachine machine) {
        CustomizationSpec customSpec = new CustomizationSpec();

        // Windows
        CustomizationSysprep identity = new CustomizationSysprep();

        CustomizationGuiUnattended guiUnattended = new CustomizationGuiUnattended();
        guiUnattended.setAutoLogon(false);
        guiUnattended.setAutoLogonCount(1);
        guiUnattended.setTimeZone(235);
        CustomizationPassword password = new CustomizationPassword();
        password.setPlainText(true);

        // Admin????
        Instance instance = instanceDao.read(vmwareInstance.getInstanceNo());
        Farm farm = farmDao.read(instance.getFarmNo());
        User user = userDao.read(farm.getUserNo());
        PccSystemInfo pccSystemInfo = pccSystemInfoDao.read();
        if (pccSystemInfo == null) {
            // PCC_SYSTEM_INFO??????
            log.error(MessageUtils.getMessage("EPROCESS-000532"));
            throw new AutoException("EPROCESS-000532");
        }
        PasswordEncryptor encryptor = new PasswordEncryptor();
        String decryptPassword = encryptor.decrypt(user.getPassword(), pccSystemInfo.getSecretKey());
        password.setValue(decryptPassword);
        guiUnattended.setPassword(password);
        identity.setGuiUnattended(guiUnattended);

        CustomizationUserData userData = new CustomizationUserData();
        userData.setProductId("");
        userData.setFullName(windowsFullName);
        userData.setOrgName(windowsOrgName);
        CustomizationFixedName computerName = new CustomizationFixedName();
        computerName.setName(instance.getInstanceName());
        userData.setComputerName(computerName);
        identity.setUserData(userData);

        CustomizationIdentification identification = new CustomizationIdentification();
        identification.setJoinWorkgroup(windowsWorkgroup);
        identity.setIdentification(identification);

        // Windows Server 2000, 2003???
        CustomizationLicenseFilePrintData printData = new CustomizationLicenseFilePrintData();
        printData.setAutoMode(CustomizationLicenseDataMode.perSeat);
        identity.setLicenseFilePrintData(printData);

        customSpec.setIdentity(identity);

        // Windows
        CustomizationWinOptions options = new CustomizationWinOptions();
        options.setChangeSID(true);
        options.setReboot(CustomizationSysprepRebootOption.shutdown);
        customSpec.setOptions(options);

        // ?
        CustomizationGlobalIPSettings globalIpSettings = new CustomizationGlobalIPSettings();

        // DNS?
        List<String> dnsServerList = new ArrayList<String>();
        // Primary DNS?
        dnsServerList.add(Config.getProperty("dns.server"));
        // Secondry DNS?
        String dns2 = Config.getProperty("dns.server2");
        if (dns2 != null && dns2.length() > 0) {
            dnsServerList.add(Config.getProperty("dns.server2"));
        }

        globalIpSettings.setDnsServerList(dnsServerList.toArray(new String[dnsServerList.size()]));
        List<String> dnsSuffixList = new ArrayList<String>();
        dnsSuffixList.add(farm.getDomainName());
        globalIpSettings.setDnsSuffixList(dnsSuffixList.toArray(new String[dnsSuffixList.size()]));
        customSpec.setGlobalIPSettings(globalIpSettings);

        // NIC
        List<CustomizationAdapterMapping> nicSettingMap = createCustomizationAdapterMappings(vmwareProcessClient,
                machine);
        customSpec.setNicSettingMap(nicSettingMap.toArray(new CustomizationAdapterMapping[nicSettingMap.size()]));

        vmwareProcessClient.customize(vmwareInstance.getMachineName(), customSpec);

    }

    protected List<CustomizationAdapterMapping> createCustomizationAdapterMappings(
            VmwareProcessClient vmwareProcessClient, VirtualMachine machine) {

        List<CustomizationAdapterMapping> nicSettingMap = new ArrayList<CustomizationAdapterMapping>();

        // VirtualEthernetCard?
        VirtualMachineConfigInfo configInfo = machine.getConfig();
        for (VirtualDevice device : configInfo.getHardware().getDevice()) {
            if (device instanceof VirtualEthernetCard) {
                VirtualEthernetCard virtualEthernetCard = VirtualEthernetCard.class.cast(device);
                CustomizationAdapterMapping mapping = new CustomizationAdapterMapping();
                CustomizationIPSettings settings = new CustomizationIPSettings();

                // ????NICDHCP??
                CustomizationDhcpIpGenerator dhcpIp = new CustomizationDhcpIpGenerator();
                settings.setIp(dhcpIp);

                mapping.setMacAddress(virtualEthernetCard.getMacAddress());
                mapping.setAdapter(settings);
                nicSettingMap.add(mapping);
            }
        }

        return nicSettingMap;
    }

}