Openstack_通用模块_Oslo_vmware 创建/删除 vCenter 虚拟机
目录
oslo.vmware
oslo.vmware 是 Openstack 的通用模块, 用于连接/获取/操作 vCenter 上的实体资源(Datacenter/CLuster/Host/VirtualMachine…等). Openstack Nova Project 具有一定的 Hypervisor 异构能力, 到 /opt/stack/nova/nova/virt 路径下可以看见其所支持的虚拟化类型包括了 hyperv/libvirt/xenapi/vmwareapi . 其中 vmwareapi 主要由 oslo.vmware 来提供基础的接口实现, Nova Project 在此基础上做了进一步的封装和重构.
Connect to vCenter Server
关于如何连接和获取 vCenter 实体资源对象的信息, 在 Python Module_oslo.vmware_连接 vCenter 一文中作了介绍, 通过 oslo_vmware.api Module 的 class VMwareAPISession 来完成, Return session 对象 . EXAMPLE:
from oslo_vmware import api
from oslo_vmware import vim_util
session = api.VMwareAPISession(
'<vCenter_Server_IPAddress>',
'<server_username>',
'<server_password>',
1,
0.1)
Create VirtualMachine for vCenter
在 vCenter 上创建虚拟机通过调用 Folder.CreateVM_Task()
来实现, 然后使用 VirtualMachine managed object
的属性和方法来配置这个虚拟机.
Folder.CreateVM_Task()
方法使 用 一 个 VirtualMachineConfigSpec 数据对象作为参数。VirtualMachineConfigSpec 允许你设定创建虚拟机的属性信息.你还必须指定一个 Host 或一个 ResourcePool(或两者都指定)。虚拟机需要占用 Host 或 ResourcePool 里的 CPU 和内存。
Folder.CreateVM_Task(_this, config, pool, host)
# _this(ManagedObjectReference) – 文件夹,你想放置虚拟机的文件夹
# config(VirtualMachineConfigSpec) – 虚拟机配置讯息,数据对象明确了CPU,内存,网络等等信息。
# pool(ManagedObjectReference to a ResourcePool) – 资源池,虚拟机获得从中获得资源。
# host(ManagedObjectReference to a Host) - 主机,代表了虚拟机运行的目标主机。
NOTE: 假如你在一个独立的 ESXi 主机上应用 Folder.CreateVM_Task()
方法, 可以省略 host
参数。假如目标主机是 VMware DRS Cluster 里的一部分, host
参数是可选的. 假如没有指定主机,系统自动选择一个。
EXAMPLE:
# 获取 Datacenter 资源清单
datacenter = session.invoke_api(
vim_util,
'get_objects',
session.vim,
'Datacenter',
100)
# 选择创建虚拟机的目标 Datacenter
datacenter = datacenter.objects[1]
# 选择创建虚拟机的目标 Folder
vmFolder = session.invoke_api(vim_util, 'get_object_properties_dict', session.vim,
datacenter.obj,
'vmFolder')
# 获取 Cluster 资源清单
computeResource = session.invoke_api(
vim_util,
'get_objects',
session.vim,
'ComputeResource',
100)
# 选择创建虚拟机的目标 Cluster
cluster = computeResource.objects[2]
# 选择创建虚拟机的目标 ResourcePool
resourcePool = session.invoke_api(vim_util, 'get_object_properties_dict', session.vim,
cluster.obj,
'resourcePool')
# 获取虚拟机配置信息对象
client_factory = session.vim.client.factory
config_spec = client_factory.create('ns0:VirtualMachineConfigSpec')
# 设定虚拟机配置信息
import uuid
instance_uuid = str(uuid.uuid4())
data_store_name = 'datastore1'
config_spec.name = 'jmilkfan_vm'
config_spec.guestId = 'otherGuest'
config_spec.instanceUuid = instance_uuid
vm_file_info = client_factory.create('ns0:VirtualMachineFileInfo')
vm_file_info.vmPathName = "[" + data_store_name + "]"
config_spec.files = vm_file_info
tools_info = client_factory.create('ns0:ToolsConfigInfo')
tools_info.afterPowerOn = True
tools_info.afterResume = True
tools_info.beforeGuestStandby = True
tools_info.beforeGuestShutdown = True
tools_info.beforeGuestReboot = True
config_spec.tools = tools_info
config_spec.numCPUs = int(instance.vcpus) = 1
config_spec.numCoresPerSocket = int(extra_specs.cores_per_socket) = 1
config_spec.memoryMB = int(instance.memory_mb) = 512
extra_config = []
opt = client_factory.create('ns0:OptionValue')
opt.key = "nvp.vm-uuid"
opt.value = instance_uuid
extra_config.append(opt)
config_spec.extraConfig = extra_config
# 创建虚拟机
vm_create_task = session.invoke_api(session.vim,
"CreateVM_Task",
vmFolder['vmFolder'],
config=config_spec,
pool=resourcePool['resourcePool'])
ERROR 1: 对象不支持该操作
TSG: 检查 Datacenter 和 Cluster 是否为有效的清单对象, 该例子中的 Datacenter:ECONE 和 Cluster:cluster 均为拥有 Host 且正常运作的资源对象.
In [190]: datacenter.objects[1]
Out[190]:
(ObjectContent){
obj =
(obj){
value = "datacenter-2"
_type = "Datacenter"
}
propSet[] =
(DynamicProperty){
name = "name"
val = "ECONE"
},
}
In [191]: computeResource.objects[2]
Out[191]:
(ObjectContent){
obj =
(obj){
value = "domain-c7"
_type = "ClusterComputeResource"
}
propSet[] =
(DynamicProperty){
name = "name"
val = "cluster"
},
}
ERROR 2: 配置参数错误 config.fiile
TSG: 检查 config_spec
的参数是否符合创建虚拟机的基本要求
NOTE 1: session.invoke_api()
方法, 实际上是调用了指定 module 中的 method, 再将参数集合中其余的参数作为 method 的实参传递到过去, 最后返回一个 API CALL 的响应.
HELP:
Help on method invoke_api in module oslo_vmware.api:
invoke_api(self, module, method, *args, **kwargs) method of oslo_vmware.api.VMwareAPISession instance
Wrapper method for invoking APIs.
The API call is retried in the event of exceptions due to session
overload or connection problems.
:param module: module corresponding to the VIM API call
:param method: method in the module which corresponds to the
VIM API call
:param args: arguments to the method
:param kwargs: keyword arguments to the method
:returns: response from the API call
:raises: VimException, VimFaultException, VimAttributeException,
VimSessionOverLoadException, VimConnectionException
所以如果你感兴趣的话, 可以到 module 中看看该 method 是怎么实现的.
NOTE 2: 需要注意的是, 当 module == session.vim
时, 实际上 module 是一个 VIM Object , 所以在 module 中并没有 method 的实现, 而是在 class VIM 中实现.
常用的虚拟机配置项
# /opt/stack/nova/nova/virt/vmwareapi/vm_util.py +204 ==> get_vm_create_spec()
client_factory = session.vim.client.factory
config_spec = client_factory.create('ns0:VirtualMachineConfigSpec')
config_spec.name name
config_spec.guestId = os_type
# The name is the unique identifier for the VM
config_spec.instanceUuid = instance.uuid
config_spec.annotation = metadata
# Set the HW version
config_spec.version = extra_specs.hw_version
# Allow nested hypervisor instances to host 64 bit VMs.
if os_type in ("vmkernel5Guest", "vmkernel6Guest", "windowsHyperVGuest"):
config_spec.nestedHVEnabled = "True"
# Append the profile spec
if profile_spec:
config_spec.vmProfile = [profile_spec]
# Datastore for VM
vm_file_info = client_factory.create('ns0:VirtualMachineFileInfo')
vm_file_info.vmPathName = "[" + data_store_name + "]"
config_spec.files = vm_file_info
# VMTools for VM
tools_info = client_factory.create('ns0:ToolsConfigInfo')
tools_info.afterPowerOn = True
tools_info.afterResume = True
tools_info.beforeGuestStandby = True
tools_info.beforeGuestShutdown = True
tools_info.beforeGuestReboot = True
config_spec.tools = tools_info
# CPU Info for VM
config_spec.numCPUs = int(instance.vcpus)
# Memory for VM
config_spec.memoryMB = int(instance.memory_mb)
删除虚拟机
删除虚拟机的逻辑就相对简单了:
1. 找到虚拟机
2. 执行删除.
# 获取虚拟机的资源清单
vms = session.invoke_api(vim_util,
'get_objects',
session.vim,
'VirtualMachine',
100)
# 获取该虚拟机的 instanceUuid
vms.objects[10]
summary = session.invoke_api(vim_util, 'get_object_properties_dict', session.vim,
vms.objects[10].obj,
'summary')
instance_uuid = summary['summary'].config.instanceUuid
# 通过 instanceUuid 获取虚拟机实体对象
vm = session.invoke_api(session.vim,
"FindAllByUuid",
session.vim.service_content.searchIndex,
uuid=instance_uuid,
vmSearch=True,
instanceUuid=True)
vm_ref = vm[0]
# 删除虚拟机
destroy_task = session.invoke_api(session.vim,
"Destroy_Task",
vm_ref)
当然在实际生产环境中, 我们会将之前创建的或者已经拥有的虚拟机资产信息存放到数据库中. 所以获取 instanceUuid
的途径就变成了从数据库获取.
Openstack_通用模块_Oslo_vmware 创建/删除 vCenter 虚拟机的更多相关文章
- Openstack_通用模块_Oslo_vmware 创建 vCenter 虚拟机快照
创建虚拟机快照 vSphere Create Snapshot 文档 Snapshot 是虚拟机磁盘文件(VMDK)在某个点及时的复本.包含了虚拟机所有虚拟磁盘上的数据状态和这个虚拟机的电源状态(on ...
- Openstack_通用模块_Oslo_vmware 创建 vSS PortGroup
目录 目录 vSS vSSPG vSphere SDK 中相关的网络对象 创建 vSS PortGroup vSS & vSSPG vSS(Standard vSwitch 标准交换机) 为在 ...
- VMware 接入 Openstack — 使用 Openstack 创建 vCenter 虚拟机
目录 目录 软件环境 前言 Openstack 接口驱动 使用 KVM 在 Compute Node 上创建虚拟机的流程 使用 VCDirver 在 vCenter 上创建虚拟机的流程 配置 vCen ...
- 如何在Windows中批量创建VMware的虚拟机
在最近的工作中,需要创建一批类似的机器.在VMware中创建了模板,然后根据自义向导部署之后,发现可以快速的完成新vm的部署.系统中的计算机名,IP地址都可以自动的完成更新.唯一的缺点是,系统自带的向 ...
- 使用Windows Azure创建Linux系统虚拟机-下
如何将数据磁盘附加到新虚拟机 您的应用程序可能需要存储数据.要这样设置,您可以将数据磁盘添加到先前创建的虚拟机.要做到这一点,最简单的方法是将空数据磁盘连接到本机. 在Linux上,磁盘资源通常由Az ...
- Idea多模块工程创建——继承、聚合
一.工程介绍 淘淘网上商城是一个综合性的B2C平台,类似京东商城.天猫商城.会员可以在商城浏览商品.下订单,以及参加各种活动. 管理员.运营可以在平台后台管理系统中管理商品.订单.会员等. 客服可以在 ...
- Maven入门,Maven项目的创建,nexus 2.x搭建私服以及Maven多模块项目创建
maven的了解做一个总结,以便日后查阅, 若有不足之处,还望指出,学无止境 当然也能起到入门效果. 一,搭建maven私服 1.工具 a. Nexus 2.5.1-01 b. Maven 3.3.9 ...
- Spring Boot 多模块项目创建与配置 (一) (转)
Spring Boot 多模块项目创建与配置 (一) 最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多个模块.代码中的多模块是用maven管理的,每个模块都 ...
- Spring Boot 多模块项目创建与配置 (一)
最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多个模块.代码中的多模块是用maven管理的,每个模块都使用spring boot框架.之前有零零散散学过一些 ...
随机推荐
- Delphi7所使用的WinAPI大全(摘自VCL源码,一共1200个函数)
经过我整理的,去掉了A和W的重复.虽然没写注释,但以后要一个一个研究.有这些WINAPI就够用了. kernel32 = 'kernel32.dll'; gdi32 = 'gdi32.dll'; us ...
- P2523 [HAOI2011]Problem c
传送门 先考虑如何判断无解,设 $sum[i]$ 表示确定的人中,编号大于 $i$ 的人的人数 如果 $sum[i]>n-i+1$ 则无解,进一步考虑设 $f[i][j]$ 表示当前确定完编号大 ...
- 在Myeclipse下查看Java字节码指令信息
在实际项目开发中,有时为了了解Java编译器内部的一些工作,需要查看Java文件对应的具体的字节码指令集,这里提供两种方式供参考. 一.使用javap命令 javap是JDK提供的 ...
- Redis---键的过期时间及数据淘汰策略
5.键的过期时间 Redis可以为每个键设置过期时间,当键过期时,会自动删除该键. 对于散列表这种容器,只能为整个键设置过期时间(整个散列表),而不能为键里面的单个元素设置过期时间. 6.数据 ...
- python 调用dll 动态链接库 结构体参数及回调函数等示例
结构体示例: 这里是 C 代码的部分,主要是结构体的声明和回调函数定义. // 新版本定义 typedef enum { DevCard, DevLocator, DevReader } DevTyp ...
- 自动布局(storyboard,code)
xcode 6使用storyboard 进行自动布局,迷惑的问题主要由: 1,classsize 到底是一个什么东东? 2,classSize 和 layout 有什么区别? 3, 如何使用stor ...
- rest_framework框架的认证、权限
REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.TokenAuth", ] ...
- python并发编程中的多进程(代码实现)
一.multipricessing模块的介绍 python中的多线程无法利用多核优势,如果想要充分的使用多核CPU资源,在python中大部分情况下需要用多线程,python提供了multiproce ...
- Qt项目界面文件(.ui)及其作用(超详细)
http://c.biancheng.net/view/1820.html Qt 项目中,后缀为“.ui”的文件是可视化设计的窗体的定义文件,如 widget.ui.双击项目文件目录树中的文件 wid ...
- flutter 基础组件
TextWidget class TextWidget extends StatelessWidget { final TextStyle _textStyle = TextStyle( fontSi ...