[PTP dual NIC config] Capabilities in PTP tables

This change adds an extra field named "capabilities" to the PTP tables
for instances (services) and interfaces. The purpose of such fields is
to allow those PTP entities to store some metadata associated to them
but not recognized as a "parameter" (which in such case would be stored
in a corresponding entry at the PTP parameters table).

Test Plan:
PASS: Existing unit tests of the affected PTP tables.

Story: 2009248
Task: 43847
Signed-off-by: Douglas Henrique Koerich <douglashenrique.koerich@windriver.com>
Change-Id: I6eab9a2736688198906cec6c92612b9990b74529
This commit is contained in:
Douglas Henrique Koerich 2021-11-04 08:44:53 -03:00
parent c0003fd203
commit 5ef8d87fec
9 changed files with 65 additions and 9 deletions

View File

@ -6,6 +6,7 @@
import pecan
from pecan import rest
import six
import wsme
from wsme import types as wtypes
import wsmeext.pecan as wsme_pecan
@ -58,6 +59,10 @@ class PtpInstance(base.APIBase):
service = wtypes.Enum(str, 'ptp4l', 'phc2sys', 'ts2phc')
"Type of service of the PTP instance"
capabilities = {wtypes.text: utils.ValidTypes(wtypes.text,
six.integer_types)}
"Capabilities (metadata) of this PTP instance"
def __init__(self, **kwargs):
self.fields = list(objects.ptp_instance.fields.keys())
for k in self.fields:
@ -73,6 +78,7 @@ class PtpInstance(base.APIBase):
'host_uuid',
'name',
'service',
'capabilities',
'created_at'])
# do not expose the id attribute

View File

@ -8,6 +8,7 @@
import pecan
from pecan import rest
import six
from wsme import types as wtypes
import wsmeext.pecan as wsme_pecan
@ -62,6 +63,10 @@ class PtpInterface(base.APIBase):
ptp_instance_name = wtypes.text
"The name of the associated PTP instance"
capabilities = {wtypes.text: utils.ValidTypes(wtypes.text,
six.integer_types)}
"Capabilities (metadata) of this PTP interface"
created_at = wtypes.datetime.datetime
def __init__(self, **kwargs):
@ -82,6 +87,7 @@ class PtpInterface(base.APIBase):
'ptp_instance_name',
'ifname',
'interface_uuid',
'capabilities',
'created_at'])
return ptp_interface

View File

@ -1914,7 +1914,8 @@ class Connection(object):
{
'name': 'default',
'service': 'ptp4l',
'host': 'controller-0'
'host': 'controller-0',
'capabilities': { ... }
}
:returns: A PTP service instance.
"""
@ -1970,10 +1971,15 @@ class Connection(object):
"""Updates properties of a PTP instance.
:param ptp_instance_id: The id or uuid of a PTP instance.
:param values: May be a partial dict containing the items to update
{
'host': 'worker-0'
}
:param values: May be a partial list, eg. when setting the
properties for capabilities. For example:
{
'capabilities':
{
'my-field-1': val1,
'my-field-2': val2
}
}
:returns: A PTP service instance.
"""
@ -2001,6 +2007,7 @@ class Connection(object):
{
'interface_id': 101,
'ptp_instance_id': 10,
'capabilities': { ... }
}
:returns: A PTP interface association.
"""
@ -2099,7 +2106,23 @@ class Connection(object):
:param sort_key: Attribute by which results should be sorted
:param sort_dir: direction in which results should be sorted
(asc, desc)
:returns: A list of PTP interfaces with the given instance and interface.
:returns: A list of PTP interfaces with the given instance and
interface.
"""
def ptp_interface_update(self, ptp_interface_id, values):
"""Updates capabilities of a PTP interface.
:param ptp_interface_id: The id or uuid of a PTP interface.
:param values: May be a partial list. For example:
{
'capabilities':
{
'my-field-1': val1,
'my-field-2': val2
}
}
:returns: A PTP interface association.
"""
@abc.abstractmethod

View File

@ -3904,6 +3904,16 @@ class Connection(api.Connection):
return _paginate_query(models.PtpInterfaces, limit, marker,
sort_key, sort_dir, query)
@objects.objectify(objects.ptp_interface)
def ptp_interface_update(self, ptp_interface_id, values):
with _session_for_write() as session:
query = model_query(models.PtpInterfaces, session=session)
query = add_identity_filter(query, ptp_interface_id)
count = query.update(values, synchronize_session='fetch')
if count != 1:
raise exception.PtpInterfaceNotFound(uuid=ptp_interface_id)
return query.one()
def ptp_interface_destroy(self, ptp_interface_id):
with _session_for_write() as session:
query = model_query(models.PtpInterfaces, session=session)

View File

@ -12,7 +12,7 @@
# import uuid
# from datetime import datetime
from sqlalchemy import Integer, String, DateTime
from sqlalchemy import Integer, String, DateTime, Text
from sqlalchemy import Column, MetaData, Table, ForeignKey
from sysinv.db.sqlalchemy.models import UUID_LENGTH
@ -62,6 +62,7 @@ def upgrade(migrate_engine):
Column('host_id', Integer,
ForeignKey('i_host.id', ondelete="CASCADE")),
Column('capabilities', Text),
mysql_engine=ENGINE,
mysql_charset=CHARSET,
@ -83,6 +84,7 @@ def upgrade(migrate_engine):
ForeignKey('interfaces.id', ondelete="CASCADE")),
Column('ptp_instance_id', Integer,
ForeignKey('ptp_instances.id', ondelete="CASCADE")),
Column('capabilities', Text),
mysql_engine=ENGINE,
mysql_charset=CHARSET,

View File

@ -795,6 +795,9 @@ class PtpInstances(Base):
host_id = Column(Integer, ForeignKey('i_host.id', ondelete='CASCADE'),
nullable=True)
# capabilities not used yet: JSON{'':"", '':''}
capabilities = Column(JSONEncodedDict)
host = relationship("ihost", backref="ptp_instances", lazy="joined",
join_depth=1)
@ -810,6 +813,9 @@ class PtpInterfaces(Base):
ptp_instance_id = Column(Integer,
ForeignKey('ptp_instances.id', ondelete='CASCADE'))
# capabilities not used yet: JSON{'':"", '':''}
capabilities = Column(JSONEncodedDict)
interface = relationship("Interfaces", backref="ptp_interfaces",
lazy="joined", join_depth=1)
ptp_instance = relationship("PtpInstances", backref="ptp_interfaces",

View File

@ -23,7 +23,8 @@ class PtpInstance(base.SysinvObject):
'service': utils.str_or_none,
'host_uuid': utils.str_or_none,
'host_id': utils.int_or_none
'host_id': utils.int_or_none,
'capabilities': utils.dict_or_none
}
_foreign_fields = {

View File

@ -29,6 +29,7 @@ class PtpInterface(base.SysinvObject):
'ifname': utils.str_or_none,
'forihostid': utils.int_or_none,
'capabilities': utils.dict_or_none
}
_foreign_fields = {
@ -39,7 +40,6 @@ class PtpInterface(base.SysinvObject):
'ifname': 'interface:ifname',
'forihostid': 'interface:forihostid',
'ptp_instance_host': 'ptp_instance:host_id'
}
@base.remotable_classmethod

View File

@ -1998,6 +1998,7 @@ class TestMigrations(BaseMigrationTestCase, WalkVersionsMixin):
'name': 'String',
'service': 'String',
'host_id': 'Integer',
'capabilities': 'Text'
}
for column, column_type in ptp_instance_columns.items():
self.assertTrue(
@ -2013,6 +2014,7 @@ class TestMigrations(BaseMigrationTestCase, WalkVersionsMixin):
'uuid': 'String',
'interface_id': 'Integer',
'ptp_instance_id': 'Integer',
'capabilities': 'Text'
}
for column, column_type in ptp_interface_columns.items():
self.assertTrue(