2015-10-19 2 views
0

Я использую example code для присоединения нового диска к виртуальной машине, когда создаю его с помощью pyVmomi. Прямо сейчас у меня есть controllerKey с жестким кодом до 200 (который, случается, является контроллером IDE в моей настройке - я не знаю, насколько это значение соответствует настройкам).Список правильных значений контроллераKey с pyVmomi

Я хотел бы удалить жесткий ключ контроллера, предоставляя пользователю выбор между контроллерами IDE и SCSI по крайней мере.

Кто-нибудь знает, как получить список допустимых VirtualController ключей?

Для потомков, пример кода я использую следующим образом:

def create_virtual_disk(capacity, controller_key, unit_number, in_bytes=False): 
    """ 
    :param capacity: Capacity of new disk in Bytes 
    :param unit_number: device unit 
    :return: 
    """ 
    virtual_disk = vim.vm.device.VirtualDisk() 
    if in_bytes: 
     virtual_disk.capacityInBytes = capacity 
    else: 
     virtual_disk.capacityInKB = capacity 

    # Verify this. 
    virtual_disk.unitNumber = unit_number 
    virtual_disk.controllerKey = controller_key 

    # backing info 
    virtual_disk_backing_info = vim.vm.device.VirtualDisk.FlatVer2BackingInfo() 
    virtual_disk_backing_info.diskMode = "persistent" 
    virtual_disk_backing_info.thinProvisioned = True 

    # assigning backing info to virtual disk device backing 
    virtual_disk.backing = virtual_disk_backing_info 

    # creating virtualdevice spec and assigning recently created virtual disk 
    virtual_disk_spec = vim.vm.device.VirtualDeviceSpec() 
    virtual_disk_spec.device = virtual_disk 
    virtual_disk_spec.fileOperation = "create" 
    virtual_disk_spec.operation = "add" 

    return virtual_disk_spec 

ответ

1

новелла: Более подробную информацию см а, б или в. Общая рекомендация - придерживаться либо a), либо жестко запрограммированного списка controllerKeys для конкретной аппаратной модели vmware, так как она быстрее, чем c) (большой размерный ответ) и меньше суеты для реализации.

а) найти controllerkey из существующих devicespec

Наш кодовая стремится только добавить устройства-типы, которые уже присутствуют в наших VMS поэтому следующий фрагмент довольно много для нас достаточно, и может быть, а для вас :

Получить ключ от уже существующего контроллера type==ctrl_type

def _find_controller(self, ctrl_type, max_devs=None): 
     for dev in self._machine._vm.config.hardware.device: 
      if isinstance(dev, ctrl_type): 
       if not max_devs or len(dev.device) < max_devs: 
        return dev 

     raise ControllerNotFoundException(ctrl_type) 

конкретный случай использования этого заключается в том, чтобы добавить еще один тип IDE CDRom (это только добавило к соответствующему спецификации и все совершенные сразу позже):

def _add_cdrom(self, spec, path): 
    spec.device.controllerKey = self._find_controller(vim.vm.device.VirtualIDEController, max_devs=2).key 
    dev = VSphereMediaDevice(spec.device, self._machine) 
    dev._spec.device.backing = vim.vm.device.VirtualCdrom.IsoBackingInfo() 
    dev.mount(path) 
    spec.device.backing = dev._spec.device.backing 

б) перечень допустимых controllerkeys для вашей Hw версии

посмотреть на /etc/vmware/hostd/env/vmconfigoption-esx-hw8.xml (ESXi, по умолчанию для аппаратной версии 8 vms), которая содержит все доступные controllerKeys для конкретной версии аппаратного обеспечения vmware. controllerKeys довольно согласованы для аппаратной версии, но всегда есть вероятность того, что она изменится в будущих версиях.

<deviceInfo> 
    <_type>vim.Description</_type> 
    <label>VirtualIDEController 0</label> 
    <summary>VirtualIDEController 0</summary> 
</deviceInfo> 
<key>200</key> 

с) список vmconfigoptions через SOAP

following SOAP Запрос выполняется всякий раз, когда новая виртуальная машина создается с помощью Vsphere клиента. Его ответ содержит аппаратные профили (win8, win7, winlonghorn, ...) с controllerKeys для большинства устройств. Но я предполагаю, что это может быть отвратительным, если вам придется делать это много раз из-за тяжелого ответа.

POST /sdk HTTP/1.1 
    User-Agent: VMware VI Client/xxx 
    Content-Type: text/xml; charset="utf-8" 
    SOAPAction: "urn:internalvim25/5.0" 
    Host: xxx 
    Cookie: vmware_soap_session="xxxx" 
    Content-Length: 526 

    ...<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
     <soap:Header> 
      <operationID>xxx</operationID> 
     </soap:Header> 
     <soap:Body> 
      <QueryConfigOption xmlns="urn:internalvim25"> 
       <_this xsi:type="ManagedObjectReference" type="EnvironmentBrowser" serverGuid="">ha-env-browser-vmx-08</_this> 
       <key>vmx-08</key> 
      </QueryConfigOption>  
     </soap:Body> 
    </soap:Envelope> 

ответа (усеченный):

HTTP/1.1 200 OK 
Date: xxx 
Cache-Control: no-cache 
Connection: Keep-Alive 
Content-Type: text/xml; charset=utf-8 
Transfer-Encoding: chunked 

7ED8 
<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Body> 
<QueryConfigOptionResponse xmlns="urn:internalvim25"><returnval><version>vmx-08</version><description>Hardware version 8 virtual machine</description><guestOSDescriptor><id>windows8Server64Guest 
.... 
<defaultDevice xsi:type="VirtualIDEController"><key>200</key><deviceInfo><label>IDE 0</label><summary>IDE 0</summary></deviceInfo><busNumber>0</busNumber></defaultDevice><defaultDevice xsi:type="VirtualIDEController"><key>201</key><deviceInfo><label>IDE 1</label><summary>IDE 1</summary></deviceInfo><busNumber>1</busNumber></defaultDevice><defaultDevice xsi:type="VirtualPS2Controller"><key>300</key><deviceInfo><label>PS2 controller 0</label><summary>PS2 controller 0</summary></deviceInfo><busNumber>0</busNumber></defaultDevice><defaultDevice xsi:type="VirtualPCIController"><key>100</key><deviceInfo><label>PCI controller 0</label><summary>PCI controller 0</summary></deviceInfo><busNumber>0</busNumber></defaultDevice><defaultDevice xsi:type="VirtualSIOController"><key>400</key><deviceInfo><label>SIO controller 0</label><summary>SIO controller 0</summary></deviceInfo><busNumber>0</busNumber></defaultDevice><defaultDevice xsi:type="VirtualKeyboard"><key>600</key><deviceInfo><label>Keyboard </label><summary>Keyboard</summary></deviceInfo><controllerKey>300</controllerKey><unitNumber>0</unitNumber></defaultDevice><defaultDevice xsi:type="VirtualPointingDevice"><key>700</key><deviceInfo><label>Pointing device</label><summary>Pointing device; Device</summary></deviceInfo><backing xsi:type="VirtualPointingDeviceDeviceBackingInfo"><deviceName></deviceName><useAutoDetect>false</useAutoDetect><hostPointingDevice>autodetect</hostPointingDevice></backing><controllerKey>300</controllerKey><unitNumber>1</unitNumber></defaultDevice><defaultDevice xsi:type="VirtualMachineVideoCard"><key>500</key><deviceInfo><label>Video card </label><summary>Video card</summary></deviceInfo> 
+0

Спасибо за полезную информацию и подробный ответ. Я думаю, что это именно то, что нам нужно! – codekoala