Vijava (更改虚拟机配置信息(内存、CPU和添加新磁盘)终极版本)

2023-11-12

package com.vmware.server;

import java.util.List;
import java.util.Map;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import com.vmware.pojo.VirtualMachineConfig;
import com.vmware.util.DataBase;
import com.vmware.util.Session;
import com.vmware.util.StringRandom;
import com.vmware.util.VmwareUtil;
import com.vmware.vim25.VirtualDevice;
import com.vmware.vim25.VirtualDeviceConfigSpec;
import com.vmware.vim25.VirtualDeviceConfigSpecFileOperation;
import com.vmware.vim25.VirtualDeviceConfigSpecOperation;
import com.vmware.vim25.VirtualDisk;
import com.vmware.vim25.VirtualDiskFlatVer2BackingInfo;
import com.vmware.vim25.VirtualMachineConfigSpec;
import com.vmware.vim25.VirtualMachinePowerState;
import com.vmware.vim25.mo.Folder;
import com.vmware.vim25.mo.InventoryNavigator;
import com.vmware.vim25.mo.ServiceInstance;
import com.vmware.vim25.mo.Task;
import com.vmware.vim25.mo.VirtualMachine;

/**
 * VirtualMachineConfigServer:虚拟机配置更改服务
 **/

public class VirtualMachineConfigServer {
	public static Logger logger = Logger
			.getLogger(VirtualMachineConfigServer.class);

	//
	public void vmConfig(List<VirtualMachineConfig> list) {
		// 自定义工具栏
		VmwareUtil util = new VmwareUtil();
		// 日志处理
		SimpleLayout layout = new SimpleLayout();
		FileAppender appender = null;
		try {
			appender = new FileAppender(layout, "log.txt", false);
		} catch (Exception e) {
		}
		logger.addAppender(appender);
		// 逻辑处理
		try {
			Map map = util.getURL();
			String ip = String.valueOf(map.get("ip"));
			String username = String.valueOf(map.get("username"));
			String password = String.valueOf(map.get("password"));

			if (list.size() > 0 && list != null) {
				for (VirtualMachineConfig config : list) {
					ServiceInstance instance = Session.getInstance(ip,
							username, password);
					if (instance != null) {
						logger.debug("vmware 连接成功");
					} else {
						logger.debug("vmware 连接失败,请检查vmware连接相关配置信息");
					}
					Folder rootFolder = instance.getRootFolder();
					InventoryNavigator inventoryNavigator = new InventoryNavigator(
							rootFolder);
					try {
						com.vmware.vim25.mo.VirtualMachine VM = (com.vmware.vim25.mo.VirtualMachine) inventoryNavigator
								.searchManagedEntity("VirtualMachine",
										config.getXnjName());
						if (VM != null) {
							logger.debug("虚拟机 查询成功");
						} else {
							logger.debug("虚拟机 查询失败,请仔细检查配置模板是否存在");
						}
						if(!VM.getRuntime().getPowerState().name().equalsIgnoreCase(VirtualMachinePowerState.poweredOff.name())){
							Task tasks = VM.powerOffVM_Task();
							tasks.waitForTask();							
						}
						// 修改虚拟机相关配置属性
						VirtualMachineConfigSpec configSpec = new VirtualMachineConfigSpec();
						// 设置CPU核数
						configSpec
								.setNumCPUs(Integer.parseInt(config.getCpu()));
						// 设置内存大小
						configSpec.setMemoryMB((long) Integer.parseInt(config
								.getRam()));
						  int diskSize = Integer.parseInt(config.getRl())*1024*1024;
				            // mode: persistent|independent_persistent,independent_nonpersistent
				            String diskMode = "persistent";				         
				            VirtualDeviceConfigSpec vdiskSpec = createDiskSpec(config.getDsName(),diskSize, diskMode,VM);
				            VirtualDeviceConfigSpec[] vdiskSpecArray = {vdiskSpec};
				            configSpec.setDeviceChange(vdiskSpecArray);

					
						Task task = VM.reconfigVM_Task(configSpec);
						String result = task.waitForTask();
						if (result.equals(Task.SUCCESS)) {
							logger.debug("模板生成虚拟机成功");
							logger.debug("模板生成虚拟机成功");
							System.out.println("flwId:"+config.getFlwId());
							String sql = "update tb_flw_content set `status`='3' where `flw_id`='"
									+ config.getFlwId() + "'";
							DataBase.update(sql);
							String deleteAll = "update tb_flw_content set `status`='6' where `flw_id`='"
									+ config.getFlwId() + "'";
							DataBase.update(deleteAll);
						} else {
							logger.debug("模板生成虚拟机失败,请查询Vcenter 上相关日志信息");
						}
						instance.getServerConnection().logout();

					} catch (Exception e) {
						logger.debug("template 查询失败,请仔细检查配置模板是否存在");
						instance.getServerConnection().logout();
						break;
					}
				}

			}
		} catch (Exception e) {
		}
	}

	public static VirtualDeviceConfigSpec createDiskSpec(String dsName, long diskSizeKB, String diskMode, VirtualMachine vm)
			 {
		VirtualDeviceConfigSpec diskSpec = new VirtualDeviceConfigSpec();
		diskSpec.setOperation(VirtualDeviceConfigSpecOperation.add);
		diskSpec.setFileOperation(VirtualDeviceConfigSpecFileOperation.create);
		VirtualDisk vd = new VirtualDisk();
		vd.setCapacityInKB(diskSizeKB);
		diskSpec.setDevice(vd);
		vd.setKey(getkey(vm));
		vd.setUnitNumber(getUnitNumber(vm));
		vd.setControllerKey(getcontrollerkey(vm));
		VirtualDiskFlatVer2BackingInfo diskfileBacking = new VirtualDiskFlatVer2BackingInfo();
		String diskName=StringRandom.getStringRandom(12);
		String fileName = "["+ dsName +"] "+ vm.getName() + "/" + diskName + ".vmdk";
		diskfileBacking.setFileName(fileName);
		diskfileBacking.setDiskMode(diskMode);
		diskfileBacking.setThinProvisioned(true);
		vd.setBacking(diskfileBacking);
		return diskSpec;
	}

	// 获取虚拟机磁盘管理的controlerkey
	public static int getcontrollerkey(VirtualMachine vm) {
		int controllerkey = 0;
		if (vm != null) {
			VirtualDevice[] devices = vm.getConfig().getHardware().getDevice();
			if (devices != null && devices.length > 0) {
				for (int i = 0; i < devices.length; i++) {
					VirtualDevice device = devices[i];
					if (device instanceof VirtualDisk) {
						controllerkey = device.getControllerKey();
					}
				}
			}
		}
		return controllerkey;
	}

	// 获取虚拟机已生成key
	public static int getkey(VirtualMachine vm) {
		int key = 0;
		if (vm != null) {
			VirtualDevice[] devices = vm.getConfig().getHardware().getDevice();
			if (devices != null && devices.length > 0) {
				for (int i = 0; i < devices.length; i++) {
					VirtualDevice device = devices[i];
					if (device instanceof VirtualDisk) {
						key = device.getKey();
					}
				}
			}
		}
		key = key + 1;
		return key;
	}

	// 获取虚拟机已生成UnitNumber
	public static int getUnitNumber(VirtualMachine vm) {
		int UnitNumber = 0;
		if (vm != null) {
			VirtualDevice[] devices = vm.getConfig().getHardware().getDevice();
			if (devices != null && devices.length > 0) {
				for (int i = 0; i < devices.length; i++) {
					VirtualDevice device = devices[i];
					if (device instanceof VirtualDisk) {
						UnitNumber = device.getUnitNumber();
					}
				}
			}
		}
		UnitNumber = UnitNumber + 1;
		return UnitNumber;
	}

}
以上代码是 核心代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vijava (更改虚拟机配置信息(内存、CPU和添加新磁盘)终极版本) 的相关文章

  • Android:年过35岁的程序员还有出路吗,rxjava面试题

    通过上面网友们的分析 其实大家也看的出一个情况 领导选择用你的标准之一 一定是能力的大小 如果技术过硬 年龄从来不会是第一标准 还记得你第一次写代码的时候吗 那种难以抗拒的兴奋和激动 你说你不如年轻人敏捷了 不如他们聪明了 都不是 只是因为
  • C++转换函数

    一 定义 转换构造函数是将其他类型转化为当前class类型 反之 就是转换函数 转换函数的定义格式 operator type TODO return data operator 是 C 关键字 type 是要转换的目标类型 data 是要
  • 【学习笔记】编程规约

    概述 阿里Java开发手册对编程规约 异常日志 单元测试 安全规约 MySQL数据库 工程结构 设计规约进行了规范并且进行了开源 整个手册针对java程序的诞生过程进行较为全面的规范 并且有插件 P3C 进行检查 结尾附地址 即使不是jav

随机推荐

  • 剑指offer_第3题_从尾到头打印链表

    题目描述 输入一个链表 按链表值从尾到头的顺序返回一个ArrayList 链表结构 class ListNode def init self x self val x self next None 理解 什么是链表 python数据结构之链
  • C语言从字符串中提取数字

    利用正则表达式 参考 http blog csdn net yangbingzhou article details 51352648 include
  • 使用AD(Altium Designer)三年的笔记(虽然很口语化,但是好记性不如烂笔头嘛~开熏)

    AD使用心得 1 放置过孔阵列 首先在边角或中间放置一个过孔 选中此过孔 高亮显示 Ctrl C 此时光标变为大十字 将十字放在过孔的中心 左键 编辑 特殊粘贴 在弹出的复选框中选择前两项 2 怎样将PCB板的四个角画成圆弧形 Keepou
  • RXJS部分操作符解释

    RXJS部分操作符解释 div div
  • ftp服务器vsftpd的安装与配置[ubuntu, linux]

    Ubuntu下Ftp的软件有好多种 google一下 各种的一些大致特点 wu Ftp 比较老牌 但针对它的攻击比较多 设置比较麻烦 但功能比较强大 proFtpd 能实现wu Ftp以及server U的所有功能 安全性也较高 但比起vc
  • 重磅!最全面最好用的保险行业数据解决方案全面上线!

    随着数字化时代的到来 保险机构面临着直销平台客户转化率低 代理人员队伍低效的困境 为了解决这些问题 帆软保险行业数据解决方案使用科学的数据分析报表为你带来承保 保全 批改 理赔 续期 精算 投资等一整套的数据应用场景 帮助多家企业达到降本增
  • java Lambda表达式详解

    文章目录 一 背景 1 1语法 1 2函数式接口 二 Lambda的基本使用 2 1引子 2 2常见的使用方式 2 3语法小结 三 变量捕获 3 1 匿名内部类 3 2 匿名内部类的变量捕获 3 3Lambda的变量捕获 四 Lambda在
  • 【C++】关于STL容器删除erase问题

    对于容器vector set 最近在看阿秀的八股文pdf时发现一条似乎有点问题 于是做了实验 以vector和set为例 这两个容器的erase函数都会返回下一个元素的迭代器 但是顺序容器vector确实不能使用erase it 此时it指
  • Clion Messages 乱码

    使用clion 时 编译错误时 console 输出时有乱码 在 Editor gt General gt Console gt Default Encoding 里修改设置为UTF 8 就正常了
  • [运维] nginx不允许ip访问

    nginx不允许IP访问 编辑nginx conf文件 编辑server前如下所示 server listen 80 server name localhost charset koi8 r access log logs host acc
  • 开发板测试网口带宽方法

    由于项目需要 需对开发板千兆网口传输速率进行测试 开始想到的方法十分简单 直接在开发板上移植一个ftp服务器 然后利用Ubuntu上的ftp客户端进行文件传输 以测试网口文件传输速度 但这样做需要将测试文件放到SD卡中 而SD卡的文件传输速
  • torch::jit::load(model_path) 失败原因

    下面是Pytorch配套的视频教程 Pytorch 快速实战教程 0 Pytorch实战前言 哔哩哔哩 bilibili Pytorch 分割实战教程 介绍一个图像分割的网络搭建利器 Segmentation model PyTorch 哔
  • std::vector简介及其使用(转)

    std vector简介及其使用 本文中的vector指的是std vector C 11标准 Vector概述 template
  • 修改组件默认样式之/deep/(less,sass)

    在使用第三方组件时有时候我们想修改组件的样式 可以使用全局的方式 即不使用scoped 如果多处共用我们只需要统一修改 假如有多种类型呢 我们不得不另起一个名字 如果我们想要封装一个组件 定义的样式希望在该文件中生效 不影响其他组件 我们将
  • weex初始的坎坷之路

    年前 老大就交代年后要把某个页面weex实现 当时不了解weex 连名字都叫不出来 问了度娘 才知道跟react native类似的三端开发 春节回来就开始学 入门很坎坷 因为他是以vue为模板引擎 我没学过vue 当时会react 之前也
  • Linux 指令学习之crontab

    crontab简介 crontab可以在指定的时间执行一个shell脚本以及执行一系列Linux命令 运用场景 服务器管理员定时备份数据库数据 服务器管理员定时同步数据库数据 服务器管理员定时备份服务器日志信息 crontab 常用命令 c
  • 基于SpringBoot+MyBatis 五子棋双人对战

    1 核心功能 2 演示效果 3 创建项目 4 数据库设计 5 配置文件 6 用户模块 6 1 登录实现 6 1 1 前后端交互接口 6 1 2 model 层 6 1 3 mapper 层 6 1 4 xml 层 6 1 5 service
  • 谷歌浏览器添加.crx插件

    1 美图 1 下载 crx格式的插件 常用插件网址 http www cnplugins com http chromecj com 2 更改文件后缀名为zip 3 解压zip文件 不可直接双击解压 直接解压可能使解压后的文件不全 使用命令
  • 论文写作的基本套路

    最近在写论文 写好之后给大神师兄看了看 提出了一些意见 按照师兄的意见整理出来 以供以后写作参考 博主是写的英文期刊论文 一 Abstract 一篇论文的精华都在abstract中 一片论文是否能够抓住审稿人的眼球 让审稿人有兴趣读下去 a
  • Vijava (更改虚拟机配置信息(内存、CPU和添加新磁盘)终极版本)

    package com vmware server import java util List import java util Map import org apache log4j FileAppender import org apa