nova-powervm/nova_powervm/virt/powervm/vios.py

103 lines
4.0 KiB
Python

# Copyright 2015 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.
from oslo_config import cfg
from oslo_log import log as logging
from pypowervm.utils import transaction as pvm_tx
from pypowervm.wrappers import base_partition as pvm_bp
from pypowervm.wrappers import managed_system as pvm_ms
from pypowervm.wrappers import virtual_io_server as pvm_vios
LOG = logging.getLogger(__name__)
CONF = cfg.CONF
# RMC must be either active or busy. Busy is allowed because that simply
# means that something is running against the VIOS at the moment...but
# it should recover shortly.
VALID_RMC_STATES = [pvm_bp.RMCState.ACTIVE, pvm_bp.RMCState.BUSY]
# Only a running state is OK for now.
VALID_VM_STATES = [pvm_bp.LPARState.RUNNING]
def get_active_vioses(adapter, host_uuid, xag=None):
"""Returns a list of active Virtual I/O Server Wrappers for a host.
Active is defined by powered on and RMC state being 'active'.
:param adapter: The pypowervm adapter for the query.
:param host_uuid: The host servers UUID.
:param xag: Optional list of extended attributes to use. If not passed
in defaults to None.
:return: List of VIOS wrappers.
"""
vio_feed_resp = adapter.read(pvm_ms.System.schema_type, root_id=host_uuid,
child_type=pvm_vios.VIOS.schema_type,
xag=xag)
wrappers = pvm_vios.VIOS.wrap(vio_feed_resp)
return [vio for vio in wrappers if is_vios_active(vio)]
def is_vios_active(vios):
"""Returns a boolean to indicate if the VIOS is active.
Active is defined by running, and the RMC being 'active'.
:param vios: The Virtual I/O Server wrapper to validate.
:return: Boolean
"""
return (vios.rmc_state in VALID_RMC_STATES and
vios.state in VALID_VM_STATES)
def get_physical_wwpns(adapter, ms_uuid):
"""Returns the active WWPNs of the FC ports across all VIOSes on system."""
resp = adapter.read(pvm_ms.System.schema_type, root_id=ms_uuid,
child_type=pvm_vios.VIOS.schema_type,
xag=[pvm_vios.VIOS.xags.STORAGE])
vios_feed = pvm_vios.VIOS.wrap(resp)
wwpn_list = []
for vios in vios_feed:
wwpn_list.extend(vios.get_active_pfc_wwpns())
return wwpn_list
def build_tx_feed_task(adapter, host_uuid, name='vio_feed_mgr',
xag=[pvm_vios.VIOS.xags.STORAGE,
pvm_vios.VIOS.xags.SCSI_MAPPING,
pvm_vios.VIOS.xags.FC_MAPPING]):
"""Builds the pypowervm transaction FeedTask.
The transaction FeedTask enables users to collect a set of
'WrapperTasks' against a feed of entities (in this case a set of VIOSes).
The WrapperTask (within the FeedTask) handles lock and retry.
This is useful to batch together a set of updates across a feed of elements
(and multiple updates within a given wrapper). This allows for significant
performance improvements.
:param adapter: The pypowervm adapter for the query.
:param host_uuid: The host server's UUID.
:param name: (Optional) The name of the feed manager. Defaults to
vio_feed_mgr.
:param xag: (Optional) List of extended attributes to use. If not passed
in defaults to all storage options (as this is most common
case for using a transaction manager).
"""
return pvm_tx.FeedTask(name,
get_active_vioses(adapter, host_uuid, xag=xag))