2017-06-12 2 views
0

Wenn ich den Code unten in PyCharm laufen, bekomme ich diesen Fehler:Der Versuch, Task-Informationen auf einer virtuellen Maschine Einheit zu ziehen

--error--

C:\Python33\python.exe B:/Python/untitled3/working_test.py 
'vim.VirtualMachine:vm-65063' 
Traceback (most recent call last): 
    File "B:/Python/untitled3/working_test.py", line 47, in <module> 
    main() 
    File "B:/Python/untitled3/working_test.py", line 37, in main 
    filterspec = vim.TaskFilterSpec(vim.TaskFilterSpec.ByEntity(entity=source_machine)) 
TypeError: __init__() takes 1 positional argument but 2 were given 

Process finished with exit code 1 

--error--

Ich habe versucht, selbst zu verwenden, eine Klasse usw. zu schaffen, aber ich kann einfach nicht meinen Kopf herum, was ich falsch mache. Jede Hilfe wird geschätzt. Ich versuche im Grunde, Informationen über Aufgaben auf einer Entität (virtuellen Maschine) innerhalb von vsphere zu erhalten.

Danke!

import ssl 

from pyVim import connect 
from pyVmomi import vmodl, vim 


def main(): 

    try: 
     context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) 
     context.verify_mode = ssl.CERT_NONE 
     si = connect.SmartConnect(host='vcenter name', 
            user='user name', 
            pwd='password', 
            port=443, 
            sslContext=context) 

     if not si: 
      print("Could not connect to the specified host using specified " 
        "username and password") 
      return -1 

     content = si.RetrieveContent() 

     def getobject(vimtype, name): 
      obj = None 
      container = content.viewManager.CreateContainerView(content.rootFolder, vimtype, True) 
      for c in container.view: 
       if c.name == name: 
        obj = c 
        break 
      return obj 

     source_machine = getobject([vim.VirtualMachine], 'virtual machine name') 
     print(source_machine) 
     taskManager = content.taskManager 
     filterspec = vim.TaskFilterSpec(vim.TaskFilterSpec.ByEntity(entity=source_machine)) 
     collector = taskManager.CreateCollectorForTasks(filterspec) 

    except vmodl.MethodFault as e: 
     print("Caught vmodl fault : {}".format(e.msg)) 
     return -1 

    return 0 

if __name__ == "__main__": 
    main() 
+0

ich dieses spezielle Modul weiß es nicht, aber was es sagt, ist, dass diese Klasse in der Tat keine Argumente bei der Instanziierung erwartet. – enedil

Antwort

0

vim.TaskFilterSpec() akzeptiert keine Positionsargumente.

>>> vim.TaskFilterSpec(vim.TaskFilterSpec.ByEntity(entity=vim.ManagedEntity('1'))) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __init__() takes 1 positional argument but 2 were given 

Klassenkonstruktor vim.TaskFilterSpec() will mit einem entity benannten Parameter aufgerufen werden: Eine minimale Wiedergabe der Ausnahme können mit zu haben. In Ihrem Beispiel Code oben, bedeutet dies verändernde Linie 37 würde zu lesen:

filterspec = vim.TaskFilterSpec(entity=vim.TaskFilterSpec.ByEntity(entity=source_machine)) 

Wenn es mit einem Placebo ManagedEntity aufgerufen, führt dies zu einem Filter-spec ähnlich wie:

>>> source_machine=vim.ManagedEntity('1') 
>>> filterspec = vim.TaskFilterSpec(entity=vim.TaskFilterSpec.ByEntity(entity=source_machine)) 
>>> filterspec 
(vim.TaskFilterSpec) { 
    dynamicType = <unset>, 
    dynamicProperty = (vmodl.DynamicProperty) [], 
    entity = (vim.TaskFilterSpec.ByEntity) { 
     dynamicType = <unset>, 
     dynamicProperty = (vmodl.DynamicProperty) [], 
     entity = 'vim.ManagedEntity:1', 
     recursion = <unset> 
    }, 
    time = <unset>, 
    userName = <unset>, 
    activationId = (str) [], 
    state = (vim.TaskInfo.State) [], 
    alarm = <unset>, 
    scheduledTask = <unset>, 
    eventChainId = (int) [], 
    tag = (str) [], 
    parentTaskKey = (str) [], 
    rootTaskKey = (str) [] 
} 
0

danke für die Hilfe.

Ich habe diesen Teil des Codes angepasst und es wird ohne Fehler zurückgegeben, aber jetzt, warum es scheint, nur die Abfrage-Task selbst anstelle der Aufgaben im Zusammenhang mit der VM zurückgegeben. Ich denke, es könnte etwas damit zu tun haben, dass die Aufgaben auf vcenter-Ebene angesiedelt sind, aber jetzt funktioniert es.

source_machine = getobject([vim.VirtualMachine], 'virtual machine name) 
taskManager = content.taskManager 
filterspec = vim.TaskFilterSpec() 
filterspec.entity = vim.TaskFilterSpec.ByEntity(entity=source_machine,recursion='all') 
collector = taskManager.CreateCollectorForTasks(filterspec) 
print(collector) 

Ausgabe zurückgegeben:

C:\Python33\python.exe B:/Python/untitled3/working_test.py 
'vim.TaskHistoryCollector:session[52b617f0-0f65-705c-7462-814d8b648fdd]52081175-cb98-a09f-f9f6-f6787f68d3b7' 

Process finished with exit code 0 
Verwandte Themen