187 lines
8.1 KiB
Python
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
|