Files
nova-powervm/nova_powervm/virt/powervm/host.py
Matthew Edmonds a1cbe7c08b fix copyright dates
Found some copyrights that were not updated the last time the
file was changed. Updating copyright dates to reflect the most
recent change.

Change-Id: Ib6f545db10b77cc7a0b2295a21e824b63974bda5
2018-01-25 13:57:59 -05:00

116 lines
4.4 KiB
Python

# Copyright 2014, 2018 IBM Corp.
#
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import math
from nova.objects import fields
from oslo_log import log as logging
from oslo_serialization import jsonutils
from nova import conf as cfg
LOG = logging.getLogger(__name__)
CONF = cfg.CONF
# Power VM hypervisor info
# Normally, the hypervisor version is a string in the form of '8.0.0' and
# converted to an int with nova.virt.utils.convert_version_to_int() however
# there isn't currently a mechanism to retrieve the exact version.
# Complicating this is the fact that nova conductor only allows live migration
# from the source host to the destination if the source is equal to or less
# than the destination version. PowerVM live migration limitations are
# checked by the PowerVM capabilities flags and not specific version levels.
# For that reason, we'll just publish the major level.
IBM_POWERVM_HYPERVISOR_VERSION = 8
# The types of LPARS that are supported.
POWERVM_SUPPORTED_INSTANCES = [
(fields.Architecture.PPC64, fields.HVType.PHYP, fields.VMMode.HVM),
(fields.Architecture.PPC64LE, fields.HVType.PHYP, fields.VMMode.HVM),
]
# cpu_info that will be returned by build_host_stats_from_entry()
HOST_STATS_CPU_INFO = jsonutils.dumps({'vendor': 'ibm', 'arch': 'ppc64'})
def build_host_resource_from_ms(ms_wrapper):
"""Build the host resource dict from an MS adapter wrapper
This method builds the host resource dictionary from the
ManagedSystem Entry wrapper
:param ms_wrapper: ManagedSystem Entry Wrapper.
"""
data = {}
# Calculate the vcpus
proc_units = float(ms_wrapper.proc_units_configurable)
proc_units_avail = float(ms_wrapper.proc_units_avail)
pu_used = proc_units - proc_units_avail
data['vcpus'] = int(math.ceil(proc_units))
data['vcpus_used'] = int(math.ceil(pu_used))
data['memory_mb'] = ms_wrapper.memory_configurable
data['memory_mb_used'] = (ms_wrapper.memory_configurable -
ms_wrapper.memory_free)
data["hypervisor_type"] = fields.HVType.PHYP
data["hypervisor_version"] = IBM_POWERVM_HYPERVISOR_VERSION
data["hypervisor_hostname"] = CONF.host
data["cpu_info"] = HOST_STATS_CPU_INFO
data["numa_topology"] = None
data["supported_instances"] = POWERVM_SUPPORTED_INSTANCES
stats = {'proc_units': '%.2f' % proc_units,
'proc_units_used': '%.2f' % pu_used,
'memory_region_size': ms_wrapper.memory_region_size
}
data["stats"] = stats
data["pci_passthrough_devices"] = _build_pci_json(ms_wrapper)
return data
def _build_pci_json(sys_w):
"""Build the JSON string for the pci_passthrough_devices host resource.
:param sys_w: pypowervm.wrappers.managed_system.System wrapper of the host.
:return: JSON string representing a list of "PCI passthrough device" dicts,
See nova.objects.pci_device.PciDevice.
"""
# Produce SR-IOV PCI data. Devices are validated by virtue of the network
# name associated with their label, which must be cleared via an entry in
# the pci_passthrough_whitelist in the nova.conf. Each Claim allocates a
# device and filters it from the list for subsequent claims; so we generate
# the maximum number of "devices" (VFs) we could possibly create on each
# port. These are NOT real VFs. The real VFs get created on the fly by
# VNIC.create.
pci_devs = [
{"physical_network": pport.label or 'default',
"label": pport.label or 'default',
"dev_type": fields.PciDeviceType.SRIOV_VF,
"address": '*:%d:%d.%d' % (sriov.sriov_adap_id, pport.port_id, vfn),
"parent_addr": "*:*:*.*",
"vendor_id": "*",
"product_id": "*",
"numa_node": 1}
for sriov in sys_w.asio_config.sriov_adapters
for pport in sriov.phys_ports
for vfn in range(pport.supp_max_lps)]
return jsonutils.dumps(pci_devs)