Vijava 学习笔记之(Template 克隆虚拟机并指定自定义规范)

源代码:

package com.vmware.template;

import com.vmware.util.Session;
import com.vmware.vim25.*;
import com.vmware.vim25.mo.*;

import java.rmi.RemoteException;

/**
 * 创建虚拟机使用自定义规范
 * @auther 周志刚
 * Created by vixuan-008 on 2015/6/4.
 */
public class TemplateCustomzation {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // vijava
        com.vmware.vim25.mo.VirtualMachine templateVM = null;
        com.vmware.vim25.mo.ResourcePool pool = null;
        com.vmware.vim25.mo.HostSystem system=null;
        com.vmware.vim25.mo.Datastore datastore = null;
        ComputeResource computerResource = null;
        InventoryNavigator inventoryNavigator = null;
        Task task = null;
        ServiceInstance instance = null;


        String templatename="wintem3";
        String poolname="core";
        String hostname="";
        String virtualmachinename="xuniji5";
        String datastorename="local02-2";

        long disksizekb=40*1024*1024;
        String diskmode="persistent";

        // 逻辑处理
        try {
            // Map map = util.getURL();
            String ip = "172.16.1.20";
            String username = "root";
            String password = "vmware";

            instance = Session.getInstance(ip, username, password);
            if(instance!=null){
                System.out.println("vmware 连接成功");
            }else{
                System.out.println("vmware 连接失败,请检查vmware连接相关配置信息");
            }

            Folder rootFolder = instance.getRootFolder();

            inventoryNavigator = new InventoryNavigator(rootFolder);
            try {
                templateVM = (com.vmware.vim25.mo.VirtualMachine) inventoryNavigator
                        .searchManagedEntity("VirtualMachine", templatename);

                if(templateVM!=null){
                    System.out.println("template 查询成功");
                }else{
                    System.out.println("template 查询失败,请仔细检查配置模板是否存在");
                }
            } catch (RemoteException e) {
                e.printStackTrace();
                System.out.println("虚拟机模板文件存在问题:" + e.getMessage());
            }
            try{
                datastore=(com.vmware.vim25.mo.Datastore) inventoryNavigator
                        .searchManagedEntity("Datastore", datastorename);
            }catch (Exception e){
                e.printStackTrace();
                System.out.println("指定Datastore存在问题:" + e.getMessage());
            }

            VirtualMachineRelocateSpec virtualMachineRelocateSpec = new VirtualMachineRelocateSpec();
            if (null != poolname && !"".equals(poolname)) {
                try {
                    pool = (com.vmware.vim25.mo.ResourcePool) inventoryNavigator
                            .searchManagedEntity("ResourcePool", poolname);
                    virtualMachineRelocateSpec.setPool(pool.getMOR());

                    virtualMachineRelocateSpec.setDatastore(datastore.getMOR());
                    if(pool!=null){
                        System.out.println("pool 查询成功");
                    }else{
                        System.out.println("pool 查询失败,请仔细检查配置资源池是否存在");
                    }
                } catch (RemoteException e) {
                    System.out.println("Vcenter资源池存在问题:" + e.getMessage());


                }

            } else {

                try {
                    computerResource = (ComputeResource) inventoryNavigator.searchManagedEntity("ComputeResource", hostname);
                    if(computerResource!=null){
                        if(computerResource.getResourcePool()!=null){
                            virtualMachineRelocateSpec.setPool(computerResource.getResourcePool().getMOR());
                        }
                        virtualMachineRelocateSpec.setDatastore(datastore.getMOR());
                        virtualMachineRelocateSpec.setHost(computerResource.getHosts()[0].getMOR());
                    }


                } catch (RemoteException e) {
                    e.printStackTrace();
                    System.out.println("Vcenter下Esxi存在问题:" + e.getMessage());
                }

            }
            //虚拟机CPU和内存配置信息
            VirtualMachineConfigSpec configSpec = new VirtualMachineConfigSpec();
            // 设置CPU核数
            configSpec.setNumCPUs(4);
            // 设置内存大小
            long memory=2048;
            configSpec.setMemoryMB(memory);
            // 设置虚拟机名称
            configSpec.setName(virtualmachinename);
            // 设置虚拟机描述
            configSpec.setAnnotation("VirtualMachine Annotation");
            //更改磁盘大小
            VirtualDeviceConfigSpec virtualDeviceConfigSpec = new VirtualDeviceConfigSpec();
            VirtualDeviceConfigSpec diskSpec = createDiskSpec(
                    templateVM, "local02-2",
                    disksizekb, diskmode);
            if (diskSpec != null) {
                System.out.println("创建disk不为空");
            } else {
                System.out.println("创建disk为空");
            }



            VirtualMachineCloneSpec cloneSpec = new VirtualMachineCloneSpec();
            cloneSpec.setLocation(virtualMachineRelocateSpec);
            cloneSpec.setPowerOn(true);
            cloneSpec.setTemplate(false);
            cloneSpec.setConfig(configSpec);
            //查询用户自定义规范(重点代码(自定义规范中:定义网卡数量和指定IP地址)和其他相关的配置信息)
         <span style="color:#ff0000;">   CustomizationSpec customizationSpec=getCustomizationSpec(instance,"windows7");
            if(customizationSpec!=null){
                cloneSpec.setCustomization(customizationSpec);
            }</span>


            try {

                task = templateVM.cloneVM_Task((Folder) templateVM.getParent(),
                        virtualmachinename, cloneSpec);
                String result = task.waitForTask();
                if (result.equals(Task.SUCCESS)) {
                    System.out.println("模板生成虚拟机成功");
                } else {
                    System.out.println("模板生成虚拟机失败,请查询Vcenter 上相关日志信息");
                }

            } catch (RemoteException e) {
                System.out.println("创建任务失败:" + e.getMessage());
                if (instance != null) {
                    instance.getServerConnection().logout();
                    System.out.println("存在异常:" + e.getMessage());
                }

            }

        }catch(Exception e){
            e.printStackTrace();
        }

    }

    public static VirtualDeviceConfigSpec createDiskSpec(VirtualMachine vm,String dsName,
                                                         long diskSizeKB, String diskMode) {
        //虚拟磁盘配置信息
        VirtualDeviceConfigSpec diskSpec = new VirtualDeviceConfigSpec();

        VirtualMachineConfigInfo vmConfig = (VirtualMachineConfigInfo)vm.getConfig();
        VirtualDevice[] vds = vmConfig.getHardware().getDevice();
        //虚拟磁盘相关操作
        diskSpec.setOperation(VirtualDeviceConfigSpecOperation.add);
        diskSpec.setFileOperation(VirtualDeviceConfigSpecFileOperation.create);

        VirtualDisk vd = new VirtualDisk();
        vd.setCapacityInKB(diskSizeKB);
        diskSpec.setDevice(vd);
        vd.setKey(0);
        vd.setUnitNumber(0);
        int key = 0;
        for(int k=0;k<vds.length;k++)
        {
            if(vds[k].getDeviceInfo().getLabel().equalsIgnoreCase("SCSI Controller 0"))
            {
                key = vds[k].getKey();
            }
        }
        vd.setControllerKey(key);

        VirtualDiskFlatVer2BackingInfo diskfileBacking = new VirtualDiskFlatVer2BackingInfo();
        String fileName = "[" + dsName + "]";
        diskfileBacking.setFileName(fileName);
        diskfileBacking.setDiskMode(diskMode);
        diskfileBacking.setThinProvisioned(true);
        vd.setBacking(diskfileBacking);
        return diskSpec;
    }

    //查询用户已经创建的自定义规范
    public static CustomizationSpec getCustomizationSpec( ServiceInstance instance,String customizationName){
        CustomizationSpec customizationSpec=null;
        CustomizationSpecItem customizationSpecItem=null;
        com.vmware.vim25.mo.CustomizationSpecManager manager=instance.getCustomizationSpecManager();
        CustomizationSpecInfo[] infos=manager.getInfo();
        if(infos!=null && infos.length>0){
            for(CustomizationSpecInfo info:infos){
                if(info.getName().equalsIgnoreCase(customizationName)){
                    try{
                        customizationSpecItem=manager.getCustomizationSpec(customizationName);
                        customizationSpec=customizationSpecItem.getSpec();
                    }catch (Exception e){
                        e.printStackTrace();
                        return customizationSpec;
                    }

                }
            }
        }
        return customizationSpec;
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值