pythonsdkopenstackopenstacksdk

Python OpenStack SDK does not return Hypervisor hostname


I have written a client code as follows.

# Get Hypervisor details
try:
    print(f"+----------------------------------------------------------+")
    print(f"| Hypervisor details                                       |")
    print(f"+----------------------------------------------------------+")
    for hypervisor in conn.list_hypervisors():
        print(f"Hypervisor is: {hypervisor}")
        print(f"Hypervisor status:      {hypervisor.status}")
        print(f"Hypervisor vcpus:       {hypervisor.vcpus_used}")
        print(f"Hypervisor type:        {hypervisor.hypervisor_type}")
        print(f"Hypervisor id:          {hypervisor.id}")
        print(f"Hypervisor state:       {hypervisor.state}")
        print(f"Hypervisor host IP:     {hypervisor.host_ip}")
        print(f"Hypervisor running VMs: {hypervisor.running_vms}")
        print(f"Hypervisor running VMs: {hypervisor.vcpus}")
        print(f"Hypervisor hostname:    {hypervisor.hypervisor_hostname}")

        print(f"")
except EndpointNotFound as exp:
    print("Error: {}".format(exp))
    print(f"")

When I print the 'hypervisor' object itself, I see the following details (I have formatted for better reading).

openstack.compute.v2.hypervisor.Hypervisor
(
  status=enabled, 
  service=
  {
    'host': 'cl3-Compute3', 
    'disabled_reason': None, 
    'id': '34db399d-25b9-4004-98b9-2d8bbce7b228'
  }, 
  vcpus_used=0, 
  hypervisor_type=QEMU, 
  local_gb_used=0, 
  vcpus=52, 
  hypervisor_hostname=cl3-Compute3, 
  memory_mb_used=25600, 
  memory_mb=262032, 
  current_workload=0, 
  state=up, 
  host_ip=192.168.10.116, 
  cpu_info=
  {
    'arch': 'x86_64', 
    'model': 'Broadwell', 
    'vendor': 'Intel', 
    'features': 
    [
      'pge', 'avx', 'xsaveopt', 'clflush', 'sep', 'rtm', 'tsc_adjust', 'tsc-deadline', 'dtes64', 'invpcid', 'tsc', 'fsgsbase', 'xsave', 'smap', 'vmx', 'erms', 'xtpr', 'cmov', 'hle', 'smep', 'pcid', 'est', 'pat', 'monitor', 'smx', 'pbe', 'lm', 'msr', 'adx', '3dnowprefetch', 'nx', 'fxsr', 'syscall', 'tm', 'sse4.1', 'pae', 'sse4.2', 'pclmuldq', 'acpi', 'fma', 'vme', 'popcnt', 'mmx', 'osxsave', 'cx8', 'mce', 'de', 'rdtscp', 'ht', 'dca', 'lahf_lm', 'abm', 'rdseed', 'pdcm', 'mca', 'pdpe1gb', 'apic', 'sse', 'f16c', 'pse', 'ds', 'invtsc', 'pni', 'tm2', 'avx2', 'aes', 'sse2', 'ss', 'ds_cpl', 'arat', 'bmi1', 'bmi2', 'ssse3', 'fpu', 'cx16', 'pse36', 'mtrr', 'movbe', 'rdrand', 'x2apic'
    ], 
    'topology': 
    {
      'cores': 14, 
      'cells': 2, 
      'threads': 2, 
      'sockets': 1
    }
  }, 
  running_vms=0, 
  free_disk_gb=852, 
  hypervisor_version=2012000, 
  disk_available_least=849, 
  local_gb=852, 
  free_ram_mb=236432, 
  id=1130407d-5afd-41f9-bc0c-2d7babda3ce7, 
  location=Munch
  (
    {
      'cloud': 'defaults', 'region_name': 'RegionOne', 'zone': None, 'project': Munch({'id': '6d4f1b107bbf4b94832f7ef72df61ef2', 'name': '5g', 'domain_id': None, 'domain_name': 'default'})
    }
  )
)

Most of the values are printed as shown below, however when I try to access 'hypervisor.hypervisor_hostname', it throws an exception.

+----------------------------------------------------------+
| Hypervisor details                                       |
+----------------------------------------------------------+
Hypervisor is: openstack.compute.v2.hypervisor.Hypervisor(status=enabled, service={'host': 'cl3-Compute3', 'disabled_reason': None, 'id': '34db399d-25b9-4004-98b9-2d8bbce7b228'}, vcpus_used=0, hypervisor_type=QEMU, local_gb_used=0, vcpus=52, hypervisor_hostname=cl3-Compute3, memory_mb_used=25600, memory_mb=262032, current_workload=0, state=up, host_ip=192.168.10.116, cpu_info={'arch': 'x86_64', 'model': 'Broadwell', 'vendor': 'Intel', 'features': ['pge', 'avx', 'xsaveopt', 'clflush', 'sep', 'rtm', 'tsc_adjust', 'tsc-deadline', 'dtes64', 'invpcid', 'tsc', 'fsgsbase', 'xsave', 'smap', 'vmx', 'erms', 'xtpr', 'cmov', 'hle', 'smep', 'pcid', 'est', 'pat', 'monitor', 'smx', 'pbe', 'lm', 'msr', 'adx', '3dnowprefetch', 'nx', 'fxsr', 'syscall', 'tm', 'sse4.1', 'pae', 'sse4.2', 'pclmuldq', 'acpi', 'fma', 'vme', 'popcnt', 'mmx', 'osxsave', 'cx8', 'mce', 'de', 'rdtscp', 'ht', 'dca', 'lahf_lm', 'abm', 'rdseed', 'pdcm', 'mca', 'pdpe1gb', 'apic', 'sse', 'f16c', 'pse', 'ds', 'invtsc', 'pni', 'tm2', 'avx2', 'aes', 'sse2', 'ss', 'ds_cpl', 'arat', 'bmi1', 'bmi2', 'ssse3', 'fpu', 'cx16', 'pse36', 'mtrr', 'movbe', 'rdrand', 'x2apic'], 'topology': {'cores': 14, 'cells': 2, 'threads': 2, 'sockets': 1}}, running_vms=0, free_disk_gb=852, hypervisor_version=2012000, disk_available_least=849, local_gb=852, free_ram_mb=236432, id=1130407d-5afd-41f9-bc0c-2d7babda3ce7, location=Munch({'cloud': 'defaults', 'region_name': 'RegionOne', 'zone': None, 'project': Munch({'id': '6d4f1b107bbf4b94832f7ef72df61ef2', 'name': '5g', 'domain_id': None, 'domain_name': 'default'})}))
Hypervisor status: enabled
Hypervisor vcpus: 0
Hypervisor type:     QEMU
Hypervisor id: 1130407d-5afd-41f9-bc0c-2d7babda3ce7
Hypervisor state: up
Hypervisor host IP: 192.168.10.116
Hypervisor running VMs: 0
Hypervisor running VMs: 52
Traceback (most recent call last):
  File "/Users/workspace/testprogs/python/opsviz/ops_worker.py", line 321, in <module>
    main()
  File "/Users/workspace/testprogs/python/opsviz/ops_worker.py", line 317, in main
    print_servers()
  File "/Users/workspace/testprogs/python/opsviz/ops_worker.py", line 115, in print_servers
    print(f"Hypervisor hostname: {hypervisor.hypervisor_hostname}")
  File "/Users/inventory/lib/python3.7/site-packages/openstack/resource.py", line 588, in __getattribute__
    raise e
  File "/Users/inventory/lib/python3.7/site-packages/openstack/resource.py", line 582, in __getattribute__
    return object.__getattribute__(self, name)
AttributeError: 'Hypervisor' object has no attribute 'hypervisor_hostname'

Solution

  • I have checked the code of python-openstacksdk. In the class Hypervisor in file openstack/compute/v2/hypervisor.py there are the following lines in the constructor of the class:

    class Hypervisor(resource.Resource):
    ...
    #: Name of hypervisor
    name = resource.Body('hypervisor_hostname')
    

    The value hypervisor_hostname of the REST-API-response is mapped to name, so try to access this value instead.

    see also the source-code: https://github.com/openstack/openstacksdk/blob/master/openstack/compute/v2/hypervisor.py#L39