On Tue, 2020-06-23 at 13:12 -0700, Anil Jangam wrote:
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, 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'
Is there anything wrong with the use of the API? How do I get the hypervisor hostname in my application code?
looking at the fields that are in the hypervior object you are not hitting the /os-hypervisors list hyperviors endpoint but are instead hittig the /os-hypervisors/detail endpoint which inluded extra info both shoudl contain hypervisor_hostname https://docs.openstack.org/api-ref/compute/?expanded=list-hypervisors-detail... is the doc for that api. by default this is an admin only api. sean@pop-os:~$ openstack --os-cloud sean hypervisor list Policy doesn't allow os_compute_api:os-hypervisors:list-detail to be performed. (HTTP 403) (Request-ID: req-fbc50741- 5a73-4329-a00e-11eef79011ac) so the fact that you are geting any results indicates that you are using admin creditals so you should recive the full responce and looking at the raw hypervisor print output i has the info so i would guess that its jut missing a property. looking at https://github.com/openstack/openstacksdk/blob/master/openstack/compute/v2/h... it would appear that hypervisor_hostname is being stored in the name property. im not sure why some of the fields where renamed https://github.com/openstack/openstacksdk/blob/master/openstack/compute/v2/h... that feels like a poor desigin choice as it basically means the upstream api docs are not enough to use the sdk you need to girue out what then mapped the fields too. the object also obviously contains the raw values too or they would not print when you print the object. that is because that is falling back to the base resouce __repr__ function https://github.com/openstack/openstacksdk/blob/8b5d4fe7985d3f9319b23121e290e... which prints the raw values. at least i think that is what happening i have not looked at the sdk closely before.
Thank you.