163 lines
4.9 KiB
Python
163 lines
4.9 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# Copyright 2012 IBM Corp.
|
|
#
|
|
# 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.
|
|
|
|
"""PowerVM Logical Partition (LPAR)
|
|
|
|
PowerVM LPAR configuration attributes.
|
|
"""
|
|
|
|
import shlex
|
|
|
|
from nova.openstack.common import log as logging
|
|
from nova.virt.powervm import exception
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
def load_from_conf_data(conf_data):
|
|
"""LPAR configuration data parser.
|
|
|
|
The configuration data is a string representation of
|
|
the attributes of a Logical Partition. The attributes
|
|
consists of name/value pairs, which are in command separated
|
|
value format.
|
|
Example format: name=lpar_name,lpar_id=1,lpar_env=aixlinux
|
|
|
|
:param conf_data: string containing the LPAR configuration data.
|
|
:returns: LPAR -- LPAR object.
|
|
"""
|
|
# config_data can contain comma separated values within
|
|
# double quotes, example: virtual_serial_adapters
|
|
# and virtual_scsi_adapters attributes. So can't simply
|
|
# split them by ','.
|
|
cf_splitter = shlex.shlex(conf_data, posix=True)
|
|
cf_splitter.whitespace = ','
|
|
cf_splitter.whitespace_split = True
|
|
attribs = dict(item.split("=") for item in list(cf_splitter))
|
|
lpar = LPAR()
|
|
for (key, value) in attribs.items():
|
|
try:
|
|
lpar[key] = value
|
|
except exception.PowerVMLPARAttributeNotFound:
|
|
LOG.info(_('Encountered unknown LPAR attribute: %s\n'
|
|
'Continuing without storing') % key)
|
|
return lpar
|
|
|
|
|
|
class LPAR(object):
|
|
|
|
"""
|
|
Simple class representing a logical partition and the attributes
|
|
for the partition and/or its selected profile.
|
|
"""
|
|
|
|
# Attributes for all logical partitions
|
|
LPAR_ATTRS = (
|
|
'name',
|
|
'lpar_id',
|
|
'lpar_env',
|
|
'state',
|
|
'resource_config',
|
|
'os_version',
|
|
'logical_serial_num',
|
|
'default_profile',
|
|
'profile_name',
|
|
'curr_profile',
|
|
'work_group_id',
|
|
'allow_perf_collection',
|
|
'power_ctrl_lpar_ids',
|
|
'boot_mode',
|
|
'lpar_keylock',
|
|
'auto_start',
|
|
'uptime',
|
|
'lpar_avail_priority',
|
|
'desired_lpar_proc_compat_mode',
|
|
'curr_lpar_proc_compat_mode',
|
|
'virtual_eth_mac_base_value',
|
|
'rmc_ipaddr'
|
|
)
|
|
|
|
# Logical partitions may contain one or more profiles, which
|
|
# may have the following attributes
|
|
LPAR_PROFILE_ATTRS = (
|
|
'name',
|
|
'lpar_name',
|
|
'lpar_id',
|
|
'os_type',
|
|
'all_resources',
|
|
'mem_mode',
|
|
'min_mem',
|
|
'desired_mem',
|
|
'max_mem',
|
|
'proc_mode',
|
|
'min_proc_units',
|
|
'desired_proc_units',
|
|
'max_proc_units',
|
|
'min_procs',
|
|
'desired_procs',
|
|
'max_procs',
|
|
'sharing_mode',
|
|
'uncap_weight',
|
|
'io_slots',
|
|
'lpar_io_pool_ids',
|
|
'max_virtual_slots',
|
|
'virtual_serial_adapters',
|
|
'virtual_scsi_adapters',
|
|
'virtual_eth_adapters',
|
|
'boot_mode',
|
|
'conn_monitoring',
|
|
'auto_start',
|
|
'power_ctrl_lpar_ids',
|
|
'lhea_logical_ports',
|
|
'lhea_capabilities',
|
|
'lpar_proc_compat_mode',
|
|
'virtual_fc_adapters'
|
|
)
|
|
|
|
def __init__(self, **kwargs):
|
|
self.attributes = dict([k, None] for k in self.LPAR_ATTRS)
|
|
self.profile_attributes = dict([k, None] for k
|
|
in self.LPAR_PROFILE_ATTRS)
|
|
self.attributes.update(kwargs)
|
|
self.profile_attributes.update(kwargs)
|
|
self.all_attrs = dict(self.attributes.items()
|
|
+ self.profile_attributes.items())
|
|
|
|
def __getitem__(self, key):
|
|
if key not in self.all_attrs.keys():
|
|
raise exception.PowerVMLPARAttributeNotFound(key)
|
|
return self.all_attrs.get(key)
|
|
|
|
def __setitem__(self, key, value):
|
|
if key not in self.all_attrs.keys():
|
|
raise exception.PowerVMLPARAttributeNotFound(key)
|
|
self.all_attrs[key] = value
|
|
|
|
def __delitem__(self, key):
|
|
if key not in self.all_attrs.keys():
|
|
raise exception.PowerVMLPARAttributeNotFound(key)
|
|
# We set to None instead of removing the key...
|
|
self.all_attrs[key] = None
|
|
|
|
def to_string(self, exclude_attribs=[]):
|
|
conf_data = []
|
|
for (key, value) in self.all_attrs.items():
|
|
if key in exclude_attribs or value is None:
|
|
continue
|
|
conf_data.append('%s=%s' % (key, value))
|
|
|
|
return ','.join(conf_data)
|