Lin Yang 20780a2e0b Add delete method to base resource class
Change-Id: I0a60af9e1751e623e9e266141ab3d8db9d3d4691
2019-09-10 14:47:42 -07:00

218 lines
7.6 KiB
Python

# Copyright 2018 Intel, Inc.
# 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.
import jsonschema
import logging
from sushy.resources import base
from sushy import utils
from rsd_lib import base as rsd_lib_base
from rsd_lib import common as rsd_lib_common
from rsd_lib.resources.v2_4.fabric import endpoint_schemas
from rsd_lib import utils as rsd_lib_utils
LOG = logging.getLogger(__name__)
class IdentifiersField(base.ListField):
name_format = base.Field('DurableNameFormat')
name = base.Field('DurableName')
class PciIdField(base.ListField):
device_id = base.Field('DeviceId')
vendor_id = base.Field('VendorId')
subsystem_id = base.Field('SubsystemId')
subsystem_vendor_id = base.Field('SubsystemVendorId')
class ConnectedEntitiesField(base.ListField):
entity_type = base.Field('EntityType')
entity_role = base.Field('EntityRole')
entity_link = base.Field('EntityLink',
adapter=rsd_lib_utils.get_resource_identity)
identifiers = IdentifiersField('Identifiers')
entity_pci_id = PciIdField('EntityPciId')
pci_function_number = base.Field(
'PciFunctionNumber', adapter=rsd_lib_utils.num_or_none)
pci_class_code = base.Field('PciClassCode')
class LinksOemIntelRackScaleField(base.CompositeField):
zones = base.Field('Zones', adapter=utils.get_members_identities)
interfaces = base.Field('Interfaces', adapter=utils.get_members_identities)
class LinksOemField(base.CompositeField):
intel_rackscale = LinksOemIntelRackScaleField('Intel_RackScale')
class LinksField(base.CompositeField):
ports = base.Field('Ports', adapter=utils.get_members_identities)
endpoints = base.Field('Endpoints', adapter=utils.get_members_identities)
oem = LinksOemField('Oem')
class IPTransportDetailsField(base.ListField):
transport_protocol = base.Field('TransportProtocol')
ipv4_address = base.Field(['IPv4Address', 'Address'])
ipv6_address = base.Field(['IPv6Address', 'Address'])
port = base.Field('Port', adapter=rsd_lib_utils.num_or_none)
class AuthenticationField(base.CompositeField):
username = base.Field('Username')
password = base.Field('Password')
class OemIntelRackScaleField(base.CompositeField):
authentication = AuthenticationField('Authentication')
endpoint_protocol = base.Field('EndpointProtocol')
"""Protocol for endpoint (i.e. PCIe)"""
pcie_function = base.Field(
'PCIeFunction', adapter=rsd_lib_utils.get_resource_identity)
"""A reference to the PCIe function that provides this processor
functionality
"""
class OemField(base.CompositeField):
intel_rackscale = OemIntelRackScaleField('Intel_RackScale')
class Endpoint(rsd_lib_base.ResourceBase):
identity = base.Field('Id', required=True)
"""The endpoint identity string"""
name = base.Field('Name')
"""The endpoint name"""
description = base.Field('Description')
"""The endpoint description"""
endpoint_protocol = base.Field('EndpointProtocol')
"""Protocol for endpoint (i.e. PCIe)"""
connected_entities = ConnectedEntitiesField('ConnectedEntities')
"""Entities connected to endpoint"""
identifiers = IdentifiersField('Identifiers')
"""Identifiers for endpoint"""
status = rsd_lib_common.StatusField('Status')
"""The endpoint status"""
pci_id = PciIdField('PciId')
"""PCI ID of the endpoint"""
host_reservation_memory_bytes = base.Field('HostReservationMemoryBytes')
"""The amount of memory in bytes that the Host should allocate to connect
to this endpoint
"""
ip_transport_details = IPTransportDetailsField('IPTransportDetails')
"""IP transport details info of this endpoint"""
links = LinksField('Links')
"""These links to related components of this endpoint"""
oem = OemField('Oem')
"""The OEM additional info of this endpoint"""
class EndpointCollection(rsd_lib_base.ResourceCollectionBase):
@property
def _resource_type(self):
return Endpoint
def _create_endpoint_request(self, connected_entities, identifiers=None,
protocol=None, pci_id=None,
host_reservation_memory_bytes=None,
ip_transport_details=None, links=None,
oem=None):
request = {}
jsonschema.validate(connected_entities,
endpoint_schemas.connected_entities_req_schema)
request['ConnectedEntities'] = connected_entities
if identifiers is not None:
jsonschema.validate(identifiers,
endpoint_schemas.identifiers_req_schema)
request['Identifiers'] = identifiers
if protocol is not None:
jsonschema.validate(protocol, endpoint_schemas.protocol_req_schema)
request['EndpointProtocol'] = protocol
if pci_id is not None:
jsonschema.validate(pci_id, endpoint_schemas.pci_id_req_schema)
request['PciId'] = pci_id
if host_reservation_memory_bytes is not None:
jsonschema.validate(
host_reservation_memory_bytes,
endpoint_schemas.host_reservation_memory_bytes_req_schema)
request['HostReservationMemoryBytes'] = \
host_reservation_memory_bytes
if ip_transport_details is not None:
jsonschema.validate(
ip_transport_details,
endpoint_schemas.ip_transport_details_req_schema)
request['IPTransportDetails'] = ip_transport_details
if links is not None:
jsonschema.validate(links, endpoint_schemas.links_req_schema)
request['Links'] = links
if oem is not None:
jsonschema.validate(oem, endpoint_schemas.oem_req_schema)
request['Oem'] = oem
return request
def create_endpoint(self, connected_entities, identifiers=None,
protocol=None, pci_id=None,
host_reservation_memory_bytes=None,
ip_transport_details=None, links=None, oem=None):
"""Create a new endpoint
:param connected_entities: provides information about entities
connected to the endpoint
:param identifiers: provides iQN or NQN of created entity
:param protocol: the protocol used by the endpoint
:param pci_id: the PCI ID of the endpoint
:param ip_transport_details: the transport used for accessing the
endpoint
:param oem: the oem fields of this endpoint creation request
:returns: The uri of the new endpoint
"""
properties = self._create_endpoint_request(
connected_entities, identifiers, protocol, pci_id,
host_reservation_memory_bytes, ip_transport_details, links, oem)
resp = self._conn.post(self._path, data=properties)
LOG.info("Endpoint created at %s", resp.headers['Location'])
endpoint_url = resp.headers['Location']
return endpoint_url[endpoint_url.find(self._path):]