impuls/lib/python3.11/site-packages/openstack/baremetal/v1/driver.py

187 lines
8.1 KiB
Python

# 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 openstack.baremetal.v1 import _common
from openstack import exceptions
from openstack import resource
from openstack import utils
class Driver(resource.Resource):
resources_key = 'drivers'
base_path = '/drivers'
# capabilities
allow_create = False
allow_fetch = True
allow_commit = False
allow_delete = False
allow_list = True
_query_mapping = resource.QueryParameters(details='detail')
# The BIOS interface fields introduced in 1.40 (Rocky).
_max_microversion = '1.40'
#: A list of active hosts that support this driver.
hosts = resource.Body('hosts', type=list)
#: A list of relative links, including the self and bookmark links.
links = resource.Body('links', type=list)
#: The name of the driver
name = resource.Body('name', alternate_id=True)
#: A list of links to driver properties.
properties = resource.Body('properties', type=list)
# Hardware interface properties grouped together for convenience,
# available with detail=True.
#: Default BIOS interface implementation.
#: Introduced in API microversion 1.40.
default_bios_interface = resource.Body("default_bios_interface")
#: Default boot interface implementation.
#: Introduced in API microversion 1.30.
default_boot_interface = resource.Body("default_boot_interface")
#: Default console interface implementation.
#: Introduced in API microversion 1.30.
default_console_interface = resource.Body("default_console_interface")
#: Default deploy interface implementation.
#: Introduced in API microversion 1.30.
default_deploy_interface = resource.Body("default_deploy_interface")
#: Default inspect interface implementation.
#: Introduced in API microversion 1.30.
default_inspect_interface = resource.Body("default_inspect_interface")
#: Default management interface implementation.
#: Introduced in API microversion 1.30.
default_management_interface = resource.Body(
"default_management_interface"
)
#: Default network interface implementation.
#: Introduced in API microversion 1.30.
default_network_interface = resource.Body("default_network_interface")
#: Default port interface implementation.
#: Introduced in API microversion 1.30.
default_power_interface = resource.Body("default_power_interface")
#: Default RAID interface implementation.
#: Introduced in API microversion 1.30.
default_raid_interface = resource.Body("default_raid_interface")
#: Default rescue interface implementation.
#: Introduced in API microversion 1.38.
default_rescue_interface = resource.Body("default_rescue_interface")
#: Default storage interface implementation.
#: Introduced in API microversion 1.33.
default_storage_interface = resource.Body("default_storage_interface")
#: Default vendor interface implementation.
#: Introduced in API microversion 1.30.
default_vendor_interface = resource.Body("default_vendor_interface")
#: Enabled BIOS interface implementations.
#: Introduced in API microversion 1.40.
enabled_bios_interfaces = resource.Body("enabled_bios_interfaces")
#: Enabled boot interface implementations.
#: Introduced in API microversion 1.30.
enabled_boot_interfaces = resource.Body("enabled_boot_interfaces")
#: Enabled console interface implementations.
#: Introduced in API microversion 1.30.
enabled_console_interfaces = resource.Body("enabled_console_interfaces")
#: Enabled deploy interface implementations.
#: Introduced in API microversion 1.30.
enabled_deploy_interfaces = resource.Body("enabled_deploy_interfaces")
#: Enabled inspect interface implementations.
#: Introduced in API microversion 1.30.
enabled_inspect_interfaces = resource.Body("enabled_inspect_interfaces")
#: Enabled management interface implementations.
#: Introduced in API microversion 1.30.
enabled_management_interfaces = resource.Body(
"enabled_management_interfaces"
)
#: Enabled network interface implementations.
#: Introduced in API microversion 1.30.
enabled_network_interfaces = resource.Body("enabled_network_interfaces")
#: Enabled port interface implementations.
#: Introduced in API microversion 1.30.
enabled_power_interfaces = resource.Body("enabled_power_interfaces")
#: Enabled RAID interface implementations.
#: Introduced in API microversion 1.30.
enabled_raid_interfaces = resource.Body("enabled_raid_interfaces")
#: Enabled rescue interface implementations.
#: Introduced in API microversion 1.38.
enabled_rescue_interfaces = resource.Body("enabled_rescue_interfaces")
#: Enabled storage interface implementations.
#: Introduced in API microversion 1.33.
enabled_storage_interfaces = resource.Body("enabled_storage_interfaces")
#: Enabled vendor interface implementations.
#: Introduced in API microversion 1.30.
enabled_vendor_interfaces = resource.Body("enabled_vendor_interfaces")
def list_vendor_passthru(self, session):
"""Fetch vendor specific methods exposed by driver
:param session: The session to use for making this request.
:returns: A dict of the available vendor passthru methods for driver.
Method names keys and corresponding usages in dict form as values
Usage dict properties:
* ``async``: bool # Is passthru function invoked asynchronously
* ``attach``: bool # Is return value attached to response object
* ``description``: str # Description of what the method does
* ``http_methods``: list # List of HTTP methods supported
"""
session = self._get_session(session)
request = self._prepare_request()
request.url = utils.urljoin(request.url, 'vendor_passthru', 'methods')
response = session.get(request.url, headers=request.headers)
msg = "Failed to list list vendor_passthru methods for {driver_name}"
exceptions.raise_from_response(
response, error_message=msg.format(driver_name=self.name)
)
return response.json()
def call_vendor_passthru(
self, session, verb: str, method: str, body: dict = None
):
"""Call a vendor specific passthru method
Contents of body are params passed to the hardware driver
function. Validation happens there. Missing parameters, or
excess parameters will cause the request to be rejected
:param session: The session to use for making this request.
:param method: Vendor passthru method name.
:param verb: One of GET, POST, PUT, DELETE,
depending on the driver and method.
:param body: passed to the vendor function as json body.
:raises: :exc:`ValueError` if :data:`verb` is not one of
GET, POST, PUT, DELETE
:returns: response of method call.
"""
if verb.upper() not in ['GET', 'PUT', 'POST', 'DELETE']:
raise ValueError('Invalid verb: {}'.format(verb))
session = self._get_session(session)
request = self._prepare_request()
request.url = utils.urljoin(
request.url, f'vendor_passthru?method={method}'
)
call = getattr(session, verb.lower())
response = call(
request.url,
json=body,
headers=request.headers,
retriable_status_codes=_common.RETRIABLE_STATUS_CODES,
)
msg = "Failed call to method {method} on driver {driver_name}".format(
method=method, driver_name=self.name
)
exceptions.raise_from_response(response, error_message=msg)
return response