125 lines
4.4 KiB
Python
125 lines
4.4 KiB
Python
# Copyright 2017 Hewlett Packard Enterprise Development LP
|
|
#
|
|
# 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.
|
|
|
|
__author__ = 'HPE'
|
|
|
|
import collections
|
|
|
|
import six
|
|
|
|
from proliantutils import exception
|
|
from proliantutils.redfish.resources.system import constants as sys_cons
|
|
|
|
|
|
# Representation of supported boot modes
|
|
SupportedBootModes = collections.namedtuple(
|
|
'SupportedBootModes', ['boot_mode_bios', 'boot_mode_uefi'])
|
|
|
|
|
|
def get_subresource_path_by(resource, subresource_path):
|
|
"""Helper function to find the resource path
|
|
|
|
:param resource: ResourceBase instance from which the path is loaded.
|
|
:param subresource_path: JSON field to fetch the value from.
|
|
Either a string, or a list of strings in case of a nested field.
|
|
It should also include the '@odata.id'
|
|
:raises: MissingAttributeError, if required path is missing.
|
|
:raises: ValueError, if path is empty.
|
|
:raises: AttributeError, if json attr not found in resource
|
|
"""
|
|
if isinstance(subresource_path, six.string_types):
|
|
subresource_path = [subresource_path]
|
|
elif not subresource_path:
|
|
raise ValueError('"subresource_path" cannot be empty')
|
|
|
|
body = resource.json
|
|
for path_item in subresource_path:
|
|
body = body.get(path_item, {})
|
|
|
|
if not body:
|
|
raise exception.MissingAttributeError(
|
|
attribute='/'.join(subresource_path), resource=resource.path)
|
|
|
|
if '@odata.id' not in body:
|
|
raise exception.MissingAttributeError(
|
|
attribute='/'.join(subresource_path)+'/@odata.id',
|
|
resource=resource.path)
|
|
|
|
return body['@odata.id']
|
|
|
|
|
|
def get_supported_boot_mode(supported_boot_mode):
|
|
"""Return bios and uefi support.
|
|
|
|
:param supported_boot_mode: Supported boot modes
|
|
:return: A tuple of 'true'/'false' based on bios and uefi
|
|
support respectively.
|
|
"""
|
|
boot_mode_bios = 'false'
|
|
boot_mode_uefi = 'false'
|
|
if (supported_boot_mode ==
|
|
sys_cons.SUPPORTED_LEGACY_BIOS_ONLY):
|
|
boot_mode_bios = 'true'
|
|
elif (supported_boot_mode ==
|
|
sys_cons.SUPPORTED_UEFI_ONLY):
|
|
boot_mode_uefi = 'true'
|
|
elif (supported_boot_mode ==
|
|
sys_cons.SUPPORTED_LEGACY_BIOS_AND_UEFI):
|
|
boot_mode_bios = 'true'
|
|
boot_mode_uefi = 'true'
|
|
|
|
return SupportedBootModes(boot_mode_bios=boot_mode_bios,
|
|
boot_mode_uefi=boot_mode_uefi)
|
|
|
|
|
|
def get_allowed_operations(resource, subresouce_path):
|
|
"""Helper function to get the HTTP allowed methods.
|
|
|
|
:param resource: ResourceBase instance from which the path is loaded.
|
|
:param subresource_path: JSON field to fetch the value from.
|
|
Either a string, or a list of strings in case of a nested field.
|
|
:returns: A list of allowed HTTP methods.
|
|
"""
|
|
uri = get_subresource_path_by(resource, subresouce_path)
|
|
response = resource._conn.get(path=uri)
|
|
return response.headers['Allow']
|
|
|
|
|
|
def is_operation_allowed(method, resource, subresouce_path):
|
|
"""Checks whether the operation is allowed for the resource.
|
|
|
|
This method checks whether a HTTP method is allowed to be
|
|
performed on the given sub resource path.
|
|
:param method: A HTTP method. example: GET, PATCH, POST
|
|
:param resource: ResourceBase instance from which the path is loaded.
|
|
:param subresource_path: JSON field to fetch the value from.
|
|
Either a string, or a list of strings in case of a nested field.
|
|
:returns: True if the operation is allowed else False
|
|
"""
|
|
return method in get_allowed_operations(resource, subresouce_path)
|
|
|
|
|
|
def max_safe(iterable):
|
|
"""Creates a wrapper over python max() function.
|
|
|
|
This function is just a wrapper over pthon max().
|
|
It catches the exceptions and let max() return without any error.
|
|
"""
|
|
|
|
try:
|
|
return max(iterable)
|
|
except ValueError:
|
|
# The TypeError is not caught here as that should be thrown.
|
|
return 0
|